diff --git a/node_modules/sass/LICENSE b/node_modules/sass/LICENSE
new file mode 100644
index 0000000..74020b0
--- /dev/null
+++ b/node_modules/sass/LICENSE
@@ -0,0 +1,1102 @@
+Dart Sass license:
+
+Copyright (c) 2016, Google Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+--------------------------------------------------------------------------------
+
+Dart SDK license:
+
+Copyright 2012, the Dart project authors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+_fe_analyzer_shared, checked_yaml and package_config license:
+
+Copyright 2019, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+analyzer, args, intl and logging license:
+
+Copyright 2013, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+archive license:
+
+   Copyright 2013 Brendan Duncan
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   
+   
+Some code has been derived from the following projects:
+
+zlib/inflate:
+  JavaScript Zlib Library, https://github.com/imaya/zlib.js
+  The MIT License
+  Copyright (c) 2012 imaya
+
+zlib/deflate:
+  Java JZLib Library, http://www.jcraft.com/jzlib/
+  Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are met:
+  
+    1. Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+  
+    2. Redistributions in binary form must reproduce the above copyright 
+       notice, this list of conditions and the following disclaimer in 
+       the documentation and/or other materials provided with the distribution.
+  
+    3. The names of the authors may not be used to endorse or promote products
+       derived from this software without specific prior written permission.
+  
+  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
+  INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+bzip2:
+  This program, "bzip2", the associated library "libbzip2", and all
+  documentation, are copyright (C) 1996-2010 Julian R Seward.  All
+  rights reserved.
+  
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  
+  2. The origin of this software must not be misrepresented; you must 
+     not claim that you wrote the original software.  If you use this 
+     software in a product, an acknowledgment in the product 
+     documentation would be appreciated but is not required.
+  
+  3. Altered source versions must be plainly marked as such, and must
+     not be misrepresented as being the original software.
+  
+  4. The name of the author may not be used to endorse or promote 
+     products derived from this software without specific prior written 
+     permission.
+  
+  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  
+  Julian Seward, jseward@bzip.org
+  bzip2/libbzip2 version 1.0.6 of 6 September 2010
+
+
+
+--------------------------------------------------------------------------------
+
+async, cli_util, collection, convert, crypto, mime, package_resolver,
+shelf_static, source_map_stack_trace, stream_channel, typed_data and vm_service
+license:
+
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+boolean_selector, meta, shelf_packages_handler, test_descriptor and
+web_socket_channel license:
+
+Copyright 2016, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+charcode, dart_style, glob, http, http_multi_server, http_parser, matcher, path,
+pool, pub_semver, shelf, shelf_web_socket, source_maps, source_span,
+stack_trace, string_scanner, test, watcher and yaml license:
+
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+cli_pkg license:
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+--------------------------------------------------------------------------------
+
+cli_repl license:
+
+Copyright (c) 2018, Jennifer Thakar.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the project nor the names of its contributors may be
+      used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+coverage and quiver license:
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+--------------------------------------------------------------------------------
+
+file license:
+
+Copyright 2017, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------------
+
+grinder and webkit_inspection_protocol license:
+
+Copyright 2013, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+io, json_annotation, pedantic, stream_transform, term_glyph and test_process
+license:
+
+Copyright 2017, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+js license:
+
+Copyright 2012, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+mustache license:
+
+Copyright (c) 2013, Greg Lowe
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------------
+
+node_interop license:
+
+Copyright (c) 2017, Anatoly Pulyaevskiy.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the <organization> nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+node_io license:
+
+Copyright (c) 2018, Anatoly Pulyaevskiy.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the <organization> nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+node_preamble license:
+
+The MIT License (MIT)
+
+Copyright (c) 2015 Michael Bullington
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+===
+
+Copyright 2012, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+petitparser and xml license:
+
+The MIT License
+
+Copyright (c) 2006-2020 Lukas Renggli.
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+--------------------------------------------------------------------------------
+
+pubspec_parse, test_api and test_core license:
+
+Copyright 2018, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+
+tuple license:
+
+Copyright (c) 2014, the tuple project authors.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/node_modules/sass/README.md b/node_modules/sass/README.md
new file mode 100644
index 0000000..ea00125
--- /dev/null
+++ b/node_modules/sass/README.md
@@ -0,0 +1,206 @@
+A pure JavaScript implementation of [Sass][sass]. **Sass makes CSS fun again**.
+
+<table>
+  <tr>
+    <td>
+      <img width="118px" alt="Sass logo" src="https://rawgit.com/sass/sass-site/master/source/assets/img/logos/logo.svg" />
+    </td>
+    <td valign="middle">
+      <a href="https://www.npmjs.com/package/sass"><img width="100%" alt="npm statistics" src="https://nodei.co/npm/sass.png?downloads=true"></a>
+    </td>
+    <td valign="middle">
+      <a href="https://github.com/sass/dart-sass/actions"><img alt="GitHub actions build status" src="https://github.com/sass/dart-sass/workflows/CI/badge.svg"></a>
+      <br>
+      <a href="https://ci.appveyor.com/project/nex3/dart-sass"><img alt="Appveyor build status" src="https://ci.appveyor.com/api/projects/status/84rl9hvu8uoecgef?svg=true"></a>
+    </td>
+  </tr>
+</table>
+
+[sass]: https://sass-lang.com/
+
+This package is a distribution of [Dart Sass][], compiled to pure JavaScript
+with no native code or external dependencies. It provides a command-line `sass`
+executable and a Node.js API.
+
+[Dart Sass]: https://github.com/sass/dart-sass
+
+* [Usage](#usage)
+* [API](#api)
+* [See Also](#see-also)
+* [Behavioral Differences from Ruby Sass](#behavioral-differences-from-ruby-sass)
+
+## Usage
+
+You can install Sass globally using `npm install -g sass` which will provide
+access to the `sass` executable. You can also add it to your project using
+`npm install --save-dev sass`. This provides the executable as well as a
+library:
+
+[npm]: https://www.npmjs.com/package/sass
+
+```js
+var sass = require('sass');
+
+sass.render({file: scss_filename}, function(err, result) { /* ... */ });
+
+// OR
+
+var result = sass.renderSync({file: scss_filename});
+```
+
+[See below](#api) for details on Dart Sass's JavaScript API.
+
+## API
+
+When installed via npm, Dart Sass supports a JavaScript API that's fully
+compatible with [Node Sass][] (with a few exceptions listed below), with support
+for both the `render()` and `renderSync()` functions. See [the Sass
+website][js api] for full API documentation!
+
+[Node Sass]: https://github.com/sass/node-sass
+[js api]: https://sass-lang.com/documentation/js-api
+
+Note however that by default, **`renderSync()` is more than twice as fast as
+`render()`** due to the overhead of asynchronous callbacks. To avoid this
+performance hit, `render()` can use the [`fibers`][fibers] package to call
+asynchronous importers from the synchronous code path. To enable this, pass the
+`Fiber` class to the `fiber` option:
+
+[fibers]: https://www.npmjs.com/package/fibers
+
+```js
+var sass = require("sass");
+var Fiber = require("fibers");
+
+sass.render({
+  file: "input.scss",
+  importer: function(url, prev, done) {
+    // ...
+  },
+  fiber: Fiber
+}, function(err, result) {
+  // ...
+});
+```
+
+Both `render()` and `renderSync()` support the following options:
+
+* [`data`](https://github.com/sass/node-sass#data)
+* [`file`](https://github.com/sass/node-sass#file)
+* [`functions`](https://github.com/sass/node-sass#functions--v300---experimental)
+* [`importer`](https://github.com/sass/node-sass#importer--v200---experimental)
+* [`includePaths`](https://github.com/sass/node-sass#includepaths)
+* [`indentType`](https://github.com/sass/node-sass#indenttype)
+* [`indentWidth`](https://github.com/sass/node-sass#indentwidth)
+* [`indentedSyntax`](https://github.com/sass/node-sass#indentedsyntax)
+* [`linefeed`](https://github.com/sass/node-sass#linefeed)
+* [`omitSourceMapUrl`](https://github.com/sass/node-sass#omitsourcemapurl)
+* [`outFile`](https://github.com/sass/node-sass#outfile)
+* [`sourceMapContents`](https://github.com/sass/node-sass#sourcemapcontents)
+* [`sourceMapEmbed`](https://github.com/sass/node-sass#sourcemapembed)
+* [`sourceMapRoot`](https://github.com/sass/node-sass#sourcemaproot)
+* [`sourceMap`](https://github.com/sass/node-sass#sourcemap)
+* Only the `"expanded"` and `"compressed"` values of
+  [`outputStyle`](https://github.com/sass/node-sass#outputstyle) are supported.
+
+No support is intended for the following options:
+
+* [`precision`](https://github.com/sass/node-sass#precision). Dart Sass defaults
+  to a sufficiently high precision for all existing browsers, and making this
+  customizable would make the code substantially less efficient.
+
+* [`sourceComments`](https://github.com/sass/node-sass#sourcecomments). Source
+  maps are the recommended way of locating the origin of generated selectors.
+
+## See Also
+
+* [Dart Sass][], from which this package is compiled, can be used either as a
+  stand-alone executable or as a Dart library. Running Dart Sass on the Dart VM
+  is substantially faster than running the pure JavaScript version, so this may
+  be appropriate for performance-sensitive applications. The Dart API is also
+  (currently) more user-friendly than the JavaScript API. See
+  [the Dart Sass README][Using Dart Sass] for details on how to use it.
+
+* [Node Sass][], which is a wrapper around [LibSass][], the C++ implementation
+  of Sass. Node Sass supports the same API as this package and is also faster
+  (although it's usually a little slower than Dart Sass). However, it requires a
+  native library which may be difficult to install, and it's generally slower to
+  add features and fix bugs.
+
+[Using Dart Sass]: https://github.com/sass/dart-sass#using-dart-sass
+[Node Sass]: https://www.npmjs.com/package/node-sass
+[LibSass]: https://sass-lang.com/libsass
+
+## Behavioral Differences from Ruby Sass
+
+There are a few intentional behavioral differences between Dart Sass and Ruby
+Sass. These are generally places where Ruby Sass has an undesired behavior, and
+it's substantially easier to implement the correct behavior than it would be to
+implement compatible behavior. These should all have tracking bugs against Ruby
+Sass to update the reference behavior.
+
+1. `@extend` only accepts simple selectors, as does the second argument of
+   `selector-extend()`. See [issue 1599][].
+
+2. Subject selectors are not supported. See [issue 1126][].
+
+3. Pseudo selector arguments are parsed as `<declaration-value>`s rather than
+   having a more limited custom parsing. See [issue 2120][].
+
+4. The numeric precision is set to 10. See [issue 1122][].
+
+5. The indented syntax parser is more flexible: it doesn't require consistent
+   indentation across the whole document. See [issue 2176][].
+
+6. Colors do not support channel-by-channel arithmetic. See [issue 2144][].
+
+7. Unitless numbers aren't `==` to unit numbers with the same value. In
+   addition, map keys follow the same logic as `==`-equality. See
+   [issue 1496][].
+
+8. `rgba()` and `hsla()` alpha values with percentage units are interpreted as
+   percentages. Other units are forbidden. See [issue 1525][].
+
+9. Too many variable arguments passed to a function is an error. See
+   [issue 1408][].
+
+10. Allow `@extend` to reach outside a media query if there's an identical
+    `@extend` defined outside that query. This isn't tracked explicitly, because
+    it'll be irrelevant when [issue 1050][] is fixed.
+
+11. Some selector pseudos containing placeholder selectors will be compiled
+    where they wouldn't be in Ruby Sass. This better matches the semantics of
+    the selectors in question, and is more efficient. See [issue 2228][].
+
+12. The old-style `:property value` syntax is not supported in the indented
+    syntax. See [issue 2245][].
+
+13. The reference combinator is not supported. See [issue 303][].
+
+14. Universal selector unification is symmetrical. See [issue 2247][].
+
+15. `@extend` doesn't produce an error if it matches but fails to unify. See
+    [issue 2250][].
+
+16. Dart Sass currently only supports UTF-8 documents. We'd like to support
+    more, but Dart currently doesn't support them. See [dart-lang/sdk#11744][],
+    for example.
+
+[issue 1599]: https://github.com/sass/sass/issues/1599
+[issue 1126]: https://github.com/sass/sass/issues/1126
+[issue 2120]: https://github.com/sass/sass/issues/2120
+[issue 1122]: https://github.com/sass/sass/issues/1122
+[issue 2176]: https://github.com/sass/sass/issues/2176
+[issue 2144]: https://github.com/sass/sass/issues/2144
+[issue 1496]: https://github.com/sass/sass/issues/1496
+[issue 1525]: https://github.com/sass/sass/issues/1525
+[issue 1408]: https://github.com/sass/sass/issues/1408
+[issue 1050]: https://github.com/sass/sass/issues/1050
+[issue 2228]: https://github.com/sass/sass/issues/2228
+[issue 2245]: https://github.com/sass/sass/issues/2245
+[issue 303]: https://github.com/sass/sass/issues/303
+[issue 2247]: https://github.com/sass/sass/issues/2247
+[issue 2250]: https://github.com/sass/sass/issues/2250
+[dart-lang/sdk#11744]: https://github.com/dart-lang/sdk/issues/11744
+
+Disclaimer: this is not an official Google product.
diff --git a/node_modules/sass/package.json b/node_modules/sass/package.json
new file mode 100644
index 0000000..c37c1f4
--- /dev/null
+++ b/node_modules/sass/package.json
@@ -0,0 +1,61 @@
+{
+  "_from": "sass@^1.32.8",
+  "_id": "sass@1.32.8",
+  "_inBundle": false,
+  "_integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==",
+  "_location": "/sass",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "sass@^1.32.8",
+    "name": "sass",
+    "escapedName": "sass",
+    "rawSpec": "^1.32.8",
+    "saveSpec": null,
+    "fetchSpec": "^1.32.8"
+  },
+  "_requiredBy": [
+    "#DEV:/"
+  ],
+  "_resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz",
+  "_shasum": "f16a9abd8dc530add8834e506878a2808c037bdc",
+  "_spec": "sass@^1.32.8",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar",
+  "author": {
+    "name": "Natalie Weizenbaum",
+    "email": "nweiz@google.com",
+    "url": "https://github.com/nex3"
+  },
+  "bin": {
+    "sass": "sass.js"
+  },
+  "bugs": {
+    "url": "https://github.com/sass/dart-sass/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "chokidar": ">=2.0.0 <4.0.0"
+  },
+  "deprecated": false,
+  "description": "A pure JavaScript implementation of Sass.",
+  "engines": {
+    "node": ">=8.9.0"
+  },
+  "homepage": "https://github.com/sass/dart-sass",
+  "keywords": [
+    "style",
+    "scss",
+    "sass",
+    "preprocessor",
+    "css"
+  ],
+  "license": "MIT",
+  "main": "sass.dart.js",
+  "name": "sass",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sass/dart-sass.git"
+  },
+  "version": "1.32.8"
+}
diff --git a/node_modules/sass/sass.dart.js b/node_modules/sass/sass.dart.js
new file mode 100644
index 0000000..fc6b8b9
--- /dev/null
+++ b/node_modules/sass/sass.dart.js
@@ -0,0 +1,91802 @@
+// make sure to keep this as 'var'
+// we don't want block scoping
+
+var dartNodePreambleSelf = typeof global !== "undefined" ? global : window;
+
+var self = Object.create(dartNodePreambleSelf);
+
+self.scheduleImmediate = typeof setImmediate !== "undefined"
+    ? function (cb) {
+        setImmediate(cb);
+      }
+    : function(cb) {
+        setTimeout(cb, 0);
+      };
+
+// CommonJS globals.
+self.exports = exports;
+
+// Node.js specific exports, check to see if they exist & or polyfilled
+
+if (typeof process !== "undefined") {
+  self.process = process;
+}
+
+if (typeof __dirname !== "undefined") {
+  self.__dirname = __dirname;
+}
+
+if (typeof __filename !== "undefined") {
+  self.__filename = __filename;
+}
+
+if (typeof Buffer !== "undefined") {
+  self.Buffer = Buffer;
+}
+
+// if we're running in a browser, Dart supports most of this out of box
+// make sure we only run these in Node.js environment
+
+var dartNodeIsActuallyNode = !dartNodePreambleSelf.window
+
+try {
+  // Check if we're in a Web Worker instead.
+  if ("undefined" !== typeof WorkerGlobalScope && dartNodePreambleSelf instanceof WorkerGlobalScope) {
+    dartNodeIsActuallyNode = false;
+  }
+
+  // Check if we're in Electron, with Node.js integration, and override if true.
+  if ("undefined" !== typeof process && process.versions && process.versions.hasOwnProperty('electron') && process.versions.hasOwnProperty('node')) {
+    dartNodeIsActuallyNode = true;
+  }
+} catch(e) {}
+
+if (dartNodeIsActuallyNode) {
+  // This line is to:
+  // 1) Prevent Webpack from bundling.
+  // 2) In Webpack on Node.js, make sure we're using the native Node.js require, which is available via __non_webpack_require__
+  // https://github.com/mbullington/node_preamble.dart/issues/18#issuecomment-527305561
+  var url = ("undefined" !== typeof __webpack_require__ ? __non_webpack_require__ : require)("url");
+
+  self.location = {
+    get href() {
+      if (url.pathToFileURL) {
+        return url.pathToFileURL(process.cwd()).href + "/";
+      } else {
+        // This isn't really a correct transformation, but it's the best we have
+        // for versions of Node <10.12.0 which introduced `url.pathToFileURL()`.
+        // For example, it will fail for paths that contain characters that need
+        // to be escaped in URLs.
+        return "file://" + (function() {
+          var cwd = process.cwd();
+          if (process.platform != "win32") return cwd;
+          return "/" + cwd.replace(/\\/g, "/");
+        })() + "/"
+      }
+    }
+  };
+
+  (function() {
+    function computeCurrentScript() {
+      try {
+        throw new Error();
+      } catch(e) {
+        var stack = e.stack;
+        var re = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "mg");
+        var lastMatch = null;
+        do {
+          var match = re.exec(stack);
+          if (match != null) lastMatch = match;
+        } while (match != null);
+        return lastMatch[1];
+      }
+    }
+
+    var cachedCurrentScript = null;
+    self.document = {
+      get currentScript() {
+        if (cachedCurrentScript == null) {
+          cachedCurrentScript = {src: computeCurrentScript()};
+        }
+        return cachedCurrentScript;
+      }
+    };
+  })();
+
+  self.dartDeferredLibraryLoader = function(uri, successCallback, errorCallback) {
+    try {
+     load(uri);
+      successCallback();
+    } catch (error) {
+      errorCallback(error);
+    }
+  };
+}
+
+self.chokidar = require("chokidar");
+self.readline = require("readline");
+self.fs = require("fs");
+// Generated by dart2js (fast startup emitter, strong, trust primitives, omit checks, lax runtime type), the Dart to JavaScript compiler version: 2.10.5.
+// The code supports the following hooks:
+// dartPrint(message):
+//    if this function is defined it is called instead of the Dart [print]
+//    method.
+//
+// dartMainRunner(main, args):
+//    if this function is defined, the Dart [main] method will not be invoked
+//    directly. Instead, a closure that will invoke [main], and its arguments
+//    [args] is passed to [dartMainRunner].
+//
+// dartDeferredLibraryLoader(uri, successCallback, errorCallback):
+//    if this function is defined, it will be called when a deferred library
+//    is loaded. It should load and eval the javascript of `uri`, and call
+//    successCallback. If it fails to do so, it should call errorCallback with
+//    an error.
+//
+// dartCallInstrumentation(id, qualifiedName):
+//    if this function is defined, it will be called at each entry of a
+//    method or constructor. Used only when compiling programs with
+//    --experiment-call-instrumentation.
+(function dartProgram() {
+  function copyProperties(from, to) {
+    var keys = Object.keys(from);
+    for (var i = 0; i < keys.length; i++) {
+      var key = keys[i];
+      to[key] = from[key];
+    }
+  }
+  var supportsDirectProtoAccess = function() {
+    var cls = function() {
+    };
+    cls.prototype = {p: {}};
+    var object = new cls();
+    if (!(object.__proto__ && object.__proto__.p === cls.prototype.p))
+      return false;
+    try {
+      if (typeof navigator != "undefined" && typeof navigator.userAgent == "string" && navigator.userAgent.indexOf("Chrome/") >= 0)
+        return true;
+      if (typeof version == "function" && version.length == 0) {
+        var v = version();
+        if (/^\d+\.\d+\.\d+\.\d+$/.test(v))
+          return true;
+      }
+    } catch (_) {
+    }
+    return false;
+  }();
+  function setFunctionNamesIfNecessary(holders) {
+    function t() {
+    }
+    ;
+    if (typeof t.name == "string")
+      return;
+    for (var i = 0; i < holders.length; i++) {
+      var holder = holders[i];
+      var keys = Object.keys(holder);
+      for (var j = 0; j < keys.length; j++) {
+        var key = keys[j];
+        var f = holder[key];
+        if (typeof f == 'function')
+          f.name = key;
+      }
+    }
+  }
+  function inherit(cls, sup) {
+    cls.prototype.constructor = cls;
+    cls.prototype["$is" + cls.name] = cls;
+    if (sup != null) {
+      if (supportsDirectProtoAccess) {
+        cls.prototype.__proto__ = sup.prototype;
+        return;
+      }
+      var clsPrototype = Object.create(sup.prototype);
+      copyProperties(cls.prototype, clsPrototype);
+      cls.prototype = clsPrototype;
+    }
+  }
+  function inheritMany(sup, classes) {
+    for (var i = 0; i < classes.length; i++)
+      inherit(classes[i], sup);
+  }
+  function mixin(cls, mixin) {
+    copyProperties(mixin.prototype, cls.prototype);
+    cls.prototype.constructor = cls;
+  }
+  function lazyOld(holder, name, getterName, initializer) {
+    var uninitializedSentinel = holder;
+    holder[name] = uninitializedSentinel;
+    holder[getterName] = function() {
+      holder[getterName] = function() {
+        H.throwCyclicInit(name);
+      };
+      var result;
+      var sentinelInProgress = initializer;
+      try {
+        if (holder[name] === uninitializedSentinel) {
+          result = holder[name] = sentinelInProgress;
+          result = holder[name] = initializer();
+        } else
+          result = holder[name];
+      } finally {
+        if (result === sentinelInProgress)
+          holder[name] = null;
+        holder[getterName] = function() {
+          return this[name];
+        };
+      }
+      return result;
+    };
+  }
+  function lazy(holder, name, getterName, initializer) {
+    var uninitializedSentinel = holder;
+    holder[name] = uninitializedSentinel;
+    holder[getterName] = function() {
+      if (holder[name] === uninitializedSentinel)
+        holder[name] = initializer();
+      holder[getterName] = function() {
+        return this[name];
+      };
+      return holder[name];
+    };
+  }
+  function makeConstList(list) {
+    list.immutable$list = Array;
+    list.fixed$length = Array;
+    return list;
+  }
+  function convertToFastObject(properties) {
+    function t() {
+    }
+    t.prototype = properties;
+    new t();
+    return properties;
+  }
+  function convertAllToFastObject(arrayOfObjects) {
+    for (var i = 0; i < arrayOfObjects.length; ++i)
+      convertToFastObject(arrayOfObjects[i]);
+  }
+  var functionCounter = 0;
+  function tearOffGetter(funcs, applyTrampolineIndex, reflectionInfo, name, isIntercepted) {
+    return isIntercepted ? new Function("funcs", "applyTrampolineIndex", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(receiver) {" + "if (c === null) c = " + "H.closureFromTearOff" + "(" + "this, funcs, applyTrampolineIndex, reflectionInfo, false, true, name);" + "return new c(this, funcs[0], receiver, name);" + "}")(funcs, applyTrampolineIndex, reflectionInfo, name, H, null) : new Function("funcs", "applyTrampolineIndex", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = " + "H.closureFromTearOff" + "(" + "this, funcs, applyTrampolineIndex, reflectionInfo, false, false, name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, applyTrampolineIndex, reflectionInfo, name, H, null);
+  }
+  function tearOff(funcs, applyTrampolineIndex, reflectionInfo, isStatic, name, isIntercepted) {
+    var cache = null;
+    return isStatic ? function() {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, applyTrampolineIndex, reflectionInfo, true, false, name).prototype;
+      return cache;
+    } : tearOffGetter(funcs, applyTrampolineIndex, reflectionInfo, name, isIntercepted);
+  }
+  var typesOffset = 0;
+  function installTearOff(container, getterName, isStatic, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
+    var funs = [];
+    for (var i = 0; i < funsOrNames.length; i++) {
+      var fun = funsOrNames[i];
+      if (typeof fun == 'string')
+        fun = container[fun];
+      fun.$callName = callNames[i];
+      funs.push(fun);
+    }
+    var fun = funs[0];
+    fun.$requiredArgCount = requiredParameterCount;
+    fun.$defaultValues = optionalParameterDefaultValues;
+    var reflectionInfo = funType;
+    if (typeof reflectionInfo == "number")
+      reflectionInfo += typesOffset;
+    var name = funsOrNames[0];
+    fun.$stubName = name;
+    var getterFunction = tearOff(funs, applyIndex || 0, reflectionInfo, isStatic, name, isIntercepted);
+    container[getterName] = getterFunction;
+    if (isStatic)
+      fun.$tearOff = getterFunction;
+  }
+  function installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
+    return installTearOff(container, getterName, true, false, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex);
+  }
+  function installInstanceTearOff(container, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
+    return installTearOff(container, getterName, false, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex);
+  }
+  function setOrUpdateInterceptorsByTag(newTags) {
+    var tags = init.interceptorsByTag;
+    if (!tags) {
+      init.interceptorsByTag = newTags;
+      return;
+    }
+    copyProperties(newTags, tags);
+  }
+  function setOrUpdateLeafTags(newTags) {
+    var tags = init.leafTags;
+    if (!tags) {
+      init.leafTags = newTags;
+      return;
+    }
+    copyProperties(newTags, tags);
+  }
+  function updateTypes(newTypes) {
+    var types = init.types;
+    var length = types.length;
+    types.push.apply(types, newTypes);
+    return length;
+  }
+  function updateHolder(holder, newHolder) {
+    copyProperties(newHolder, holder);
+    return holder;
+  }
+  var hunkHelpers = function() {
+    var mkInstance = function(isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
+        return function(container, getterName, name, funType) {
+          return installInstanceTearOff(container, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex);
+        };
+      },
+      mkStatic = function(requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
+        return function(container, getterName, name, funType) {
+          return installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex);
+        };
+      };
+    return {inherit: inherit, inheritMany: inheritMany, mixin: mixin, installStaticTearOff: installStaticTearOff, installInstanceTearOff: installInstanceTearOff, _instance_0u: mkInstance(0, 0, null, ["call$0"], 0), _instance_1u: mkInstance(0, 1, null, ["call$1"], 0), _instance_2u: mkInstance(0, 2, null, ["call$2"], 0), _instance_0i: mkInstance(1, 0, null, ["call$0"], 0), _instance_1i: mkInstance(1, 1, null, ["call$1"], 0), _instance_2i: mkInstance(1, 2, null, ["call$2"], 0), _static_0: mkStatic(0, null, ["call$0"], 0), _static_1: mkStatic(1, null, ["call$1"], 0), _static_2: mkStatic(2, null, ["call$2"], 0), makeConstList: makeConstList, lazy: lazy, lazyOld: lazyOld, updateHolder: updateHolder, convertToFastObject: convertToFastObject, setFunctionNamesIfNecessary: setFunctionNamesIfNecessary, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
+  }();
+  function initializeDeferredHunk(hunk) {
+    typesOffset = init.types.length;
+    hunk(hunkHelpers, init, holders, $);
+  }
+  function getGlobalFromName(name) {
+    for (var i = 0; i < holders.length; i++) {
+      if (holders[i] == C)
+        continue;
+      if (holders[i][name])
+        return holders[i][name];
+    }
+  }
+  var C = {},
+  H = {JS_CONST: function JS_CONST() {
+    },
+    CastIterable_CastIterable: function(source, $S, $T) {
+      if ($S._eval$1("EfficientLengthIterable<0>")._is(source))
+        return new H._EfficientLengthCastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("_EfficientLengthCastIterable<1,2>"));
+      return new H.CastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("CastIterable<1,2>"));
+    },
+    LateInitializationErrorImpl$: function(_message) {
+      return new H.LateInitializationErrorImpl(_message);
+    },
+    hexDigitValue: function(char) {
+      var letter,
+        digit = char ^ 48;
+      if (digit <= 9)
+        return digit;
+      letter = char | 32;
+      if (97 <= letter && letter <= 102)
+        return letter - 87;
+      return -1;
+    },
+    SubListIterable$: function(_iterable, _start, _endOrLength, $E) {
+      P.RangeError_checkNotNegative(_start, "start");
+      if (_endOrLength != null) {
+        P.RangeError_checkNotNegative(_endOrLength, "end");
+        if (_start > _endOrLength)
+          H.throwExpression(P.RangeError$range(_start, 0, _endOrLength, "start", null));
+      }
+      return new H.SubListIterable(_iterable, _start, _endOrLength, $E._eval$1("SubListIterable<0>"));
+    },
+    MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
+      if (type$.EfficientLengthIterable_dynamic._is(iterable))
+        return new H.EfficientLengthMappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
+      return new H.MappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
+    },
+    TakeIterable_TakeIterable: function(iterable, takeCount, $E) {
+      var _s9_ = "takeCount";
+      P.ArgumentError_checkNotNull(takeCount, _s9_);
+      P.RangeError_checkNotNegative(takeCount, _s9_);
+      if (type$.EfficientLengthIterable_dynamic._is(iterable))
+        return new H.EfficientLengthTakeIterable(iterable, takeCount, $E._eval$1("EfficientLengthTakeIterable<0>"));
+      return new H.TakeIterable(iterable, takeCount, $E._eval$1("TakeIterable<0>"));
+    },
+    SkipIterable_SkipIterable: function(iterable, count, $E) {
+      var _s5_ = "count";
+      if (type$.EfficientLengthIterable_dynamic._is(iterable)) {
+        P.ArgumentError_checkNotNull(count, _s5_);
+        P.RangeError_checkNotNegative(count, _s5_);
+        return new H.EfficientLengthSkipIterable(iterable, count, $E._eval$1("EfficientLengthSkipIterable<0>"));
+      }
+      P.ArgumentError_checkNotNull(count, _s5_);
+      P.RangeError_checkNotNegative(count, _s5_);
+      return new H.SkipIterable(iterable, count, $E._eval$1("SkipIterable<0>"));
+    },
+    FollowedByIterable_FollowedByIterable$firstEfficient: function(first, second, $E) {
+      if ($E._eval$1("EfficientLengthIterable<0>")._is(second))
+        return new H.EfficientLengthFollowedByIterable(first, second, $E._eval$1("EfficientLengthFollowedByIterable<0>"));
+      return new H.FollowedByIterable(first, second, $E._eval$1("FollowedByIterable<0>"));
+    },
+    IterableElementError_noElement: function() {
+      return new P.StateError("No element");
+    },
+    IterableElementError_tooMany: function() {
+      return new P.StateError("Too many elements");
+    },
+    IterableElementError_tooFew: function() {
+      return new P.StateError("Too few elements");
+    },
+    Sort_sort: function(a, compare) {
+      H.Sort__doSort(a, 0, J.get$length$asx(a) - 1, compare);
+    },
+    Sort__doSort: function(a, left, right, compare) {
+      if (right - left <= 32)
+        H.Sort__insertionSort(a, left, right, compare);
+      else
+        H.Sort__dualPivotQuicksort(a, left, right, compare);
+    },
+    Sort__insertionSort: function(a, left, right, compare) {
+      var i, t1, el, j, j0;
+      for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
+        el = t1.$index(a, i);
+        j = i;
+        while (true) {
+          if (!(j > left && compare.call$2(t1.$index(a, j - 1), el) > 0))
+            break;
+          j0 = j - 1;
+          t1.$indexSet(a, j, t1.$index(a, j0));
+          j = j0;
+        }
+        t1.$indexSet(a, j, el);
+      }
+    },
+    Sort__dualPivotQuicksort: function(a, left, right, compare) {
+      var t0, less, great, k, ak, comp, great0, less0, pivots_are_equal, t2,
+        sixth = C.JSInt_methods._tdivFast$1(right - left + 1, 6),
+        index1 = left + sixth,
+        index5 = right - sixth,
+        index3 = C.JSInt_methods._tdivFast$1(left + right, 2),
+        index2 = index3 - sixth,
+        index4 = index3 + sixth,
+        t1 = J.getInterceptor$asx(a),
+        el1 = t1.$index(a, index1),
+        el2 = t1.$index(a, index2),
+        el3 = t1.$index(a, index3),
+        el4 = t1.$index(a, index4),
+        el5 = t1.$index(a, index5);
+      if (compare.call$2(el1, el2) > 0) {
+        t0 = el2;
+        el2 = el1;
+        el1 = t0;
+      }
+      if (compare.call$2(el4, el5) > 0) {
+        t0 = el5;
+        el5 = el4;
+        el4 = t0;
+      }
+      if (compare.call$2(el1, el3) > 0) {
+        t0 = el3;
+        el3 = el1;
+        el1 = t0;
+      }
+      if (compare.call$2(el2, el3) > 0) {
+        t0 = el3;
+        el3 = el2;
+        el2 = t0;
+      }
+      if (compare.call$2(el1, el4) > 0) {
+        t0 = el4;
+        el4 = el1;
+        el1 = t0;
+      }
+      if (compare.call$2(el3, el4) > 0) {
+        t0 = el4;
+        el4 = el3;
+        el3 = t0;
+      }
+      if (compare.call$2(el2, el5) > 0) {
+        t0 = el5;
+        el5 = el2;
+        el2 = t0;
+      }
+      if (compare.call$2(el2, el3) > 0) {
+        t0 = el3;
+        el3 = el2;
+        el2 = t0;
+      }
+      if (compare.call$2(el4, el5) > 0) {
+        t0 = el5;
+        el5 = el4;
+        el4 = t0;
+      }
+      t1.$indexSet(a, index1, el1);
+      t1.$indexSet(a, index3, el3);
+      t1.$indexSet(a, index5, el5);
+      t1.$indexSet(a, index2, t1.$index(a, left));
+      t1.$indexSet(a, index4, t1.$index(a, right));
+      less = left + 1;
+      great = right - 1;
+      if (J.$eq$(compare.call$2(el2, el4), 0)) {
+        for (k = less; k <= great; ++k) {
+          ak = t1.$index(a, k);
+          comp = compare.call$2(ak, el2);
+          if (comp === 0)
+            continue;
+          if (comp < 0) {
+            if (k !== less) {
+              t1.$indexSet(a, k, t1.$index(a, less));
+              t1.$indexSet(a, less, ak);
+            }
+            ++less;
+          } else
+            for (; true;) {
+              comp = compare.call$2(t1.$index(a, great), el2);
+              if (comp > 0) {
+                --great;
+                continue;
+              } else {
+                great0 = great - 1;
+                if (comp < 0) {
+                  t1.$indexSet(a, k, t1.$index(a, less));
+                  less0 = less + 1;
+                  t1.$indexSet(a, less, t1.$index(a, great));
+                  t1.$indexSet(a, great, ak);
+                  great = great0;
+                  less = less0;
+                  break;
+                } else {
+                  t1.$indexSet(a, k, t1.$index(a, great));
+                  t1.$indexSet(a, great, ak);
+                  great = great0;
+                  break;
+                }
+              }
+            }
+        }
+        pivots_are_equal = true;
+      } else {
+        for (k = less; k <= great; ++k) {
+          ak = t1.$index(a, k);
+          if (compare.call$2(ak, el2) < 0) {
+            if (k !== less) {
+              t1.$indexSet(a, k, t1.$index(a, less));
+              t1.$indexSet(a, less, ak);
+            }
+            ++less;
+          } else if (compare.call$2(ak, el4) > 0)
+            for (; true;)
+              if (compare.call$2(t1.$index(a, great), el4) > 0) {
+                --great;
+                if (great < k)
+                  break;
+                continue;
+              } else {
+                great0 = great - 1;
+                if (compare.call$2(t1.$index(a, great), el2) < 0) {
+                  t1.$indexSet(a, k, t1.$index(a, less));
+                  less0 = less + 1;
+                  t1.$indexSet(a, less, t1.$index(a, great));
+                  t1.$indexSet(a, great, ak);
+                  less = less0;
+                } else {
+                  t1.$indexSet(a, k, t1.$index(a, great));
+                  t1.$indexSet(a, great, ak);
+                }
+                great = great0;
+                break;
+              }
+        }
+        pivots_are_equal = false;
+      }
+      t2 = less - 1;
+      t1.$indexSet(a, left, t1.$index(a, t2));
+      t1.$indexSet(a, t2, el2);
+      t2 = great + 1;
+      t1.$indexSet(a, right, t1.$index(a, t2));
+      t1.$indexSet(a, t2, el4);
+      H.Sort__doSort(a, left, less - 2, compare);
+      H.Sort__doSort(a, great + 2, right, compare);
+      if (pivots_are_equal)
+        return;
+      if (less < index1 && great > index5) {
+        for (; J.$eq$(compare.call$2(t1.$index(a, less), el2), 0);)
+          ++less;
+        for (; J.$eq$(compare.call$2(t1.$index(a, great), el4), 0);)
+          --great;
+        for (k = less; k <= great; ++k) {
+          ak = t1.$index(a, k);
+          if (compare.call$2(ak, el2) === 0) {
+            if (k !== less) {
+              t1.$indexSet(a, k, t1.$index(a, less));
+              t1.$indexSet(a, less, ak);
+            }
+            ++less;
+          } else if (compare.call$2(ak, el4) === 0)
+            for (; true;)
+              if (compare.call$2(t1.$index(a, great), el4) === 0) {
+                --great;
+                if (great < k)
+                  break;
+                continue;
+              } else {
+                great0 = great - 1;
+                if (compare.call$2(t1.$index(a, great), el2) < 0) {
+                  t1.$indexSet(a, k, t1.$index(a, less));
+                  less0 = less + 1;
+                  t1.$indexSet(a, less, t1.$index(a, great));
+                  t1.$indexSet(a, great, ak);
+                  less = less0;
+                } else {
+                  t1.$indexSet(a, k, t1.$index(a, great));
+                  t1.$indexSet(a, great, ak);
+                }
+                great = great0;
+                break;
+              }
+        }
+        H.Sort__doSort(a, less, great, compare);
+      } else
+        H.Sort__doSort(a, less, great, compare);
+    },
+    _CastIterableBase: function _CastIterableBase() {
+    },
+    CastIterator: function CastIterator(t0, t1) {
+      this._source = t0;
+      this.$ti = t1;
+    },
+    CastIterable: function CastIterable(t0, t1) {
+      this._source = t0;
+      this.$ti = t1;
+    },
+    _EfficientLengthCastIterable: function _EfficientLengthCastIterable(t0, t1) {
+      this._source = t0;
+      this.$ti = t1;
+    },
+    _CastListBase: function _CastListBase() {
+    },
+    _CastListBase_sort_closure: function _CastListBase_sort_closure(t0, t1) {
+      this.$this = t0;
+      this.compare = t1;
+    },
+    CastList: function CastList(t0, t1) {
+      this._source = t0;
+      this.$ti = t1;
+    },
+    CastSet: function CastSet(t0, t1, t2) {
+      this._source = t0;
+      this._emptySet = t1;
+      this.$ti = t2;
+    },
+    CastQueue: function CastQueue(t0, t1) {
+      this._source = t0;
+      this.$ti = t1;
+    },
+    LateInitializationErrorImpl: function LateInitializationErrorImpl(t0) {
+      this.__internal$_message = t0;
+    },
+    CodeUnits: function CodeUnits(t0) {
+      this._string = t0;
+    },
+    EfficientLengthIterable: function EfficientLengthIterable() {
+    },
+    ListIterable: function ListIterable() {
+    },
+    SubListIterable: function SubListIterable(t0, t1, t2, t3) {
+      var _ = this;
+      _.__internal$_iterable = t0;
+      _._start = t1;
+      _._endOrLength = t2;
+      _.$ti = t3;
+    },
+    ListIterator: function ListIterator(t0, t1) {
+      var _ = this;
+      _.__internal$_iterable = t0;
+      _.__internal$_length = t1;
+      _.__internal$_index = 0;
+      _.__internal$_current = null;
+    },
+    MappedIterable: function MappedIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._f = t1;
+      this.$ti = t2;
+    },
+    EfficientLengthMappedIterable: function EfficientLengthMappedIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._f = t1;
+      this.$ti = t2;
+    },
+    MappedIterator: function MappedIterator(t0, t1) {
+      this.__internal$_current = null;
+      this._iterator = t0;
+      this._f = t1;
+    },
+    MappedListIterable: function MappedListIterable(t0, t1, t2) {
+      this._source = t0;
+      this._f = t1;
+      this.$ti = t2;
+    },
+    WhereIterable: function WhereIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._f = t1;
+      this.$ti = t2;
+    },
+    WhereIterator: function WhereIterator(t0, t1) {
+      this._iterator = t0;
+      this._f = t1;
+    },
+    ExpandIterable: function ExpandIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._f = t1;
+      this.$ti = t2;
+    },
+    ExpandIterator: function ExpandIterator(t0, t1, t2) {
+      var _ = this;
+      _._iterator = t0;
+      _._f = t1;
+      _._currentExpansion = t2;
+      _.__internal$_current = null;
+    },
+    TakeIterable: function TakeIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._takeCount = t1;
+      this.$ti = t2;
+    },
+    EfficientLengthTakeIterable: function EfficientLengthTakeIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._takeCount = t1;
+      this.$ti = t2;
+    },
+    TakeIterator: function TakeIterator(t0, t1) {
+      this._iterator = t0;
+      this._remaining = t1;
+    },
+    SkipIterable: function SkipIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._skipCount = t1;
+      this.$ti = t2;
+    },
+    EfficientLengthSkipIterable: function EfficientLengthSkipIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._skipCount = t1;
+      this.$ti = t2;
+    },
+    SkipIterator: function SkipIterator(t0, t1) {
+      this._iterator = t0;
+      this._skipCount = t1;
+    },
+    SkipWhileIterable: function SkipWhileIterable(t0, t1, t2) {
+      this.__internal$_iterable = t0;
+      this._f = t1;
+      this.$ti = t2;
+    },
+    SkipWhileIterator: function SkipWhileIterator(t0, t1) {
+      this._iterator = t0;
+      this._f = t1;
+      this._hasSkipped = false;
+    },
+    EmptyIterable: function EmptyIterable(t0) {
+      this.$ti = t0;
+    },
+    EmptyIterator: function EmptyIterator() {
+    },
+    FollowedByIterable: function FollowedByIterable(t0, t1, t2) {
+      this.__internal$_first = t0;
+      this._second = t1;
+      this.$ti = t2;
+    },
+    EfficientLengthFollowedByIterable: function EfficientLengthFollowedByIterable(t0, t1, t2) {
+      this.__internal$_first = t0;
+      this._second = t1;
+      this.$ti = t2;
+    },
+    FollowedByIterator: function FollowedByIterator(t0, t1) {
+      this._currentIterator = t0;
+      this._nextIterable = t1;
+    },
+    WhereTypeIterable: function WhereTypeIterable(t0, t1) {
+      this._source = t0;
+      this.$ti = t1;
+    },
+    WhereTypeIterator: function WhereTypeIterator(t0, t1) {
+      this._source = t0;
+      this.$ti = t1;
+    },
+    FixedLengthListMixin: function FixedLengthListMixin() {
+    },
+    UnmodifiableListMixin: function UnmodifiableListMixin() {
+    },
+    UnmodifiableListBase: function UnmodifiableListBase() {
+    },
+    ReversedListIterable: function ReversedListIterable(t0, t1) {
+      this._source = t0;
+      this.$ti = t1;
+    },
+    Symbol: function Symbol(t0) {
+      this.__internal$_name = t0;
+    },
+    __CastListBase__CastIterableBase_ListMixin: function __CastListBase__CastIterableBase_ListMixin() {
+    },
+    ConstantMap_ConstantMap$from: function(other, $K, $V) {
+      var allStrings, object, containsProto, protoValue, $length, k, v,
+        keys = P.List_List$from(other.get$keys(other), true, $K),
+        t1 = keys.length,
+        _i = 0;
+      while (true) {
+        if (!(_i < t1)) {
+          allStrings = true;
+          break;
+        }
+        if (typeof keys[_i] != "string") {
+          allStrings = false;
+          break;
+        }
+        ++_i;
+      }
+      if (allStrings) {
+        object = {};
+        for (containsProto = false, protoValue = null, $length = 0, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
+          k = keys[_i];
+          v = other.$index(0, k);
+          if (!J.$eq$(k, "__proto__")) {
+            H._asStringS(k);
+            if (!object.hasOwnProperty(k))
+              ++$length;
+            object[k] = v;
+          } else {
+            protoValue = v;
+            containsProto = true;
+          }
+        }
+        if (containsProto)
+          return new H.ConstantProtoMap(protoValue, $length + 1, object, keys, $K._eval$1("@<0>")._bind$1($V)._eval$1("ConstantProtoMap<1,2>"));
+        return new H.ConstantStringMap($length, object, keys, $K._eval$1("@<0>")._bind$1($V)._eval$1("ConstantStringMap<1,2>"));
+      }
+      return new H.ConstantMapView(P.LinkedHashMap_LinkedHashMap$from(other, $K, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("ConstantMapView<1,2>"));
+    },
+    ConstantMap__throwUnmodifiable: function() {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable Map"));
+    },
+    instantiate1: function(f, T1) {
+      var t1 = new H.Instantiation1(f, T1._eval$1("Instantiation1<0>"));
+      t1.Instantiation$1(f);
+      return t1;
+    },
+    unminifyOrTag: function(rawClassName) {
+      var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
+      if (preserved != null)
+        return preserved;
+      return rawClassName;
+    },
+    isJsIndexable: function(object, record) {
+      var result;
+      if (record != null) {
+        result = record.x;
+        if (result != null)
+          return result;
+      }
+      return type$.JavaScriptIndexingBehavior_dynamic._is(object);
+    },
+    S: function(value) {
+      var res;
+      if (typeof value == "string")
+        return value;
+      if (typeof value == "number") {
+        if (value !== 0)
+          return "" + value;
+      } else if (true === value)
+        return "true";
+      else if (false === value)
+        return "false";
+      else if (value == null)
+        return "null";
+      res = J.toString$0$(value);
+      if (typeof res != "string")
+        throw H.wrapException(H.argumentErrorValue(value));
+      return res;
+    },
+    Primitives_objectHashCode: function(object) {
+      var hash = object.$identityHash;
+      if (hash == null) {
+        hash = Math.random() * 0x3fffffff | 0;
+        object.$identityHash = hash;
+      }
+      return hash;
+    },
+    Primitives_parseInt: function(source, radix) {
+      var match, decimalMatch, maxCharCode, digitsPart, t1, i, _null = null;
+      if (typeof source != "string")
+        H.throwExpression(H.argumentErrorValue(source));
+      match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
+      if (match == null)
+        return _null;
+      decimalMatch = match[3];
+      if (radix == null) {
+        if (decimalMatch != null)
+          return parseInt(source, 10);
+        if (match[2] != null)
+          return parseInt(source, 16);
+        return _null;
+      }
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$range(radix, 2, 36, "radix", _null));
+      if (radix === 10 && decimalMatch != null)
+        return parseInt(source, 10);
+      if (radix < 10 || decimalMatch == null) {
+        maxCharCode = radix <= 10 ? 47 + radix : 86 + radix;
+        digitsPart = match[1];
+        for (t1 = digitsPart.length, i = 0; i < t1; ++i)
+          if ((C.JSString_methods._codeUnitAt$1(digitsPart, i) | 32) > maxCharCode)
+            return _null;
+      }
+      return parseInt(source, radix);
+    },
+    Primitives_parseDouble: function(source) {
+      var result, trimmed;
+      if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source))
+        return null;
+      result = parseFloat(source);
+      if (isNaN(result)) {
+        trimmed = C.JSString_methods.trim$0(source);
+        if (trimmed === "NaN" || trimmed === "+NaN" || trimmed === "-NaN")
+          return result;
+        return null;
+      }
+      return result;
+    },
+    Primitives_objectTypeName: function(object) {
+      return H.Primitives__objectTypeNameNewRti(object);
+    },
+    Primitives__objectTypeNameNewRti: function(object) {
+      var dispatchName, $constructor, constructorName;
+      if (object instanceof P.Object)
+        return H._rtiToString(H.instanceType(object), null);
+      if (J.getInterceptor$(object) === C.Interceptor_methods || type$.UnknownJavaScriptObject._is(object)) {
+        dispatchName = C.C_JS_CONST(object);
+        if (H.Primitives__saneNativeClassName(dispatchName))
+          return dispatchName;
+        $constructor = object.constructor;
+        if (typeof $constructor == "function") {
+          constructorName = $constructor.name;
+          if (typeof constructorName == "string" && H.Primitives__saneNativeClassName(constructorName))
+            return constructorName;
+        }
+      }
+      return H._rtiToString(H.instanceType(object), null);
+    },
+    Primitives__saneNativeClassName: function($name) {
+      var t1 = $name !== "Object" && $name !== "";
+      return t1;
+    },
+    Primitives_currentUri: function() {
+      if (!!self.location)
+        return self.location.href;
+      return null;
+    },
+    Primitives__fromCharCodeApply: function(array) {
+      var result, i, i0, chunkEnd,
+        end = array.length;
+      if (end <= 500)
+        return String.fromCharCode.apply(null, array);
+      for (result = "", i = 0; i < end; i = i0) {
+        i0 = i + 500;
+        chunkEnd = i0 < end ? i0 : end;
+        result += String.fromCharCode.apply(null, array.slice(i, chunkEnd));
+      }
+      return result;
+    },
+    Primitives_stringFromCodePoints: function(codePoints) {
+      var t1, _i, i,
+        a = H.setRuntimeTypeInfo([], type$.JSArray_int);
+      for (t1 = codePoints.length, _i = 0; _i < codePoints.length; codePoints.length === t1 || (0, H.throwConcurrentModificationError)(codePoints), ++_i) {
+        i = codePoints[_i];
+        if (!H._isInt(i))
+          throw H.wrapException(H.argumentErrorValue(i));
+        if (i <= 65535)
+          a.push(i);
+        else if (i <= 1114111) {
+          a.push(55296 + (C.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
+          a.push(56320 + (i & 1023));
+        } else
+          throw H.wrapException(H.argumentErrorValue(i));
+      }
+      return H.Primitives__fromCharCodeApply(a);
+    },
+    Primitives_stringFromCharCodes: function(charCodes) {
+      var t1, _i, i;
+      for (t1 = charCodes.length, _i = 0; _i < t1; ++_i) {
+        i = charCodes[_i];
+        if (!H._isInt(i))
+          throw H.wrapException(H.argumentErrorValue(i));
+        if (i < 0)
+          throw H.wrapException(H.argumentErrorValue(i));
+        if (i > 65535)
+          return H.Primitives_stringFromCodePoints(charCodes);
+      }
+      return H.Primitives__fromCharCodeApply(charCodes);
+    },
+    Primitives_stringFromNativeUint8List: function(charCodes, start, end) {
+      var i, result, i0, chunkEnd;
+      if (end <= 500 && start === 0 && end === charCodes.length)
+        return String.fromCharCode.apply(null, charCodes);
+      for (i = start, result = ""; i < end; i = i0) {
+        i0 = i + 500;
+        chunkEnd = i0 < end ? i0 : end;
+        result += String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
+      }
+      return result;
+    },
+    Primitives_stringFromCharCode: function(charCode) {
+      var bits;
+      if (0 <= charCode) {
+        if (charCode <= 65535)
+          return String.fromCharCode(charCode);
+        if (charCode <= 1114111) {
+          bits = charCode - 65536;
+          return String.fromCharCode((55296 | C.JSInt_methods._shrOtherPositive$1(bits, 10)) >>> 0, 56320 | bits & 1023);
+        }
+      }
+      throw H.wrapException(P.RangeError$range(charCode, 0, 1114111, null, null));
+    },
+    Primitives_lazyAsJsDate: function(receiver) {
+      if (receiver.date === void 0)
+        receiver.date = new Date(receiver._value);
+      return receiver.date;
+    },
+    Primitives_getYear: function(receiver) {
+      var t1 = H.Primitives_lazyAsJsDate(receiver).getFullYear() + 0;
+      return t1;
+    },
+    Primitives_getMonth: function(receiver) {
+      var t1 = H.Primitives_lazyAsJsDate(receiver).getMonth() + 1;
+      return t1;
+    },
+    Primitives_getDay: function(receiver) {
+      var t1 = H.Primitives_lazyAsJsDate(receiver).getDate() + 0;
+      return t1;
+    },
+    Primitives_getHours: function(receiver) {
+      var t1 = H.Primitives_lazyAsJsDate(receiver).getHours() + 0;
+      return t1;
+    },
+    Primitives_getMinutes: function(receiver) {
+      var t1 = H.Primitives_lazyAsJsDate(receiver).getMinutes() + 0;
+      return t1;
+    },
+    Primitives_getSeconds: function(receiver) {
+      var t1 = H.Primitives_lazyAsJsDate(receiver).getSeconds() + 0;
+      return t1;
+    },
+    Primitives_getMilliseconds: function(receiver) {
+      var t1 = H.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
+      return t1;
+    },
+    Primitives_functionNoSuchMethod: function($function, positionalArguments, namedArguments) {
+      var $arguments, namedArgumentList, t1 = {};
+      t1.argumentCount = 0;
+      $arguments = [];
+      namedArgumentList = [];
+      t1.argumentCount = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+      t1.names = "";
+      if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments))
+        namedArguments.forEach$1(0, new H.Primitives_functionNoSuchMethod_closure(t1, namedArgumentList, $arguments));
+      "" + t1.argumentCount;
+      return J.noSuchMethod$1$($function, new H.JSInvocationMirror(C.Symbol_call, 0, $arguments, namedArgumentList, 0));
+    },
+    Primitives_applyFunction: function($function, positionalArguments, namedArguments) {
+      var t1, $arguments, argumentCount, jsStub;
+      if (positionalArguments instanceof Array)
+        t1 = namedArguments == null || namedArguments.get$isEmpty(namedArguments);
+      else
+        t1 = false;
+      if (t1) {
+        $arguments = positionalArguments;
+        argumentCount = $arguments.length;
+        if (argumentCount === 0) {
+          if (!!$function.call$0)
+            return $function.call$0();
+        } else if (argumentCount === 1) {
+          if (!!$function.call$1)
+            return $function.call$1($arguments[0]);
+        } else if (argumentCount === 2) {
+          if (!!$function.call$2)
+            return $function.call$2($arguments[0], $arguments[1]);
+        } else if (argumentCount === 3) {
+          if (!!$function.call$3)
+            return $function.call$3($arguments[0], $arguments[1], $arguments[2]);
+        } else if (argumentCount === 4) {
+          if (!!$function.call$4)
+            return $function.call$4($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
+        } else if (argumentCount === 5)
+          if (!!$function.call$5)
+            return $function.call$5($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4]);
+        jsStub = $function["call" + "$" + argumentCount];
+        if (jsStub != null)
+          return jsStub.apply($function, $arguments);
+      }
+      return H.Primitives__genericApplyFunction2($function, positionalArguments, namedArguments);
+    },
+    Primitives__genericApplyFunction2: function($function, positionalArguments, namedArguments) {
+      var $arguments, argumentCount, requiredParameterCount, defaultValuesClosure, t1, defaultValues, interceptor, jsFunction, keys, _i, defaultValue, used, t2;
+      if (positionalArguments != null)
+        $arguments = positionalArguments instanceof Array ? positionalArguments : P.List_List$from(positionalArguments, true, type$.dynamic);
+      else
+        $arguments = [];
+      argumentCount = $arguments.length;
+      requiredParameterCount = $function.$requiredArgCount;
+      if (argumentCount < requiredParameterCount)
+        return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+      defaultValuesClosure = $function.$defaultValues;
+      t1 = defaultValuesClosure == null;
+      defaultValues = !t1 ? defaultValuesClosure() : null;
+      interceptor = J.getInterceptor$($function);
+      jsFunction = interceptor["call*"];
+      if (typeof jsFunction == "string")
+        jsFunction = interceptor[jsFunction];
+      if (t1) {
+        if (namedArguments != null && namedArguments.get$isNotEmpty(namedArguments))
+          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+        if (argumentCount === requiredParameterCount)
+          return jsFunction.apply($function, $arguments);
+        return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+      }
+      if (defaultValues instanceof Array) {
+        if (namedArguments != null && namedArguments.get$isNotEmpty(namedArguments))
+          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+        if (argumentCount > requiredParameterCount + defaultValues.length)
+          return H.Primitives_functionNoSuchMethod($function, $arguments, null);
+        C.JSArray_methods.addAll$1($arguments, defaultValues.slice(argumentCount - requiredParameterCount));
+        return jsFunction.apply($function, $arguments);
+      } else {
+        if (argumentCount > requiredParameterCount)
+          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+        keys = Object.keys(defaultValues);
+        if (namedArguments == null)
+          for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
+            defaultValue = defaultValues[keys[_i]];
+            if (C.C__Required === defaultValue)
+              return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+            C.JSArray_methods.add$1($arguments, defaultValue);
+          }
+        else {
+          for (t1 = keys.length, used = 0, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
+            t2 = keys[_i];
+            if (namedArguments.containsKey$1(t2)) {
+              ++used;
+              C.JSArray_methods.add$1($arguments, namedArguments.$index(0, t2));
+            } else {
+              defaultValue = defaultValues[t2];
+              if (C.C__Required === defaultValue)
+                return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+              C.JSArray_methods.add$1($arguments, defaultValue);
+            }
+          }
+          if (used !== namedArguments.get$length(namedArguments))
+            return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+        }
+        return jsFunction.apply($function, $arguments);
+      }
+    },
+    diagnoseIndexError: function(indexable, index) {
+      var $length, _s5_ = "index";
+      if (!H._isInt(index))
+        return new P.ArgumentError(true, index, _s5_, null);
+      $length = J.get$length$asx(indexable);
+      if (index < 0 || index >= $length)
+        return P.IndexError$(index, indexable, _s5_, null, $length);
+      return P.RangeError$value(index, _s5_, null);
+    },
+    diagnoseRangeError: function(start, end, $length) {
+      if (start < 0 || start > $length)
+        return P.RangeError$range(start, 0, $length, "start", null);
+      if (end != null)
+        if (end < start || end > $length)
+          return P.RangeError$range(end, start, $length, "end", null);
+      return new P.ArgumentError(true, end, "end", null);
+    },
+    argumentErrorValue: function(object) {
+      return new P.ArgumentError(true, object, null, null);
+    },
+    checkNum: function(value) {
+      if (typeof value != "number")
+        throw H.wrapException(H.argumentErrorValue(value));
+      return value;
+    },
+    wrapException: function(ex) {
+      var wrapper, t1;
+      if (ex == null)
+        ex = new P.NullThrownError();
+      wrapper = new Error();
+      wrapper.dartException = ex;
+      t1 = H.toStringWrapper;
+      if ("defineProperty" in Object) {
+        Object.defineProperty(wrapper, "message", {get: t1});
+        wrapper.name = "";
+      } else
+        wrapper.toString = t1;
+      return wrapper;
+    },
+    toStringWrapper: function() {
+      return J.toString$0$(this.dartException);
+    },
+    throwExpression: function(ex) {
+      throw H.wrapException(ex);
+    },
+    throwConcurrentModificationError: function(collection) {
+      throw H.wrapException(P.ConcurrentModificationError$(collection));
+    },
+    TypeErrorDecoder_extractPattern: function(message) {
+      var match, $arguments, argumentsExpr, expr, method, receiver;
+      message = H.quoteStringForRegExp(message.replace(String({}), '$receiver$'));
+      match = message.match(/\\\$[a-zA-Z]+\\\$/g);
+      if (match == null)
+        match = H.setRuntimeTypeInfo([], type$.JSArray_String);
+      $arguments = match.indexOf("\\$arguments\\$");
+      argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
+      expr = match.indexOf("\\$expr\\$");
+      method = match.indexOf("\\$method\\$");
+      receiver = match.indexOf("\\$receiver\\$");
+      return new H.TypeErrorDecoder(message.replace(new RegExp('\\\\\\$arguments\\\\\\$', 'g'), '((?:x|[^x])*)').replace(new RegExp('\\\\\\$argumentsExpr\\\\\\$', 'g'), '((?:x|[^x])*)').replace(new RegExp('\\\\\\$expr\\\\\\$', 'g'), '((?:x|[^x])*)').replace(new RegExp('\\\\\\$method\\\\\\$', 'g'), '((?:x|[^x])*)').replace(new RegExp('\\\\\\$receiver\\\\\\$', 'g'), '((?:x|[^x])*)'), $arguments, argumentsExpr, expr, method, receiver);
+    },
+    TypeErrorDecoder_provokeCallErrorOn: function(expression) {
+      return function($expr$) {
+        var $argumentsExpr$ = '$arguments$';
+        try {
+          $expr$.$method$($argumentsExpr$);
+        } catch (e) {
+          return e.message;
+        }
+      }(expression);
+    },
+    TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
+      return function($expr$) {
+        try {
+          $expr$.$method$;
+        } catch (e) {
+          return e.message;
+        }
+      }(expression);
+    },
+    NullError$: function(_message, match) {
+      return new H.NullError(_message, match == null ? null : match.method);
+    },
+    JsNoSuchMethodError$: function(_message, match) {
+      var t1 = match == null,
+        t2 = t1 ? null : match.method;
+      return new H.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
+    },
+    unwrapException: function(ex) {
+      if (ex == null)
+        return new H.NullThrownFromJavaScriptException(ex);
+      if (ex instanceof H.ExceptionAndStackTrace)
+        return H.saveStackTrace(ex, ex.dartException);
+      if (typeof ex !== "object")
+        return ex;
+      if ("dartException" in ex)
+        return H.saveStackTrace(ex, ex.dartException);
+      return H._unwrapNonDartException(ex);
+    },
+    saveStackTrace: function(ex, error) {
+      if (type$.Error._is(error))
+        if (error.$thrownJsError == null)
+          error.$thrownJsError = ex;
+      return error;
+    },
+    _unwrapNonDartException: function(ex) {
+      var message, number, ieErrorCode, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match, t1, _null = null;
+      if (!("message" in ex))
+        return ex;
+      message = ex.message;
+      if ("number" in ex && typeof ex.number == "number") {
+        number = ex.number;
+        ieErrorCode = number & 65535;
+        if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
+          switch (ieErrorCode) {
+            case 438:
+              return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
+            case 445:
+            case 5007:
+              return H.saveStackTrace(ex, H.NullError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
+          }
+      }
+      if (ex instanceof TypeError) {
+        nsme = $.$get$TypeErrorDecoder_noSuchMethodPattern();
+        notClosure = $.$get$TypeErrorDecoder_notClosurePattern();
+        nullCall = $.$get$TypeErrorDecoder_nullCallPattern();
+        nullLiteralCall = $.$get$TypeErrorDecoder_nullLiteralCallPattern();
+        undefCall = $.$get$TypeErrorDecoder_undefinedCallPattern();
+        undefLiteralCall = $.$get$TypeErrorDecoder_undefinedLiteralCallPattern();
+        nullProperty = $.$get$TypeErrorDecoder_nullPropertyPattern();
+        $.$get$TypeErrorDecoder_nullLiteralPropertyPattern();
+        undefProperty = $.$get$TypeErrorDecoder_undefinedPropertyPattern();
+        undefLiteralProperty = $.$get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
+        match = nsme.matchTypeError$1(message);
+        if (match != null)
+          return H.saveStackTrace(ex, H.JsNoSuchMethodError$(message, match));
+        else {
+          match = notClosure.matchTypeError$1(message);
+          if (match != null) {
+            match.method = "call";
+            return H.saveStackTrace(ex, H.JsNoSuchMethodError$(message, match));
+          } else {
+            match = nullCall.matchTypeError$1(message);
+            if (match == null) {
+              match = nullLiteralCall.matchTypeError$1(message);
+              if (match == null) {
+                match = undefCall.matchTypeError$1(message);
+                if (match == null) {
+                  match = undefLiteralCall.matchTypeError$1(message);
+                  if (match == null) {
+                    match = nullProperty.matchTypeError$1(message);
+                    if (match == null) {
+                      match = nullLiteralCall.matchTypeError$1(message);
+                      if (match == null) {
+                        match = undefProperty.matchTypeError$1(message);
+                        if (match == null) {
+                          match = undefLiteralProperty.matchTypeError$1(message);
+                          t1 = match != null;
+                        } else
+                          t1 = true;
+                      } else
+                        t1 = true;
+                    } else
+                      t1 = true;
+                  } else
+                    t1 = true;
+                } else
+                  t1 = true;
+              } else
+                t1 = true;
+            } else
+              t1 = true;
+            if (t1)
+              return H.saveStackTrace(ex, H.NullError$(message, match));
+          }
+        }
+        return H.saveStackTrace(ex, new H.UnknownJsTypeError(typeof message == "string" ? message : ""));
+      }
+      if (ex instanceof RangeError) {
+        if (typeof message == "string" && message.indexOf("call stack") !== -1)
+          return new P.StackOverflowError();
+        message = function(ex) {
+          try {
+            return String(ex);
+          } catch (e) {
+          }
+          return null;
+        }(ex);
+        return H.saveStackTrace(ex, new P.ArgumentError(false, _null, _null, typeof message == "string" ? message.replace(/^RangeError:\s*/, "") : message));
+      }
+      if (typeof InternalError == "function" && ex instanceof InternalError)
+        if (typeof message == "string" && message === "too much recursion")
+          return new P.StackOverflowError();
+      return ex;
+    },
+    getTraceFromException: function(exception) {
+      var trace;
+      if (exception instanceof H.ExceptionAndStackTrace)
+        return exception.stackTrace;
+      if (exception == null)
+        return new H._StackTrace(exception);
+      trace = exception.$cachedTrace;
+      if (trace != null)
+        return trace;
+      return exception.$cachedTrace = new H._StackTrace(exception);
+    },
+    objectHashCode: function(object) {
+      if (object == null || typeof object != 'object')
+        return J.get$hashCode$(object);
+      else
+        return H.Primitives_objectHashCode(object);
+    },
+    fillLiteralMap: function(keyValuePairs, result) {
+      var index, index0, index1,
+        $length = keyValuePairs.length;
+      for (index = 0; index < $length; index = index1) {
+        index0 = index + 1;
+        index1 = index0 + 1;
+        result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
+      }
+      return result;
+    },
+    fillLiteralSet: function(values, result) {
+      var index,
+        $length = values.length;
+      for (index = 0; index < $length; ++index)
+        result.add$1(0, values[index]);
+      return result;
+    },
+    invokeClosure: function(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
+      switch (numberOfArguments) {
+        case 0:
+          return closure.call$0();
+        case 1:
+          return closure.call$1(arg1);
+        case 2:
+          return closure.call$2(arg1, arg2);
+        case 3:
+          return closure.call$3(arg1, arg2, arg3);
+        case 4:
+          return closure.call$4(arg1, arg2, arg3, arg4);
+      }
+      throw H.wrapException(new P._Exception("Unsupported number of arguments for wrapped closure"));
+    },
+    convertDartClosureToJS: function(closure, arity) {
+      var $function;
+      if (closure == null)
+        return null;
+      $function = closure.$identity;
+      if (!!$function)
+        return $function;
+      $function = function(closure, arity, invoke) {
+        return function(a1, a2, a3, a4) {
+          return invoke(closure, arity, a1, a2, a3, a4);
+        };
+      }(closure, arity, H.invokeClosure);
+      closure.$identity = $function;
+      return $function;
+    },
+    Closure_fromTearOff: function(receiver, functions, applyTrampolineIndex, reflectionInfo, isStatic, isIntercepted, propertyName) {
+      var $constructor, t1, trampoline, applyTrampoline, i, stub, stubCallName,
+        $function = functions[0],
+        callName = $function.$callName,
+        $prototype = isStatic ? Object.create(new H.StaticClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, "").constructor.prototype);
+      $prototype.$initialize = $prototype.constructor;
+      if (isStatic)
+        $constructor = function static_tear_off() {
+          this.$initialize();
+        };
+      else {
+        t1 = $.Closure_functionCounter;
+        $.Closure_functionCounter = t1 + 1;
+        t1 = new Function("a,b,c,d" + t1, "this.$initialize(a,b,c,d" + t1 + ")");
+        $constructor = t1;
+      }
+      $prototype.constructor = $constructor;
+      $constructor.prototype = $prototype;
+      if (!isStatic) {
+        trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
+        trampoline.$reflectionInfo = reflectionInfo;
+      } else {
+        $prototype.$static_name = propertyName;
+        trampoline = $function;
+      }
+      $prototype.$signature = H.Closure__computeSignatureFunctionNewRti(reflectionInfo, isStatic, isIntercepted);
+      $prototype[callName] = trampoline;
+      for (applyTrampoline = trampoline, i = 1; i < functions.length; ++i) {
+        stub = functions[i];
+        stubCallName = stub.$callName;
+        if (stubCallName != null) {
+          stub = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
+          $prototype[stubCallName] = stub;
+        }
+        if (i === applyTrampolineIndex) {
+          stub.$reflectionInfo = reflectionInfo;
+          applyTrampoline = stub;
+        }
+      }
+      $prototype["call*"] = applyTrampoline;
+      $prototype.$requiredArgCount = $function.$requiredArgCount;
+      $prototype.$defaultValues = $function.$defaultValues;
+      return $constructor;
+    },
+    Closure__computeSignatureFunctionNewRti: function(functionType, isStatic, isIntercepted) {
+      var typeEvalMethod;
+      if (typeof functionType == "number")
+        return function(getType, t) {
+          return function() {
+            return getType(t);
+          };
+        }(H.getTypeFromTypesTable, functionType);
+      if (typeof functionType == "string") {
+        if (isStatic)
+          throw H.wrapException("Cannot compute signature for static tearoff.");
+        typeEvalMethod = isIntercepted ? H.BoundClosure_evalRecipeIntercepted : H.BoundClosure_evalRecipe;
+        return function(recipe, evalOnReceiver) {
+          return function() {
+            return evalOnReceiver(this, recipe);
+          };
+        }(functionType, typeEvalMethod);
+      }
+      throw H.wrapException("Error in functionType of tearoff");
+    },
+    Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
+      var getSelf = H.BoundClosure_selfOf;
+      switch (isSuperCall ? -1 : arity) {
+        case 0:
+          return function(n, S) {
+            return function() {
+              return S(this)[n]();
+            };
+          }(stubName, getSelf);
+        case 1:
+          return function(n, S) {
+            return function(a) {
+              return S(this)[n](a);
+            };
+          }(stubName, getSelf);
+        case 2:
+          return function(n, S) {
+            return function(a, b) {
+              return S(this)[n](a, b);
+            };
+          }(stubName, getSelf);
+        case 3:
+          return function(n, S) {
+            return function(a, b, c) {
+              return S(this)[n](a, b, c);
+            };
+          }(stubName, getSelf);
+        case 4:
+          return function(n, S) {
+            return function(a, b, c, d) {
+              return S(this)[n](a, b, c, d);
+            };
+          }(stubName, getSelf);
+        case 5:
+          return function(n, S) {
+            return function(a, b, c, d, e) {
+              return S(this)[n](a, b, c, d, e);
+            };
+          }(stubName, getSelf);
+        default:
+          return function(f, s) {
+            return function() {
+              return f.apply(s(this), arguments);
+            };
+          }($function, getSelf);
+      }
+    },
+    Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
+      var stubName, arity, lookedUpFunction, t1, t2, selfName, $arguments;
+      if (isIntercepted)
+        return H.Closure_forwardInterceptedCallTo(receiver, $function);
+      stubName = $function.$stubName;
+      arity = $function.length;
+      lookedUpFunction = receiver[stubName];
+      t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+      t2 = !t1 || arity >= 27;
+      if (t2)
+        return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
+      if (arity === 0) {
+        t1 = $.Closure_functionCounter;
+        $.Closure_functionCounter = t1 + 1;
+        selfName = "self" + H.S(t1);
+        return new Function("return function(){var " + selfName + " = this." + H.S(H.BoundClosure_selfFieldName()) + ";return " + selfName + "." + H.S(stubName) + "();}")();
+      }
+      $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
+      t1 = $.Closure_functionCounter;
+      $.Closure_functionCounter = t1 + 1;
+      $arguments += H.S(t1);
+      return new Function("return function(" + $arguments + "){return this." + H.S(H.BoundClosure_selfFieldName()) + "." + H.S(stubName) + "(" + $arguments + ");}")();
+    },
+    Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
+      var getSelf = H.BoundClosure_selfOf,
+        getReceiver = H.BoundClosure_receiverOf;
+      switch (isSuperCall ? -1 : arity) {
+        case 0:
+          throw H.wrapException(new H.RuntimeError("Intercepted function with no arguments."));
+        case 1:
+          return function(n, s, r) {
+            return function() {
+              return s(this)[n](r(this));
+            };
+          }($name, getSelf, getReceiver);
+        case 2:
+          return function(n, s, r) {
+            return function(a) {
+              return s(this)[n](r(this), a);
+            };
+          }($name, getSelf, getReceiver);
+        case 3:
+          return function(n, s, r) {
+            return function(a, b) {
+              return s(this)[n](r(this), a, b);
+            };
+          }($name, getSelf, getReceiver);
+        case 4:
+          return function(n, s, r) {
+            return function(a, b, c) {
+              return s(this)[n](r(this), a, b, c);
+            };
+          }($name, getSelf, getReceiver);
+        case 5:
+          return function(n, s, r) {
+            return function(a, b, c, d) {
+              return s(this)[n](r(this), a, b, c, d);
+            };
+          }($name, getSelf, getReceiver);
+        case 6:
+          return function(n, s, r) {
+            return function(a, b, c, d, e) {
+              return s(this)[n](r(this), a, b, c, d, e);
+            };
+          }($name, getSelf, getReceiver);
+        default:
+          return function(f, s, r, a) {
+            return function() {
+              a = [r(this)];
+              Array.prototype.push.apply(a, arguments);
+              return f.apply(s(this), a);
+            };
+          }($function, getSelf, getReceiver);
+      }
+    },
+    Closure_forwardInterceptedCallTo: function(receiver, $function) {
+      var stubName, arity, lookedUpFunction, t1, t2, $arguments,
+        selfField = H.BoundClosure_selfFieldName(),
+        receiverField = $.BoundClosure_receiverFieldNameCache;
+      if (receiverField == null)
+        receiverField = $.BoundClosure_receiverFieldNameCache = H.BoundClosure_computeFieldNamed("receiver");
+      stubName = $function.$stubName;
+      arity = $function.length;
+      lookedUpFunction = receiver[stubName];
+      t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+      t2 = !t1 || arity >= 28;
+      if (t2)
+        return H.Closure_cspForwardInterceptedCall(arity, !t1, stubName, $function);
+      if (arity === 1) {
+        t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + receiverField + ");";
+        t2 = $.Closure_functionCounter;
+        $.Closure_functionCounter = t2 + 1;
+        return new Function(t1 + H.S(t2) + "}")();
+      }
+      $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
+      t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + receiverField + ", " + $arguments + ");";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = t2 + 1;
+      return new Function(t1 + H.S(t2) + "}")();
+    },
+    closureFromTearOff: function(receiver, functions, applyTrampolineIndex, reflectionInfo, isStatic, isIntercepted, $name) {
+      return H.Closure_fromTearOff(receiver, functions, applyTrampolineIndex, reflectionInfo, !!isStatic, !!isIntercepted, $name);
+    },
+    BoundClosure_evalRecipe: function(closure, recipe) {
+      return H._Universe_evalInEnvironment(init.typeUniverse, H.instanceType(closure._self), recipe);
+    },
+    BoundClosure_evalRecipeIntercepted: function(closure, recipe) {
+      return H._Universe_evalInEnvironment(init.typeUniverse, H.instanceType(closure._receiver), recipe);
+    },
+    BoundClosure_selfOf: function(closure) {
+      return closure._self;
+    },
+    BoundClosure_receiverOf: function(closure) {
+      return closure._receiver;
+    },
+    BoundClosure_selfFieldName: function() {
+      var t1 = $.BoundClosure_selfFieldNameCache;
+      return t1 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t1;
+    },
+    BoundClosure_computeFieldNamed: function(fieldName) {
+      var t1, i, $name,
+        template = new H.BoundClosure("self", "target", "receiver", "name"),
+        names = J.JSArray_markFixedList(Object.getOwnPropertyNames(template));
+      for (t1 = names.length, i = 0; i < t1; ++i) {
+        $name = names[i];
+        if (template[$name] === fieldName)
+          return $name;
+      }
+      throw H.wrapException(P.ArgumentError$("Field name " + fieldName + " not found."));
+    },
+    throwCyclicInit: function(staticName) {
+      throw H.wrapException(new P.CyclicInitializationError(staticName));
+    },
+    getIsolateAffinityTag: function($name) {
+      return init.getIsolateTag($name);
+    },
+    defineProperty: function(obj, property, value) {
+      Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
+    },
+    lookupAndCacheInterceptor: function(obj) {
+      var interceptor, interceptorClass, altTag, mark, t1,
+        tag = $.getTagFunction.call$1(obj),
+        record = $.dispatchRecordsForInstanceTags[tag];
+      if (record != null) {
+        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+        return record.i;
+      }
+      interceptor = $.interceptorsForUncacheableTags[tag];
+      if (interceptor != null)
+        return interceptor;
+      interceptorClass = init.interceptorsByTag[tag];
+      if (interceptorClass == null) {
+        altTag = $.alternateTagFunction.call$2(obj, tag);
+        if (altTag != null) {
+          record = $.dispatchRecordsForInstanceTags[altTag];
+          if (record != null) {
+            Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+            return record.i;
+          }
+          interceptor = $.interceptorsForUncacheableTags[altTag];
+          if (interceptor != null)
+            return interceptor;
+          interceptorClass = init.interceptorsByTag[altTag];
+          tag = altTag;
+        }
+      }
+      if (interceptorClass == null)
+        return null;
+      interceptor = interceptorClass.prototype;
+      mark = tag[0];
+      if (mark === "!") {
+        record = H.makeLeafDispatchRecord(interceptor);
+        $.dispatchRecordsForInstanceTags[tag] = record;
+        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+        return record.i;
+      }
+      if (mark === "~") {
+        $.interceptorsForUncacheableTags[tag] = interceptor;
+        return interceptor;
+      }
+      if (mark === "-") {
+        t1 = H.makeLeafDispatchRecord(interceptor);
+        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+        return t1.i;
+      }
+      if (mark === "+")
+        return H.patchInteriorProto(obj, interceptor);
+      if (mark === "*")
+        throw H.wrapException(P.UnimplementedError$(tag));
+      if (init.leafTags[tag] === true) {
+        t1 = H.makeLeafDispatchRecord(interceptor);
+        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+        return t1.i;
+      } else
+        return H.patchInteriorProto(obj, interceptor);
+    },
+    patchInteriorProto: function(obj, interceptor) {
+      var proto = Object.getPrototypeOf(obj);
+      Object.defineProperty(proto, init.dispatchPropertyName, {value: J.makeDispatchRecord(interceptor, proto, null, null), enumerable: false, writable: true, configurable: true});
+      return interceptor;
+    },
+    makeLeafDispatchRecord: function(interceptor) {
+      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+    },
+    makeDefaultDispatchRecord: function(tag, interceptorClass, proto) {
+      var interceptor = interceptorClass.prototype;
+      if (init.leafTags[tag] === true)
+        return H.makeLeafDispatchRecord(interceptor);
+      else
+        return J.makeDispatchRecord(interceptor, proto, null, null);
+    },
+    initNativeDispatch: function() {
+      if (true === $.initNativeDispatchFlag)
+        return;
+      $.initNativeDispatchFlag = true;
+      H.initNativeDispatchContinue();
+    },
+    initNativeDispatchContinue: function() {
+      var map, tags, fun, i, tag, proto, record, interceptorClass;
+      $.dispatchRecordsForInstanceTags = Object.create(null);
+      $.interceptorsForUncacheableTags = Object.create(null);
+      H.initHooks();
+      map = init.interceptorsByTag;
+      tags = Object.getOwnPropertyNames(map);
+      if (typeof window != "undefined") {
+        window;
+        fun = function() {
+        };
+        for (i = 0; i < tags.length; ++i) {
+          tag = tags[i];
+          proto = $.prototypeForTagFunction.call$1(tag);
+          if (proto != null) {
+            record = H.makeDefaultDispatchRecord(tag, map[tag], proto);
+            if (record != null) {
+              Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+              fun.prototype = proto;
+            }
+          }
+        }
+      }
+      for (i = 0; i < tags.length; ++i) {
+        tag = tags[i];
+        if (/^[A-Za-z_]/.test(tag)) {
+          interceptorClass = map[tag];
+          map["!" + tag] = interceptorClass;
+          map["~" + tag] = interceptorClass;
+          map["-" + tag] = interceptorClass;
+          map["+" + tag] = interceptorClass;
+          map["*" + tag] = interceptorClass;
+        }
+      }
+    },
+    initHooks: function() {
+      var transformers, i, transformer, getTag, getUnknownTag, prototypeForTag,
+        hooks = C.C_JS_CONST0();
+      hooks = H.applyHooksTransformer(C.C_JS_CONST1, H.applyHooksTransformer(C.C_JS_CONST2, H.applyHooksTransformer(C.C_JS_CONST3, H.applyHooksTransformer(C.C_JS_CONST3, H.applyHooksTransformer(C.C_JS_CONST4, H.applyHooksTransformer(C.C_JS_CONST5, H.applyHooksTransformer(C.C_JS_CONST6(C.C_JS_CONST), hooks)))))));
+      if (typeof dartNativeDispatchHooksTransformer != "undefined") {
+        transformers = dartNativeDispatchHooksTransformer;
+        if (typeof transformers == "function")
+          transformers = [transformers];
+        if (transformers.constructor == Array)
+          for (i = 0; i < transformers.length; ++i) {
+            transformer = transformers[i];
+            if (typeof transformer == "function")
+              hooks = transformer(hooks) || hooks;
+          }
+      }
+      getTag = hooks.getTag;
+      getUnknownTag = hooks.getUnknownTag;
+      prototypeForTag = hooks.prototypeForTag;
+      $.getTagFunction = new H.initHooks_closure(getTag);
+      $.alternateTagFunction = new H.initHooks_closure0(getUnknownTag);
+      $.prototypeForTagFunction = new H.initHooks_closure1(prototypeForTag);
+    },
+    applyHooksTransformer: function(transformer, hooks) {
+      return transformer(hooks) || hooks;
+    },
+    JSSyntaxRegExp_makeNative: function(source, multiLine, caseSensitive, unicode, dotAll, global) {
+      var m = multiLine ? "m" : "",
+        i = caseSensitive ? "" : "i",
+        u = unicode ? "u" : "",
+        s = dotAll ? "s" : "",
+        g = global ? "g" : "",
+        regexp = function(source, modifiers) {
+          try {
+            return new RegExp(source, modifiers);
+          } catch (e) {
+            return e;
+          }
+        }(source, m + i + u + s + g);
+      if (regexp instanceof RegExp)
+        return regexp;
+      throw H.wrapException(P.FormatException$("Illegal RegExp pattern (" + String(regexp) + ")", source, null));
+    },
+    stringContainsUnchecked: function(receiver, other, startIndex) {
+      var t1, t2;
+      if (typeof other == "string")
+        return receiver.indexOf(other, startIndex) >= 0;
+      else if (other instanceof H.JSSyntaxRegExp) {
+        t1 = C.JSString_methods.substring$1(receiver, startIndex);
+        t2 = other._nativeRegExp;
+        return t2.test(t1);
+      } else {
+        t1 = J.allMatches$1$s(other, C.JSString_methods.substring$1(receiver, startIndex));
+        return !t1.get$isEmpty(t1);
+      }
+    },
+    escapeReplacement: function(replacement) {
+      if (replacement.indexOf("$", 0) >= 0)
+        return replacement.replace(/\$/g, "$$$$");
+      return replacement;
+    },
+    stringReplaceFirstRE: function(receiver, regexp, replacement, startIndex) {
+      var match = regexp._execGlobal$2(receiver, startIndex);
+      if (match == null)
+        return receiver;
+      return H.stringReplaceRangeUnchecked(receiver, match._match.index, match.get$end(match), replacement);
+    },
+    quoteStringForRegExp: function(string) {
+      if (/[[\]{}()*+?.\\^$|]/.test(string))
+        return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
+      return string;
+    },
+    stringReplaceAllUnchecked: function(receiver, pattern, replacement) {
+      var nativeRegexp;
+      if (typeof pattern == "string")
+        return H.stringReplaceAllUncheckedString(receiver, pattern, replacement);
+      if (pattern instanceof H.JSSyntaxRegExp) {
+        nativeRegexp = pattern.get$_nativeGlobalVersion();
+        nativeRegexp.lastIndex = 0;
+        return receiver.replace(nativeRegexp, H.escapeReplacement(replacement));
+      }
+      if (pattern == null)
+        H.throwExpression(H.argumentErrorValue(pattern));
+      throw H.wrapException("String.replaceAll(Pattern) UNIMPLEMENTED");
+    },
+    stringReplaceAllUncheckedString: function(receiver, pattern, replacement) {
+      var $length, t1, i, index;
+      if (pattern === "") {
+        if (receiver === "")
+          return replacement;
+        $length = receiver.length;
+        for (t1 = replacement, i = 0; i < $length; ++i)
+          t1 = t1 + receiver[i] + replacement;
+        return t1.charCodeAt(0) == 0 ? t1 : t1;
+      }
+      index = receiver.indexOf(pattern, 0);
+      if (index < 0)
+        return receiver;
+      if (receiver.length < 500 || replacement.indexOf("$", 0) >= 0)
+        return receiver.split(pattern).join(replacement);
+      return receiver.replace(new RegExp(H.quoteStringForRegExp(pattern), 'g'), H.escapeReplacement(replacement));
+    },
+    stringReplaceFirstUnchecked: function(receiver, pattern, replacement, startIndex) {
+      var index, t1, matches, match;
+      if (typeof pattern == "string") {
+        index = receiver.indexOf(pattern, startIndex);
+        if (index < 0)
+          return receiver;
+        return H.stringReplaceRangeUnchecked(receiver, index, index + pattern.length, replacement);
+      }
+      if (pattern instanceof H.JSSyntaxRegExp)
+        return startIndex === 0 ? receiver.replace(pattern._nativeRegExp, H.escapeReplacement(replacement)) : H.stringReplaceFirstRE(receiver, pattern, replacement, startIndex);
+      if (pattern == null)
+        H.throwExpression(H.argumentErrorValue(pattern));
+      t1 = J.allMatches$2$s(pattern, receiver, startIndex);
+      matches = t1.get$iterator(t1);
+      if (!matches.moveNext$0())
+        return receiver;
+      match = matches.get$current(matches);
+      return C.JSString_methods.replaceRange$3(receiver, match.get$start(match), match.get$end(match), replacement);
+    },
+    stringReplaceRangeUnchecked: function(receiver, start, end, replacement) {
+      var prefix = receiver.substring(0, start),
+        suffix = receiver.substring(end);
+      return prefix + H.S(replacement) + suffix;
+    },
+    ConstantMapView: function ConstantMapView(t0, t1) {
+      this._collection$_map = t0;
+      this.$ti = t1;
+    },
+    ConstantMap: function ConstantMap() {
+    },
+    ConstantStringMap: function ConstantStringMap(t0, t1, t2, t3) {
+      var _ = this;
+      _.__js_helper$_length = t0;
+      _._jsObject = t1;
+      _.__js_helper$_keys = t2;
+      _.$ti = t3;
+    },
+    ConstantStringMap_values_closure: function ConstantStringMap_values_closure(t0) {
+      this.$this = t0;
+    },
+    ConstantProtoMap: function ConstantProtoMap(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._protoValue = t0;
+      _.__js_helper$_length = t1;
+      _._jsObject = t2;
+      _.__js_helper$_keys = t3;
+      _.$ti = t4;
+    },
+    _ConstantMapKeyIterable: function _ConstantMapKeyIterable(t0, t1) {
+      this._map = t0;
+      this.$ti = t1;
+    },
+    Instantiation: function Instantiation() {
+    },
+    Instantiation1: function Instantiation1(t0, t1) {
+      this._genericClosure = t0;
+      this.$ti = t1;
+    },
+    JSInvocationMirror: function JSInvocationMirror(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.__js_helper$_memberName = t0;
+      _.__js_helper$_kind = t1;
+      _._arguments = t2;
+      _._namedArgumentNames = t3;
+      _._typeArgumentCount = t4;
+    },
+    Primitives_functionNoSuchMethod_closure: function Primitives_functionNoSuchMethod_closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.namedArgumentList = t1;
+      this.$arguments = t2;
+    },
+    TypeErrorDecoder: function TypeErrorDecoder(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._pattern = t0;
+      _._arguments = t1;
+      _._argumentsExpr = t2;
+      _._expr = t3;
+      _._method = t4;
+      _._receiver = t5;
+    },
+    NullError: function NullError(t0, t1) {
+      this.__js_helper$_message = t0;
+      this._method = t1;
+    },
+    JsNoSuchMethodError: function JsNoSuchMethodError(t0, t1, t2) {
+      this.__js_helper$_message = t0;
+      this._method = t1;
+      this._receiver = t2;
+    },
+    UnknownJsTypeError: function UnknownJsTypeError(t0) {
+      this.__js_helper$_message = t0;
+    },
+    NullThrownFromJavaScriptException: function NullThrownFromJavaScriptException(t0) {
+      this._irritant = t0;
+    },
+    ExceptionAndStackTrace: function ExceptionAndStackTrace(t0, t1) {
+      this.dartException = t0;
+      this.stackTrace = t1;
+    },
+    _StackTrace: function _StackTrace(t0) {
+      this._exception = t0;
+      this._trace = null;
+    },
+    Closure: function Closure() {
+    },
+    TearOffClosure: function TearOffClosure() {
+    },
+    StaticClosure: function StaticClosure() {
+    },
+    BoundClosure: function BoundClosure(t0, t1, t2, t3) {
+      var _ = this;
+      _._self = t0;
+      _._target = t1;
+      _._receiver = t2;
+      _.__js_helper$_name = t3;
+    },
+    RuntimeError: function RuntimeError(t0) {
+      this.message = t0;
+    },
+    _Required: function _Required() {
+    },
+    JsLinkedHashMap: function JsLinkedHashMap(t0) {
+      var _ = this;
+      _.__js_helper$_length = 0;
+      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
+      _._modifications = 0;
+      _.$ti = t0;
+    },
+    JsLinkedHashMap_values_closure: function JsLinkedHashMap_values_closure(t0) {
+      this.$this = t0;
+    },
+    JsLinkedHashMap_addAll_closure: function JsLinkedHashMap_addAll_closure(t0) {
+      this.$this = t0;
+    },
+    LinkedHashMapCell: function LinkedHashMapCell(t0, t1) {
+      var _ = this;
+      _.hashMapCellKey = t0;
+      _.hashMapCellValue = t1;
+      _._previous = _._next = null;
+    },
+    LinkedHashMapKeyIterable: function LinkedHashMapKeyIterable(t0, t1) {
+      this._map = t0;
+      this.$ti = t1;
+    },
+    LinkedHashMapKeyIterator: function LinkedHashMapKeyIterator(t0, t1) {
+      var _ = this;
+      _._map = t0;
+      _._modifications = t1;
+      _.__js_helper$_current = _._cell = null;
+    },
+    initHooks_closure: function initHooks_closure(t0) {
+      this.getTag = t0;
+    },
+    initHooks_closure0: function initHooks_closure0(t0) {
+      this.getUnknownTag = t0;
+    },
+    initHooks_closure1: function initHooks_closure1(t0) {
+      this.prototypeForTag = t0;
+    },
+    JSSyntaxRegExp: function JSSyntaxRegExp(t0, t1) {
+      var _ = this;
+      _.pattern = t0;
+      _._nativeRegExp = t1;
+      _._nativeAnchoredRegExp = _._nativeGlobalRegExp = null;
+    },
+    _MatchImplementation: function _MatchImplementation(t0) {
+      this._match = t0;
+    },
+    _AllMatchesIterable: function _AllMatchesIterable(t0, t1, t2) {
+      this._re = t0;
+      this.__js_helper$_string = t1;
+      this.__js_helper$_start = t2;
+    },
+    _AllMatchesIterator: function _AllMatchesIterator(t0, t1, t2) {
+      var _ = this;
+      _._regExp = t0;
+      _.__js_helper$_string = t1;
+      _._nextIndex = t2;
+      _.__js_helper$_current = null;
+    },
+    StringMatch: function StringMatch(t0, t1) {
+      this.start = t0;
+      this.pattern = t1;
+    },
+    _StringAllMatchesIterable: function _StringAllMatchesIterable(t0, t1, t2) {
+      this._input = t0;
+      this._pattern = t1;
+      this.__js_helper$_index = t2;
+    },
+    _StringAllMatchesIterator: function _StringAllMatchesIterator(t0, t1, t2) {
+      var _ = this;
+      _._input = t0;
+      _._pattern = t1;
+      _.__js_helper$_index = t2;
+      _.__js_helper$_current = null;
+    },
+    _ensureNativeList: function(list) {
+      return list;
+    },
+    NativeInt8List__create1: function(arg) {
+      return new Int8Array(arg);
+    },
+    NativeUint8List_NativeUint8List$view: function(buffer, offsetInBytes, $length) {
+      var t1;
+      if (!H._isInt(offsetInBytes))
+        H.throwExpression(P.ArgumentError$("Invalid view offsetInBytes " + H.S(offsetInBytes)));
+      t1 = new Uint8Array(buffer, offsetInBytes, $length);
+      return t1;
+    },
+    _checkValidIndex: function(index, list, $length) {
+      if (index >>> 0 !== index || index >= $length)
+        throw H.wrapException(H.diagnoseIndexError(list, index));
+    },
+    _checkValidRange: function(start, end, $length) {
+      var t1;
+      if (!(start >>> 0 !== start))
+        if (end == null)
+          t1 = start > $length;
+        else
+          t1 = end >>> 0 !== end || start > end || end > $length;
+      else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(H.diagnoseRangeError(start, end, $length));
+      if (end == null)
+        return $length;
+      return end;
+    },
+    NativeTypedData: function NativeTypedData() {
+    },
+    NativeTypedArray: function NativeTypedArray() {
+    },
+    NativeTypedArrayOfDouble: function NativeTypedArrayOfDouble() {
+    },
+    NativeTypedArrayOfInt: function NativeTypedArrayOfInt() {
+    },
+    NativeFloat32List: function NativeFloat32List() {
+    },
+    NativeFloat64List: function NativeFloat64List() {
+    },
+    NativeInt16List: function NativeInt16List() {
+    },
+    NativeInt32List: function NativeInt32List() {
+    },
+    NativeInt8List: function NativeInt8List() {
+    },
+    NativeUint16List: function NativeUint16List() {
+    },
+    NativeUint32List: function NativeUint32List() {
+    },
+    NativeUint8ClampedList: function NativeUint8ClampedList() {
+    },
+    NativeUint8List: function NativeUint8List() {
+    },
+    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin() {
+    },
+    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin() {
+    },
+    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin() {
+    },
+    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin() {
+    },
+    Rti__getQuestionFromStar: function(universe, rti) {
+      var question = rti._precomputed1;
+      return question == null ? rti._precomputed1 = H._Universe__lookupQuestionRti(universe, rti._primary, true) : question;
+    },
+    Rti__getFutureFromFutureOr: function(universe, rti) {
+      var future = rti._precomputed1;
+      return future == null ? rti._precomputed1 = H._Universe__lookupInterfaceRti(universe, "Future", [rti._primary]) : future;
+    },
+    Rti__isUnionOfFunctionType: function(rti) {
+      var kind = rti._kind;
+      if (kind === 6 || kind === 7 || kind === 8)
+        return H.Rti__isUnionOfFunctionType(rti._primary);
+      return kind === 11 || kind === 12;
+    },
+    Rti__getCanonicalRecipe: function(rti) {
+      return rti._canonicalRecipe;
+    },
+    findType: function(recipe) {
+      return H._Universe_eval(init.typeUniverse, recipe, false);
+    },
+    instantiatedGenericFunctionType: function(genericFunctionRti, instantiationRti) {
+      var t1, cache, key, probe, rti;
+      if (genericFunctionRti == null)
+        return null;
+      t1 = instantiationRti._rest;
+      cache = genericFunctionRti._bindCache;
+      if (cache == null)
+        cache = genericFunctionRti._bindCache = new Map();
+      key = instantiationRti._canonicalRecipe;
+      probe = cache.get(key);
+      if (probe != null)
+        return probe;
+      rti = H._substitute(init.typeUniverse, genericFunctionRti._primary, t1, 0);
+      cache.set(key, rti);
+      return rti;
+    },
+    _substitute: function(universe, rti, typeArguments, depth) {
+      var baseType, substitutedBaseType, interfaceTypeArguments, substitutedInterfaceTypeArguments, base, substitutedBase, $arguments, substitutedArguments, returnType, substitutedReturnType, functionParameters, substitutedFunctionParameters, bounds, substitutedBounds, index, argument,
+        kind = rti._kind;
+      switch (kind) {
+        case 5:
+        case 1:
+        case 2:
+        case 3:
+        case 4:
+          return rti;
+        case 6:
+          baseType = rti._primary;
+          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
+          if (substitutedBaseType === baseType)
+            return rti;
+          return H._Universe__lookupStarRti(universe, substitutedBaseType, true);
+        case 7:
+          baseType = rti._primary;
+          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
+          if (substitutedBaseType === baseType)
+            return rti;
+          return H._Universe__lookupQuestionRti(universe, substitutedBaseType, true);
+        case 8:
+          baseType = rti._primary;
+          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
+          if (substitutedBaseType === baseType)
+            return rti;
+          return H._Universe__lookupFutureOrRti(universe, substitutedBaseType, true);
+        case 9:
+          interfaceTypeArguments = rti._rest;
+          substitutedInterfaceTypeArguments = H._substituteArray(universe, interfaceTypeArguments, typeArguments, depth);
+          if (substitutedInterfaceTypeArguments === interfaceTypeArguments)
+            return rti;
+          return H._Universe__lookupInterfaceRti(universe, rti._primary, substitutedInterfaceTypeArguments);
+        case 10:
+          base = rti._primary;
+          substitutedBase = H._substitute(universe, base, typeArguments, depth);
+          $arguments = rti._rest;
+          substitutedArguments = H._substituteArray(universe, $arguments, typeArguments, depth);
+          if (substitutedBase === base && substitutedArguments === $arguments)
+            return rti;
+          return H._Universe__lookupBindingRti(universe, substitutedBase, substitutedArguments);
+        case 11:
+          returnType = rti._primary;
+          substitutedReturnType = H._substitute(universe, returnType, typeArguments, depth);
+          functionParameters = rti._rest;
+          substitutedFunctionParameters = H._substituteFunctionParameters(universe, functionParameters, typeArguments, depth);
+          if (substitutedReturnType === returnType && substitutedFunctionParameters === functionParameters)
+            return rti;
+          return H._Universe__lookupFunctionRti(universe, substitutedReturnType, substitutedFunctionParameters);
+        case 12:
+          bounds = rti._rest;
+          depth += bounds.length;
+          substitutedBounds = H._substituteArray(universe, bounds, typeArguments, depth);
+          base = rti._primary;
+          substitutedBase = H._substitute(universe, base, typeArguments, depth);
+          if (substitutedBounds === bounds && substitutedBase === base)
+            return rti;
+          return H._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, true);
+        case 13:
+          index = rti._primary;
+          if (index < depth)
+            return rti;
+          argument = typeArguments[index - depth];
+          if (argument == null)
+            return rti;
+          return argument;
+        default:
+          throw H.wrapException(P.AssertionError$("Attempted to substitute unexpected RTI kind " + kind));
+      }
+    },
+    _substituteArray: function(universe, rtiArray, typeArguments, depth) {
+      var changed, i, rti, substitutedRti,
+        $length = rtiArray.length,
+        result = [];
+      for (changed = false, i = 0; i < $length; ++i) {
+        rti = rtiArray[i];
+        substitutedRti = H._substitute(universe, rti, typeArguments, depth);
+        if (substitutedRti !== rti)
+          changed = true;
+        result.push(substitutedRti);
+      }
+      return changed ? result : rtiArray;
+    },
+    _substituteNamed: function(universe, namedArray, typeArguments, depth) {
+      var changed, i, t1, t2, rti, substitutedRti,
+        $length = namedArray.length,
+        result = [];
+      for (changed = false, i = 0; i < $length; i += 3) {
+        t1 = namedArray[i];
+        t2 = namedArray[i + 1];
+        rti = namedArray[i + 2];
+        substitutedRti = H._substitute(universe, rti, typeArguments, depth);
+        if (substitutedRti !== rti)
+          changed = true;
+        result.push(t1);
+        result.push(t2);
+        result.push(substitutedRti);
+      }
+      return changed ? result : namedArray;
+    },
+    _substituteFunctionParameters: function(universe, functionParameters, typeArguments, depth) {
+      var result,
+        requiredPositional = functionParameters._requiredPositional,
+        substitutedRequiredPositional = H._substituteArray(universe, requiredPositional, typeArguments, depth),
+        optionalPositional = functionParameters._optionalPositional,
+        substitutedOptionalPositional = H._substituteArray(universe, optionalPositional, typeArguments, depth),
+        named = functionParameters._named,
+        substitutedNamed = H._substituteNamed(universe, named, typeArguments, depth);
+      if (substitutedRequiredPositional === requiredPositional && substitutedOptionalPositional === optionalPositional && substitutedNamed === named)
+        return functionParameters;
+      result = new H._FunctionParameters();
+      result._requiredPositional = substitutedRequiredPositional;
+      result._optionalPositional = substitutedOptionalPositional;
+      result._named = substitutedNamed;
+      return result;
+    },
+    setRuntimeTypeInfo: function(target, rti) {
+      target[init.arrayRti] = rti;
+      return target;
+    },
+    closureFunctionType: function(closure) {
+      var signature = closure.$signature;
+      if (signature != null) {
+        if (typeof signature == "number")
+          return H.getTypeFromTypesTable(signature);
+        return closure.$signature();
+      }
+      return null;
+    },
+    instanceOrFunctionType: function(object, testRti) {
+      var rti;
+      if (H.Rti__isUnionOfFunctionType(testRti))
+        if (object instanceof H.Closure) {
+          rti = H.closureFunctionType(object);
+          if (rti != null)
+            return rti;
+        }
+      return H.instanceType(object);
+    },
+    instanceType: function(object) {
+      var rti;
+      if (object instanceof P.Object) {
+        rti = object.$ti;
+        return rti != null ? rti : H._instanceTypeFromConstructor(object);
+      }
+      if (Array.isArray(object))
+        return H._arrayInstanceType(object);
+      return H._instanceTypeFromConstructor(J.getInterceptor$(object));
+    },
+    _arrayInstanceType: function(object) {
+      var rti = object[init.arrayRti],
+        defaultRti = type$.JSArray_dynamic;
+      if (rti == null)
+        return defaultRti;
+      if (rti.constructor !== defaultRti.constructor)
+        return defaultRti;
+      return rti;
+    },
+    _instanceType: function(object) {
+      var rti = object.$ti;
+      return rti != null ? rti : H._instanceTypeFromConstructor(object);
+    },
+    _instanceTypeFromConstructor: function(instance) {
+      var $constructor = instance.constructor,
+        probe = $constructor.$ccache;
+      if (probe != null)
+        return probe;
+      return H._instanceTypeFromConstructorMiss(instance, $constructor);
+    },
+    _instanceTypeFromConstructorMiss: function(instance, $constructor) {
+      var effectiveConstructor = instance instanceof H.Closure ? instance.__proto__.__proto__.constructor : $constructor,
+        rti = H._Universe_findErasedType(init.typeUniverse, effectiveConstructor.name);
+      $constructor.$ccache = rti;
+      return rti;
+    },
+    getTypeFromTypesTable: function(index) {
+      var rti,
+        table = init.types,
+        type = table[index];
+      if (typeof type == "string") {
+        rti = H._Universe_eval(init.typeUniverse, type, false);
+        table[index] = rti;
+        return rti;
+      }
+      return type;
+    },
+    getRuntimeType: function(object) {
+      var rti = object instanceof H.Closure ? H.closureFunctionType(object) : null;
+      return H.createRuntimeType(rti == null ? H.instanceType(object) : rti);
+    },
+    createRuntimeType: function(rti) {
+      var recipe, starErasedRecipe, starErasedRti,
+        type = rti._cachedRuntimeType;
+      if (type != null)
+        return type;
+      recipe = rti._canonicalRecipe;
+      starErasedRecipe = recipe.replace(/\*/g, "");
+      if (starErasedRecipe === recipe)
+        return rti._cachedRuntimeType = new H._Type(rti);
+      starErasedRti = H._Universe_eval(init.typeUniverse, starErasedRecipe, true);
+      type = starErasedRti._cachedRuntimeType;
+      return rti._cachedRuntimeType = type == null ? starErasedRti._cachedRuntimeType = new H._Type(starErasedRti) : type;
+    },
+    typeLiteral: function(recipe) {
+      return H.createRuntimeType(H._Universe_eval(init.typeUniverse, recipe, false));
+    },
+    _installSpecializedIsTest: function(object) {
+      var unstarred, isFn, testRti = this,
+        t1 = type$.Object;
+      if (testRti === t1)
+        return H._finishIsFn(testRti, object, H._isObject);
+      if (!H.isStrongTopType(testRti))
+        if (!(testRti === type$.legacy_Object))
+          t1 = testRti === t1;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      if (t1)
+        return H._finishIsFn(testRti, object, H._isTop);
+      t1 = testRti._kind;
+      unstarred = t1 === 6 ? testRti._primary : testRti;
+      if (unstarred === type$.int)
+        isFn = H._isInt;
+      else if (unstarred === type$.double || unstarred === type$.num)
+        isFn = H._isNum;
+      else if (unstarred === type$.String)
+        isFn = H._isString;
+      else
+        isFn = unstarred === type$.bool ? H._isBool : null;
+      if (isFn != null)
+        return H._finishIsFn(testRti, object, isFn);
+      if (unstarred._kind === 9) {
+        t1 = unstarred._primary;
+        if (unstarred._rest.every(H.isTopType)) {
+          testRti._specializedTestResource = "$is" + t1;
+          return H._finishIsFn(testRti, object, H._isTestViaProperty);
+        }
+      } else if (t1 === 7)
+        return H._finishIsFn(testRti, object, H._generalNullableIsTestImplementation);
+      return H._finishIsFn(testRti, object, H._generalIsTestImplementation);
+    },
+    _finishIsFn: function(testRti, object, isFn) {
+      testRti._is = isFn;
+      return testRti._is(object);
+    },
+    _installSpecializedAsCheck: function(object) {
+      var t1, asFn, testRti = this;
+      if (!H.isStrongTopType(testRti))
+        if (!(testRti === type$.legacy_Object))
+          t1 = testRti === type$.Object;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      if (t1)
+        asFn = H._asTop;
+      else if (testRti === type$.Object)
+        asFn = H._asObject;
+      else
+        asFn = H._generalNullableAsCheckImplementation;
+      testRti._as = asFn;
+      return testRti._as(object);
+    },
+    _nullIs: function(testRti) {
+      var t2,
+        t1 = testRti._kind;
+      if (!H.isStrongTopType(testRti))
+        if (!(testRti === type$.legacy_Object))
+          t2 = testRti === type$.Object;
+        else
+          t2 = true;
+      else
+        t2 = true;
+      return t2 || testRti === type$.legacy_Never || t1 === 7 || testRti === type$.Null || testRti === type$.JSNull;
+    },
+    _generalIsTestImplementation: function(object) {
+      var testRti = this;
+      if (object == null)
+        return H._nullIs(testRti);
+      return H._isSubtype(init.typeUniverse, H.instanceOrFunctionType(object, testRti), null, testRti, null);
+    },
+    _generalNullableIsTestImplementation: function(object) {
+      if (object == null)
+        return true;
+      return this._primary._is(object);
+    },
+    _isTestViaProperty: function(object) {
+      var t1 = this,
+        tag = t1._specializedTestResource;
+      if (object instanceof P.Object)
+        return !!object[tag];
+      return !!J.getInterceptor$(object)[tag];
+    },
+    _generalAsCheckImplementation: function(object) {
+      var testRti = this;
+      if (object == null)
+        return object;
+      else if (testRti._is(object))
+        return object;
+      H._failedAsCheck(object, testRti);
+    },
+    _generalNullableAsCheckImplementation: function(object) {
+      var testRti = this;
+      if (object == null)
+        return object;
+      else if (testRti._is(object))
+        return object;
+      H._failedAsCheck(object, testRti);
+    },
+    _failedAsCheck: function(object, testRti) {
+      throw H.wrapException(H._TypeError$fromMessage(H._Error_compose(object, H.instanceOrFunctionType(object, testRti), H._rtiToString(testRti, null))));
+    },
+    _Error_compose: function(object, objectRti, checkedTypeDescription) {
+      var objectDescription = P.Error_safeToString(object),
+        objectTypeDescription = H._rtiToString(objectRti == null ? H.instanceType(object) : objectRti, null);
+      return objectDescription + ": type '" + H.S(objectTypeDescription) + "' is not a subtype of type '" + H.S(checkedTypeDescription) + "'";
+    },
+    _TypeError$fromMessage: function(message) {
+      return new H._TypeError("TypeError: " + message);
+    },
+    _TypeError__TypeError$forType: function(object, type) {
+      return new H._TypeError("TypeError: " + H._Error_compose(object, null, type));
+    },
+    _isObject: function(object) {
+      return object != null;
+    },
+    _asObject: function(object) {
+      return object;
+    },
+    _isTop: function(object) {
+      return true;
+    },
+    _asTop: function(object) {
+      return object;
+    },
+    _isBool: function(object) {
+      return true === object || false === object;
+    },
+    _asBool: function(object) {
+      if (true === object)
+        return true;
+      if (false === object)
+        return false;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool"));
+    },
+    _asBoolS: function(object) {
+      if (true === object)
+        return true;
+      if (false === object)
+        return false;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool"));
+    },
+    _asBoolQ: function(object) {
+      if (true === object)
+        return true;
+      if (false === object)
+        return false;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool?"));
+    },
+    _asDouble: function(object) {
+      if (typeof object == "number")
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "double"));
+    },
+    _asDoubleS: function(object) {
+      if (typeof object == "number")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "double"));
+    },
+    _asDoubleQ: function(object) {
+      if (typeof object == "number")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "double?"));
+    },
+    _isInt: function(object) {
+      return typeof object == "number" && Math.floor(object) === object;
+    },
+    _asInt: function(object) {
+      if (typeof object == "number" && Math.floor(object) === object)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "int"));
+    },
+    _asIntS: function(object) {
+      if (typeof object == "number" && Math.floor(object) === object)
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "int"));
+    },
+    _asIntQ: function(object) {
+      if (typeof object == "number" && Math.floor(object) === object)
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "int?"));
+    },
+    _isNum: function(object) {
+      return typeof object == "number";
+    },
+    _asNum: function(object) {
+      if (typeof object == "number")
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "num"));
+    },
+    _asNumS: function(object) {
+      if (typeof object == "number")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "num"));
+    },
+    _asNumQ: function(object) {
+      if (typeof object == "number")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "num?"));
+    },
+    _isString: function(object) {
+      return typeof object == "string";
+    },
+    _asString: function(object) {
+      if (typeof object == "string")
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "String"));
+    },
+    _asStringS: function(object) {
+      if (typeof object == "string")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "String"));
+    },
+    _asStringQ: function(object) {
+      if (typeof object == "string")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "String?"));
+    },
+    _rtiArrayToString: function(array, genericContext) {
+      var s, sep, i;
+      for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
+        s += C.JSString_methods.$add(sep, H._rtiToString(array[i], genericContext));
+      return s;
+    },
+    _functionRtiToString: function(functionType, genericContext, bounds) {
+      var boundsLength, outerContextLength, offset, i, t1, t2, t3, typeParametersText, typeSep, boundRti, kind, t4, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
+      if (bounds != null) {
+        boundsLength = bounds.length;
+        if (genericContext == null) {
+          genericContext = H.setRuntimeTypeInfo([], type$.JSArray_String);
+          outerContextLength = null;
+        } else
+          outerContextLength = genericContext.length;
+        offset = genericContext.length;
+        for (i = boundsLength; i > 0; --i)
+          genericContext.push("T" + (offset + i));
+        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, t3 = type$.Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
+          typeParametersText = C.JSString_methods.$add(typeParametersText + typeSep, genericContext[genericContext.length - 1 - i]);
+          boundRti = bounds[i];
+          kind = boundRti._kind;
+          if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
+            if (!(boundRti === t2))
+              t4 = boundRti === t3;
+            else
+              t4 = true;
+          else
+            t4 = true;
+          if (!t4)
+            typeParametersText += C.JSString_methods.$add(" extends ", H._rtiToString(boundRti, genericContext));
+        }
+        typeParametersText += ">";
+      } else {
+        typeParametersText = "";
+        outerContextLength = null;
+      }
+      t1 = functionType._primary;
+      parameters = functionType._rest;
+      requiredPositional = parameters._requiredPositional;
+      requiredPositionalLength = requiredPositional.length;
+      optionalPositional = parameters._optionalPositional;
+      optionalPositionalLength = optionalPositional.length;
+      named = parameters._named;
+      namedLength = named.length;
+      returnTypeText = H._rtiToString(t1, genericContext);
+      for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
+        argumentsText += C.JSString_methods.$add(sep, H._rtiToString(requiredPositional[i], genericContext));
+      if (optionalPositionalLength > 0) {
+        argumentsText += sep + "[";
+        for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
+          argumentsText += C.JSString_methods.$add(sep, H._rtiToString(optionalPositional[i], genericContext));
+        argumentsText += "]";
+      }
+      if (namedLength > 0) {
+        argumentsText += sep + "{";
+        for (sep = "", i = 0; i < namedLength; i += 3, sep = _s2_) {
+          argumentsText += sep;
+          if (named[i + 1])
+            argumentsText += "required ";
+          argumentsText += J.$add$ansx(H._rtiToString(named[i + 2], genericContext), " ") + named[i];
+        }
+        argumentsText += "}";
+      }
+      if (outerContextLength != null) {
+        genericContext.toString;
+        genericContext.length = outerContextLength;
+      }
+      return typeParametersText + "(" + argumentsText + ") => " + H.S(returnTypeText);
+    },
+    _rtiToString: function(rti, genericContext) {
+      var s, questionArgument, argumentKind, $name, $arguments, t1,
+        kind = rti._kind;
+      if (kind === 5)
+        return "erased";
+      if (kind === 2)
+        return "dynamic";
+      if (kind === 3)
+        return "void";
+      if (kind === 1)
+        return "Never";
+      if (kind === 4)
+        return "any";
+      if (kind === 6) {
+        s = H._rtiToString(rti._primary, genericContext);
+        return s;
+      }
+      if (kind === 7) {
+        questionArgument = rti._primary;
+        s = H._rtiToString(questionArgument, genericContext);
+        argumentKind = questionArgument._kind;
+        return J.$add$ansx(argumentKind === 11 || argumentKind === 12 ? C.JSString_methods.$add("(", s) + ")" : s, "?");
+      }
+      if (kind === 8)
+        return "FutureOr<" + H.S(H._rtiToString(rti._primary, genericContext)) + ">";
+      if (kind === 9) {
+        $name = H._unminifyOrTag(rti._primary);
+        $arguments = rti._rest;
+        return $arguments.length !== 0 ? $name + ("<" + H._rtiArrayToString($arguments, genericContext) + ">") : $name;
+      }
+      if (kind === 11)
+        return H._functionRtiToString(rti, genericContext, null);
+      if (kind === 12)
+        return H._functionRtiToString(rti._primary, genericContext, rti._rest);
+      if (kind === 13) {
+        genericContext.toString;
+        t1 = rti._primary;
+        return genericContext[genericContext.length - 1 - t1];
+      }
+      return "?";
+    },
+    _unminifyOrTag: function(rawClassName) {
+      var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
+      if (preserved != null)
+        return preserved;
+      return rawClassName;
+    },
+    _Universe_findRule: function(universe, targetType) {
+      var rule = universe.tR[targetType];
+      for (; typeof rule == "string";)
+        rule = universe.tR[rule];
+      return rule;
+    },
+    _Universe_findErasedType: function(universe, cls) {
+      var $length, erased, $arguments, i, $interface,
+        metadata = universe.eT,
+        probe = metadata[cls];
+      if (probe == null)
+        return H._Universe_eval(universe, cls, false);
+      else if (typeof probe == "number") {
+        $length = probe;
+        erased = H._Universe__lookupTerminalRti(universe, 5, "#");
+        $arguments = [];
+        for (i = 0; i < $length; ++i)
+          $arguments.push(erased);
+        $interface = H._Universe__lookupInterfaceRti(universe, cls, $arguments);
+        metadata[cls] = $interface;
+        return $interface;
+      } else
+        return probe;
+    },
+    _Universe_addRules: function(universe, rules) {
+      return H._Utils_objectAssign(universe.tR, rules);
+    },
+    _Universe_addErasedTypes: function(universe, types) {
+      return H._Utils_objectAssign(universe.eT, types);
+    },
+    _Universe_eval: function(universe, recipe, normalize) {
+      var rti,
+        cache = universe.eC,
+        probe = cache.get(recipe);
+      if (probe != null)
+        return probe;
+      rti = H._Parser_parse(H._Parser_create(universe, null, recipe, normalize));
+      cache.set(recipe, rti);
+      return rti;
+    },
+    _Universe_evalInEnvironment: function(universe, environment, recipe) {
+      var probe, rti,
+        cache = environment._evalCache;
+      if (cache == null)
+        cache = environment._evalCache = new Map();
+      probe = cache.get(recipe);
+      if (probe != null)
+        return probe;
+      rti = H._Parser_parse(H._Parser_create(universe, environment, recipe, true));
+      cache.set(recipe, rti);
+      return rti;
+    },
+    _Universe_bind: function(universe, environment, argumentsRti) {
+      var argumentsRecipe, probe, rti,
+        cache = environment._bindCache;
+      if (cache == null)
+        cache = environment._bindCache = new Map();
+      argumentsRecipe = argumentsRti._canonicalRecipe;
+      probe = cache.get(argumentsRecipe);
+      if (probe != null)
+        return probe;
+      rti = H._Universe__lookupBindingRti(universe, environment, argumentsRti._kind === 10 ? argumentsRti._rest : [argumentsRti]);
+      cache.set(argumentsRecipe, rti);
+      return rti;
+    },
+    _Universe__installTypeTests: function(universe, rti) {
+      rti._as = H._installSpecializedAsCheck;
+      rti._is = H._installSpecializedIsTest;
+      return rti;
+    },
+    _Universe__lookupTerminalRti: function(universe, kind, key) {
+      var rti, t1,
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = kind;
+      rti._canonicalRecipe = key;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__lookupStarRti: function(universe, baseType, normalize) {
+      var t1,
+        key = baseType._canonicalRecipe + "*",
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      t1 = H._Universe__createStarRti(universe, baseType, key, normalize);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__createStarRti: function(universe, baseType, key, normalize) {
+      var baseKind, t1, rti;
+      if (normalize) {
+        baseKind = baseType._kind;
+        if (!H.isStrongTopType(baseType))
+          t1 = baseType === type$.Null || baseType === type$.JSNull || baseKind === 7 || baseKind === 6;
+        else
+          t1 = true;
+        if (t1)
+          return baseType;
+      }
+      rti = new H.Rti(null, null);
+      rti._kind = 6;
+      rti._primary = baseType;
+      rti._canonicalRecipe = key;
+      return H._Universe__installTypeTests(universe, rti);
+    },
+    _Universe__lookupQuestionRti: function(universe, baseType, normalize) {
+      var t1,
+        key = baseType._canonicalRecipe + "?",
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      t1 = H._Universe__createQuestionRti(universe, baseType, key, normalize);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__createQuestionRti: function(universe, baseType, key, normalize) {
+      var baseKind, t1, starArgument, rti;
+      if (normalize) {
+        baseKind = baseType._kind;
+        if (!H.isStrongTopType(baseType))
+          if (!(baseType === type$.Null || baseType === type$.JSNull))
+            if (baseKind !== 7)
+              t1 = baseKind === 8 && H.isNullable(baseType._primary);
+            else
+              t1 = true;
+          else
+            t1 = true;
+        else
+          t1 = true;
+        if (t1)
+          return baseType;
+        else if (baseKind === 1 || baseType === type$.legacy_Never)
+          return type$.Null;
+        else if (baseKind === 6) {
+          starArgument = baseType._primary;
+          if (starArgument._kind === 8 && H.isNullable(starArgument._primary))
+            return starArgument;
+          else
+            return H.Rti__getQuestionFromStar(universe, baseType);
+        }
+      }
+      rti = new H.Rti(null, null);
+      rti._kind = 7;
+      rti._primary = baseType;
+      rti._canonicalRecipe = key;
+      return H._Universe__installTypeTests(universe, rti);
+    },
+    _Universe__lookupFutureOrRti: function(universe, baseType, normalize) {
+      var t1,
+        key = baseType._canonicalRecipe + "/",
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      t1 = H._Universe__createFutureOrRti(universe, baseType, key, normalize);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__createFutureOrRti: function(universe, baseType, key, normalize) {
+      var t1, t2, rti;
+      if (normalize) {
+        t1 = baseType._kind;
+        if (!H.isStrongTopType(baseType))
+          if (!(baseType === type$.legacy_Object))
+            t2 = baseType === type$.Object;
+          else
+            t2 = true;
+        else
+          t2 = true;
+        if (t2 || baseType === type$.Object)
+          return baseType;
+        else if (t1 === 1)
+          return H._Universe__lookupInterfaceRti(universe, "Future", [baseType]);
+        else if (baseType === type$.Null || baseType === type$.JSNull)
+          return type$.nullable_Future_Null;
+      }
+      rti = new H.Rti(null, null);
+      rti._kind = 8;
+      rti._primary = baseType;
+      rti._canonicalRecipe = key;
+      return H._Universe__installTypeTests(universe, rti);
+    },
+    _Universe__lookupGenericFunctionParameterRti: function(universe, index) {
+      var rti, t1,
+        key = "" + index + "^",
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = 13;
+      rti._primary = index;
+      rti._canonicalRecipe = key;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__canonicalRecipeJoin: function($arguments) {
+      var s, sep, i,
+        $length = $arguments.length;
+      for (s = "", sep = "", i = 0; i < $length; ++i, sep = ",")
+        s += sep + $arguments[i]._canonicalRecipe;
+      return s;
+    },
+    _Universe__canonicalRecipeJoinNamed: function($arguments) {
+      var s, sep, i, t1, nameSep, s0,
+        $length = $arguments.length;
+      for (s = "", sep = "", i = 0; i < $length; i += 3, sep = ",") {
+        t1 = $arguments[i];
+        nameSep = $arguments[i + 1] ? "!" : ":";
+        s0 = $arguments[i + 2]._canonicalRecipe;
+        s += sep + t1 + nameSep + s0;
+      }
+      return s;
+    },
+    _Universe__lookupInterfaceRti: function(universe, $name, $arguments) {
+      var probe, rti, t1,
+        s = $name;
+      if ($arguments.length !== 0)
+        s += "<" + H._Universe__canonicalRecipeJoin($arguments) + ">";
+      probe = universe.eC.get(s);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = 9;
+      rti._primary = $name;
+      rti._rest = $arguments;
+      if ($arguments.length > 0)
+        rti._precomputed1 = $arguments[0];
+      rti._canonicalRecipe = s;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(s, t1);
+      return t1;
+    },
+    _Universe__lookupBindingRti: function(universe, base, $arguments) {
+      var newBase, newArguments, key, probe, rti, t1;
+      if (base._kind === 10) {
+        newBase = base._primary;
+        newArguments = base._rest.concat($arguments);
+      } else {
+        newArguments = $arguments;
+        newBase = base;
+      }
+      key = newBase._canonicalRecipe + (";<" + H._Universe__canonicalRecipeJoin(newArguments) + ">");
+      probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = 10;
+      rti._primary = newBase;
+      rti._rest = newArguments;
+      rti._canonicalRecipe = key;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__lookupFunctionRti: function(universe, returnType, parameters) {
+      var sep, t1, key, probe, rti,
+        s = returnType._canonicalRecipe,
+        requiredPositional = parameters._requiredPositional,
+        requiredPositionalLength = requiredPositional.length,
+        optionalPositional = parameters._optionalPositional,
+        optionalPositionalLength = optionalPositional.length,
+        named = parameters._named,
+        namedLength = named.length,
+        recipe = "(" + H._Universe__canonicalRecipeJoin(requiredPositional);
+      if (optionalPositionalLength > 0) {
+        sep = requiredPositionalLength > 0 ? "," : "";
+        t1 = H._Universe__canonicalRecipeJoin(optionalPositional);
+        recipe += sep + "[" + t1 + "]";
+      }
+      if (namedLength > 0) {
+        sep = requiredPositionalLength > 0 ? "," : "";
+        t1 = H._Universe__canonicalRecipeJoinNamed(named);
+        recipe += sep + "{" + t1 + "}";
+      }
+      key = s + (recipe + ")");
+      probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = 11;
+      rti._primary = returnType;
+      rti._rest = parameters;
+      rti._canonicalRecipe = key;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__lookupGenericFunctionRti: function(universe, baseFunctionType, bounds, normalize) {
+      var t1,
+        key = baseFunctionType._canonicalRecipe + ("<" + H._Universe__canonicalRecipeJoin(bounds) + ">"),
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      t1 = H._Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__createGenericFunctionRti: function(universe, baseFunctionType, bounds, key, normalize) {
+      var $length, typeArguments, count, i, bound, substitutedBase, substitutedBounds, rti;
+      if (normalize) {
+        $length = bounds.length;
+        typeArguments = new Array($length);
+        for (count = 0, i = 0; i < $length; ++i) {
+          bound = bounds[i];
+          if (bound._kind === 1) {
+            typeArguments[i] = bound;
+            ++count;
+          }
+        }
+        if (count > 0) {
+          substitutedBase = H._substitute(universe, baseFunctionType, typeArguments, 0);
+          substitutedBounds = H._substituteArray(universe, bounds, typeArguments, 0);
+          return H._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, bounds !== substitutedBounds);
+        }
+      }
+      rti = new H.Rti(null, null);
+      rti._kind = 12;
+      rti._primary = baseFunctionType;
+      rti._rest = bounds;
+      rti._canonicalRecipe = key;
+      return H._Universe__installTypeTests(universe, rti);
+    },
+    _Parser_create: function(universe, environment, recipe, normalize) {
+      return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
+    },
+    _Parser_parse: function(parser) {
+      var t1, i, ch, universe, array, head, base, u, parameters, optionalPositional, named, item,
+        source = parser.r,
+        stack = parser.s;
+      for (t1 = source.length, i = 0; i < t1;) {
+        ch = source.charCodeAt(i);
+        if (ch >= 48 && ch <= 57)
+          i = H._Parser_handleDigit(i + 1, ch, source, stack);
+        else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36)
+          i = H._Parser_handleIdentifier(parser, i, source, stack, false);
+        else if (ch === 46)
+          i = H._Parser_handleIdentifier(parser, i, source, stack, true);
+        else {
+          ++i;
+          switch (ch) {
+            case 44:
+              break;
+            case 58:
+              stack.push(false);
+              break;
+            case 33:
+              stack.push(true);
+              break;
+            case 59:
+              stack.push(H._Parser_toType(parser.u, parser.e, stack.pop()));
+              break;
+            case 94:
+              stack.push(H._Universe__lookupGenericFunctionParameterRti(parser.u, stack.pop()));
+              break;
+            case 35:
+              stack.push(H._Universe__lookupTerminalRti(parser.u, 5, "#"));
+              break;
+            case 64:
+              stack.push(H._Universe__lookupTerminalRti(parser.u, 2, "@"));
+              break;
+            case 126:
+              stack.push(H._Universe__lookupTerminalRti(parser.u, 3, "~"));
+              break;
+            case 60:
+              stack.push(parser.p);
+              parser.p = stack.length;
+              break;
+            case 62:
+              universe = parser.u;
+              array = stack.splice(parser.p);
+              H._Parser_toTypes(parser.u, parser.e, array);
+              parser.p = stack.pop();
+              head = stack.pop();
+              if (typeof head == "string")
+                stack.push(H._Universe__lookupInterfaceRti(universe, head, array));
+              else {
+                base = H._Parser_toType(universe, parser.e, head);
+                switch (base._kind) {
+                  case 11:
+                    stack.push(H._Universe__lookupGenericFunctionRti(universe, base, array, parser.n));
+                    break;
+                  default:
+                    stack.push(H._Universe__lookupBindingRti(universe, base, array));
+                    break;
+                }
+              }
+              break;
+            case 38:
+              H._Parser_handleExtendedOperations(parser, stack);
+              break;
+            case 42:
+              u = parser.u;
+              stack.push(H._Universe__lookupStarRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              break;
+            case 63:
+              u = parser.u;
+              stack.push(H._Universe__lookupQuestionRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              break;
+            case 47:
+              u = parser.u;
+              stack.push(H._Universe__lookupFutureOrRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              break;
+            case 40:
+              stack.push(parser.p);
+              parser.p = stack.length;
+              break;
+            case 41:
+              universe = parser.u;
+              parameters = new H._FunctionParameters();
+              optionalPositional = universe.sEA;
+              named = universe.sEA;
+              head = stack.pop();
+              if (typeof head == "number")
+                switch (head) {
+                  case -1:
+                    optionalPositional = stack.pop();
+                    break;
+                  case -2:
+                    named = stack.pop();
+                    break;
+                  default:
+                    stack.push(head);
+                    break;
+                }
+              else
+                stack.push(head);
+              array = stack.splice(parser.p);
+              H._Parser_toTypes(parser.u, parser.e, array);
+              parser.p = stack.pop();
+              parameters._requiredPositional = array;
+              parameters._optionalPositional = optionalPositional;
+              parameters._named = named;
+              stack.push(H._Universe__lookupFunctionRti(universe, H._Parser_toType(universe, parser.e, stack.pop()), parameters));
+              break;
+            case 91:
+              stack.push(parser.p);
+              parser.p = stack.length;
+              break;
+            case 93:
+              array = stack.splice(parser.p);
+              H._Parser_toTypes(parser.u, parser.e, array);
+              parser.p = stack.pop();
+              stack.push(array);
+              stack.push(-1);
+              break;
+            case 123:
+              stack.push(parser.p);
+              parser.p = stack.length;
+              break;
+            case 125:
+              array = stack.splice(parser.p);
+              H._Parser_toTypesNamed(parser.u, parser.e, array);
+              parser.p = stack.pop();
+              stack.push(array);
+              stack.push(-2);
+              break;
+            default:
+              throw "Bad character " + ch;
+          }
+        }
+      }
+      item = stack.pop();
+      return H._Parser_toType(parser.u, parser.e, item);
+    },
+    _Parser_handleDigit: function(i, digit, source, stack) {
+      var t1, ch,
+        value = digit - 48;
+      for (t1 = source.length; i < t1; ++i) {
+        ch = source.charCodeAt(i);
+        if (!(ch >= 48 && ch <= 57))
+          break;
+        value = value * 10 + (ch - 48);
+      }
+      stack.push(value);
+      return i;
+    },
+    _Parser_handleIdentifier: function(parser, start, source, stack, hasPeriod) {
+      var t1, ch, t2, string, environment, recipe,
+        i = start + 1;
+      for (t1 = source.length; i < t1; ++i) {
+        ch = source.charCodeAt(i);
+        if (ch === 46) {
+          if (hasPeriod)
+            break;
+          hasPeriod = true;
+        } else {
+          if (!((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36))
+            t2 = ch >= 48 && ch <= 57;
+          else
+            t2 = true;
+          if (!t2)
+            break;
+        }
+      }
+      string = source.substring(start, i);
+      if (hasPeriod) {
+        t1 = parser.u;
+        environment = parser.e;
+        if (environment._kind === 10)
+          environment = environment._primary;
+        recipe = H._Universe_findRule(t1, environment._primary)[string];
+        if (recipe == null)
+          H.throwExpression('No "' + string + '" in "' + H.Rti__getCanonicalRecipe(environment) + '"');
+        stack.push(H._Universe_evalInEnvironment(t1, environment, recipe));
+      } else
+        stack.push(string);
+      return i;
+    },
+    _Parser_handleExtendedOperations: function(parser, stack) {
+      var $top = stack.pop();
+      if (0 === $top) {
+        stack.push(H._Universe__lookupTerminalRti(parser.u, 1, "0&"));
+        return;
+      }
+      if (1 === $top) {
+        stack.push(H._Universe__lookupTerminalRti(parser.u, 4, "1&"));
+        return;
+      }
+      throw H.wrapException(P.AssertionError$("Unexpected extended operation " + H.S($top)));
+    },
+    _Parser_toType: function(universe, environment, item) {
+      if (typeof item == "string")
+        return H._Universe__lookupInterfaceRti(universe, item, universe.sEA);
+      else if (typeof item == "number")
+        return H._Parser_indexToType(universe, environment, item);
+      else
+        return item;
+    },
+    _Parser_toTypes: function(universe, environment, items) {
+      var i,
+        $length = items.length;
+      for (i = 0; i < $length; ++i)
+        items[i] = H._Parser_toType(universe, environment, items[i]);
+    },
+    _Parser_toTypesNamed: function(universe, environment, items) {
+      var i,
+        $length = items.length;
+      for (i = 2; i < $length; i += 3)
+        items[i] = H._Parser_toType(universe, environment, items[i]);
+    },
+    _Parser_indexToType: function(universe, environment, index) {
+      var typeArguments, len,
+        kind = environment._kind;
+      if (kind === 10) {
+        if (index === 0)
+          return environment._primary;
+        typeArguments = environment._rest;
+        len = typeArguments.length;
+        if (index <= len)
+          return typeArguments[index - 1];
+        index -= len;
+        environment = environment._primary;
+        kind = environment._kind;
+      } else if (index === 0)
+        return environment;
+      if (kind !== 9)
+        throw H.wrapException(P.AssertionError$("Indexed base must be an interface type"));
+      typeArguments = environment._rest;
+      if (index <= typeArguments.length)
+        return typeArguments[index - 1];
+      throw H.wrapException(P.AssertionError$("Bad index " + index + " for " + environment.toString$0(0)));
+    },
+    _isSubtype: function(universe, s, sEnv, t, tEnv) {
+      var t1, sKind, leftTypeVariable, tKind, sBounds, tBounds, sLength, i, sBound, tBound;
+      if (s === t)
+        return true;
+      if (!H.isStrongTopType(t))
+        if (!(t === type$.legacy_Object))
+          t1 = t === type$.Object;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      if (t1)
+        return true;
+      sKind = s._kind;
+      if (sKind === 4)
+        return true;
+      if (H.isStrongTopType(s))
+        return false;
+      if (s._kind !== 1)
+        t1 = s === type$.Null || s === type$.JSNull;
+      else
+        t1 = true;
+      if (t1)
+        return true;
+      leftTypeVariable = sKind === 13;
+      if (leftTypeVariable)
+        if (H._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv))
+          return true;
+      tKind = t._kind;
+      if (sKind === 6)
+        return H._isSubtype(universe, s._primary, sEnv, t, tEnv);
+      if (tKind === 6) {
+        t1 = t._primary;
+        return H._isSubtype(universe, s, sEnv, t1, tEnv);
+      }
+      if (sKind === 8) {
+        if (!H._isSubtype(universe, s._primary, sEnv, t, tEnv))
+          return false;
+        return H._isSubtype(universe, H.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv);
+      }
+      if (sKind === 7) {
+        t1 = H._isSubtype(universe, s._primary, sEnv, t, tEnv);
+        return t1;
+      }
+      if (tKind === 8) {
+        if (H._isSubtype(universe, s, sEnv, t._primary, tEnv))
+          return true;
+        return H._isSubtype(universe, s, sEnv, H.Rti__getFutureFromFutureOr(universe, t), tEnv);
+      }
+      if (tKind === 7) {
+        t1 = H._isSubtype(universe, s, sEnv, t._primary, tEnv);
+        return t1;
+      }
+      if (leftTypeVariable)
+        return false;
+      t1 = sKind !== 11;
+      if ((!t1 || sKind === 12) && t === type$.Function)
+        return true;
+      if (tKind === 12) {
+        if (s === type$.JavaScriptFunction)
+          return true;
+        if (sKind !== 12)
+          return false;
+        sBounds = s._rest;
+        tBounds = t._rest;
+        sLength = sBounds.length;
+        if (sLength !== tBounds.length)
+          return false;
+        sEnv = sEnv == null ? sBounds : sBounds.concat(sEnv);
+        tEnv = tEnv == null ? tBounds : tBounds.concat(tEnv);
+        for (i = 0; i < sLength; ++i) {
+          sBound = sBounds[i];
+          tBound = tBounds[i];
+          if (!H._isSubtype(universe, sBound, sEnv, tBound, tEnv) || !H._isSubtype(universe, tBound, tEnv, sBound, sEnv))
+            return false;
+        }
+        return H._isFunctionSubtype(universe, s._primary, sEnv, t._primary, tEnv);
+      }
+      if (tKind === 11) {
+        if (s === type$.JavaScriptFunction)
+          return true;
+        if (t1)
+          return false;
+        return H._isFunctionSubtype(universe, s, sEnv, t, tEnv);
+      }
+      if (sKind === 9) {
+        if (tKind !== 9)
+          return false;
+        return H._isInterfaceSubtype(universe, s, sEnv, t, tEnv);
+      }
+      return false;
+    },
+    _isFunctionSubtype: function(universe, s, sEnv, t, tEnv) {
+      var sParameters, tParameters, sRequiredPositional, tRequiredPositional, sRequiredPositionalLength, tRequiredPositionalLength, requiredPositionalDelta, sOptionalPositional, tOptionalPositional, sOptionalPositionalLength, tOptionalPositionalLength, i, t1, sNamed, tNamed, sNamedLength, tNamedLength, sIndex, tIndex, tName, sName;
+      if (!H._isSubtype(universe, s._primary, sEnv, t._primary, tEnv))
+        return false;
+      sParameters = s._rest;
+      tParameters = t._rest;
+      sRequiredPositional = sParameters._requiredPositional;
+      tRequiredPositional = tParameters._requiredPositional;
+      sRequiredPositionalLength = sRequiredPositional.length;
+      tRequiredPositionalLength = tRequiredPositional.length;
+      if (sRequiredPositionalLength > tRequiredPositionalLength)
+        return false;
+      requiredPositionalDelta = tRequiredPositionalLength - sRequiredPositionalLength;
+      sOptionalPositional = sParameters._optionalPositional;
+      tOptionalPositional = tParameters._optionalPositional;
+      sOptionalPositionalLength = sOptionalPositional.length;
+      tOptionalPositionalLength = tOptionalPositional.length;
+      if (sRequiredPositionalLength + sOptionalPositionalLength < tRequiredPositionalLength + tOptionalPositionalLength)
+        return false;
+      for (i = 0; i < sRequiredPositionalLength; ++i) {
+        t1 = sRequiredPositional[i];
+        if (!H._isSubtype(universe, tRequiredPositional[i], tEnv, t1, sEnv))
+          return false;
+      }
+      for (i = 0; i < requiredPositionalDelta; ++i) {
+        t1 = sOptionalPositional[i];
+        if (!H._isSubtype(universe, tRequiredPositional[sRequiredPositionalLength + i], tEnv, t1, sEnv))
+          return false;
+      }
+      for (i = 0; i < tOptionalPositionalLength; ++i) {
+        t1 = sOptionalPositional[requiredPositionalDelta + i];
+        if (!H._isSubtype(universe, tOptionalPositional[i], tEnv, t1, sEnv))
+          return false;
+      }
+      sNamed = sParameters._named;
+      tNamed = tParameters._named;
+      sNamedLength = sNamed.length;
+      tNamedLength = tNamed.length;
+      for (sIndex = 0, tIndex = 0; tIndex < tNamedLength; tIndex += 3) {
+        tName = tNamed[tIndex];
+        for (; true;) {
+          if (sIndex >= sNamedLength)
+            return false;
+          sName = sNamed[sIndex];
+          sIndex += 3;
+          if (tName < sName)
+            return false;
+          if (sName < tName)
+            continue;
+          t1 = sNamed[sIndex - 1];
+          if (!H._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv))
+            return false;
+          break;
+        }
+      }
+      return true;
+    },
+    _isInterfaceSubtype: function(universe, s, sEnv, t, tEnv) {
+      var sArgs, tArgs, $length, i, t1, t2, rule, supertypeArgs,
+        sName = s._primary,
+        tName = t._primary;
+      if (sName === tName) {
+        sArgs = s._rest;
+        tArgs = t._rest;
+        $length = sArgs.length;
+        for (i = 0; i < $length; ++i) {
+          t1 = sArgs[i];
+          t2 = tArgs[i];
+          if (!H._isSubtype(universe, t1, sEnv, t2, tEnv))
+            return false;
+        }
+        return true;
+      }
+      if (t === type$.Object)
+        return true;
+      rule = H._Universe_findRule(universe, sName);
+      if (rule == null)
+        return false;
+      supertypeArgs = rule[tName];
+      if (supertypeArgs == null)
+        return false;
+      $length = supertypeArgs.length;
+      tArgs = t._rest;
+      for (i = 0; i < $length; ++i)
+        if (!H._isSubtype(universe, H._Universe_evalInEnvironment(universe, s, supertypeArgs[i]), sEnv, tArgs[i], tEnv))
+          return false;
+      return true;
+    },
+    isNullable: function(t) {
+      var t1,
+        kind = t._kind;
+      if (!(t === type$.Null || t === type$.JSNull))
+        if (!H.isStrongTopType(t))
+          if (kind !== 7)
+            if (!(kind === 6 && H.isNullable(t._primary)))
+              t1 = kind === 8 && H.isNullable(t._primary);
+            else
+              t1 = true;
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    isTopType: function(t) {
+      var t1;
+      if (!H.isStrongTopType(t))
+        if (!(t === type$.legacy_Object))
+          t1 = t === type$.Object;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    isStrongTopType: function(t) {
+      var kind = t._kind;
+      return kind === 2 || kind === 3 || kind === 4 || kind === 5 || t === type$.nullable_Object;
+    },
+    _Utils_objectAssign: function(o, other) {
+      var i, key,
+        keys = Object.keys(other),
+        $length = keys.length;
+      for (i = 0; i < $length; ++i) {
+        key = keys[i];
+        o[key] = other[key];
+      }
+    },
+    Rti: function Rti(t0, t1) {
+      var _ = this;
+      _._as = t0;
+      _._is = t1;
+      _._cachedRuntimeType = _._specializedTestResource = _._precomputed1 = null;
+      _._kind = 0;
+      _._canonicalRecipe = _._bindCache = _._evalCache = _._rest = _._primary = null;
+    },
+    _FunctionParameters: function _FunctionParameters() {
+      this._named = this._optionalPositional = this._requiredPositional = null;
+    },
+    _Type: function _Type(t0) {
+      this._rti = t0;
+    },
+    _Error: function _Error() {
+    },
+    _TypeError: function _TypeError(t0) {
+      this._message = t0;
+    },
+    unmangleGlobalNameIfPreservedAnyways: function($name) {
+      return init.mangledGlobalNames[$name];
+    },
+    printString: function(string) {
+      if (typeof dartPrint == "function") {
+        dartPrint(string);
+        return;
+      }
+      if (typeof console == "object" && typeof console.log != "undefined") {
+        console.log(string);
+        return;
+      }
+      if (typeof window == "object")
+        return;
+      if (typeof print == "function") {
+        print(string);
+        return;
+      }
+      throw "Unable to print message: " + String(string);
+    }
+  },
+  J = {
+    makeDispatchRecord: function(interceptor, proto, extension, indexability) {
+      return {i: interceptor, p: proto, e: extension, x: indexability};
+    },
+    getNativeInterceptor: function(object) {
+      var proto, objectProto, $constructor, interceptor,
+        record = object[init.dispatchPropertyName];
+      if (record == null)
+        if ($.initNativeDispatchFlag == null) {
+          H.initNativeDispatch();
+          record = object[init.dispatchPropertyName];
+        }
+      if (record != null) {
+        proto = record.p;
+        if (false === proto)
+          return record.i;
+        if (true === proto)
+          return object;
+        objectProto = Object.getPrototypeOf(object);
+        if (proto === objectProto)
+          return record.i;
+        if (record.e === objectProto)
+          throw H.wrapException(P.UnimplementedError$("Return interceptor for " + H.S(proto(object, record))));
+      }
+      $constructor = object.constructor;
+      interceptor = $constructor == null ? null : $constructor[J.JS_INTEROP_INTERCEPTOR_TAG()];
+      if (interceptor != null)
+        return interceptor;
+      interceptor = H.lookupAndCacheInterceptor(object);
+      if (interceptor != null)
+        return interceptor;
+      if (typeof object == "function")
+        return C.JavaScriptFunction_methods;
+      proto = Object.getPrototypeOf(object);
+      if (proto == null)
+        return C.PlainJavaScriptObject_methods;
+      if (proto === Object.prototype)
+        return C.PlainJavaScriptObject_methods;
+      if (typeof $constructor == "function") {
+        Object.defineProperty($constructor, J.JS_INTEROP_INTERCEPTOR_TAG(), {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
+        return C.UnknownJavaScriptObject_methods;
+      }
+      return C.UnknownJavaScriptObject_methods;
+    },
+    JS_INTEROP_INTERCEPTOR_TAG: function() {
+      var t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
+      return t1 == null ? $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js") : t1;
+    },
+    JSArray_JSArray$fixed: function($length, $E) {
+      if (!H._isInt($length))
+        throw H.wrapException(P.ArgumentError$value($length, "length", "is not an integer"));
+      if ($length < 0 || $length > 4294967295)
+        throw H.wrapException(P.RangeError$range($length, 0, 4294967295, "length", null));
+      return J.JSArray_JSArray$markFixed(new Array($length), $E);
+    },
+    JSArray_JSArray$growable: function($length, $E) {
+      if (!H._isInt($length) || $length < 0)
+        throw H.wrapException(P.ArgumentError$("Length must be a non-negative integer: " + H.S($length)));
+      return H.setRuntimeTypeInfo(new Array($length), $E._eval$1("JSArray<0>"));
+    },
+    JSArray_JSArray$markFixed: function(allocation, $E) {
+      return J.JSArray_markFixedList(H.setRuntimeTypeInfo(allocation, $E._eval$1("JSArray<0>")));
+    },
+    JSArray_markFixedList: function(list) {
+      list.fixed$length = Array;
+      return list;
+    },
+    JSArray_markUnmodifiableList: function(list) {
+      list.fixed$length = Array;
+      list.immutable$list = Array;
+      return list;
+    },
+    JSArray__compareAny: function(a, b) {
+      return J.compareTo$1$ns(a, b);
+    },
+    JSString__isWhitespace: function(codeUnit) {
+      if (codeUnit < 256)
+        switch (codeUnit) {
+          case 9:
+          case 10:
+          case 11:
+          case 12:
+          case 13:
+          case 32:
+          case 133:
+          case 160:
+            return true;
+          default:
+            return false;
+        }
+      switch (codeUnit) {
+        case 5760:
+        case 8192:
+        case 8193:
+        case 8194:
+        case 8195:
+        case 8196:
+        case 8197:
+        case 8198:
+        case 8199:
+        case 8200:
+        case 8201:
+        case 8202:
+        case 8232:
+        case 8233:
+        case 8239:
+        case 8287:
+        case 12288:
+        case 65279:
+          return true;
+        default:
+          return false;
+      }
+    },
+    JSString__skipLeadingWhitespace: function(string, index) {
+      var t1, codeUnit;
+      for (t1 = string.length; index < t1;) {
+        codeUnit = C.JSString_methods._codeUnitAt$1(string, index);
+        if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+          break;
+        ++index;
+      }
+      return index;
+    },
+    JSString__skipTrailingWhitespace: function(string, index) {
+      var index0, codeUnit;
+      for (; index > 0; index = index0) {
+        index0 = index - 1;
+        codeUnit = C.JSString_methods.codeUnitAt$1(string, index0);
+        if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+          break;
+      }
+      return index;
+    },
+    getInterceptor$: function(receiver) {
+      if (typeof receiver == "number") {
+        if (Math.floor(receiver) == receiver)
+          return J.JSInt.prototype;
+        return J.JSDouble.prototype;
+      }
+      if (typeof receiver == "string")
+        return J.JSString.prototype;
+      if (receiver == null)
+        return J.JSNull.prototype;
+      if (typeof receiver == "boolean")
+        return J.JSBool.prototype;
+      if (receiver.constructor == Array)
+        return J.JSArray.prototype;
+      if (typeof receiver != "object") {
+        if (typeof receiver == "function")
+          return J.JavaScriptFunction.prototype;
+        return receiver;
+      }
+      if (receiver instanceof P.Object)
+        return receiver;
+      return J.getNativeInterceptor(receiver);
+    },
+    getInterceptor$ansx: function(receiver) {
+      if (typeof receiver == "number")
+        return J.JSNumber.prototype;
+      if (typeof receiver == "string")
+        return J.JSString.prototype;
+      if (receiver == null)
+        return receiver;
+      if (receiver.constructor == Array)
+        return J.JSArray.prototype;
+      if (typeof receiver != "object") {
+        if (typeof receiver == "function")
+          return J.JavaScriptFunction.prototype;
+        return receiver;
+      }
+      if (receiver instanceof P.Object)
+        return receiver;
+      return J.getNativeInterceptor(receiver);
+    },
+    getInterceptor$asx: function(receiver) {
+      if (typeof receiver == "string")
+        return J.JSString.prototype;
+      if (receiver == null)
+        return receiver;
+      if (receiver.constructor == Array)
+        return J.JSArray.prototype;
+      if (typeof receiver != "object") {
+        if (typeof receiver == "function")
+          return J.JavaScriptFunction.prototype;
+        return receiver;
+      }
+      if (receiver instanceof P.Object)
+        return receiver;
+      return J.getNativeInterceptor(receiver);
+    },
+    getInterceptor$ax: function(receiver) {
+      if (receiver == null)
+        return receiver;
+      if (receiver.constructor == Array)
+        return J.JSArray.prototype;
+      if (typeof receiver != "object") {
+        if (typeof receiver == "function")
+          return J.JavaScriptFunction.prototype;
+        return receiver;
+      }
+      if (receiver instanceof P.Object)
+        return receiver;
+      return J.getNativeInterceptor(receiver);
+    },
+    getInterceptor$n: function(receiver) {
+      if (typeof receiver == "number")
+        return J.JSNumber.prototype;
+      if (receiver == null)
+        return receiver;
+      if (!(receiver instanceof P.Object))
+        return J.UnknownJavaScriptObject.prototype;
+      return receiver;
+    },
+    getInterceptor$ns: function(receiver) {
+      if (typeof receiver == "number")
+        return J.JSNumber.prototype;
+      if (typeof receiver == "string")
+        return J.JSString.prototype;
+      if (receiver == null)
+        return receiver;
+      if (!(receiver instanceof P.Object))
+        return J.UnknownJavaScriptObject.prototype;
+      return receiver;
+    },
+    getInterceptor$s: function(receiver) {
+      if (typeof receiver == "string")
+        return J.JSString.prototype;
+      if (receiver == null)
+        return receiver;
+      if (!(receiver instanceof P.Object))
+        return J.UnknownJavaScriptObject.prototype;
+      return receiver;
+    },
+    getInterceptor$u: function(receiver) {
+      if (receiver == null)
+        return J.JSNull.prototype;
+      if (!(receiver instanceof P.Object))
+        return J.UnknownJavaScriptObject.prototype;
+      return receiver;
+    },
+    getInterceptor$x: function(receiver) {
+      if (receiver == null)
+        return receiver;
+      if (typeof receiver != "object") {
+        if (typeof receiver == "function")
+          return J.JavaScriptFunction.prototype;
+        return receiver;
+      }
+      if (receiver instanceof P.Object)
+        return receiver;
+      return J.getNativeInterceptor(receiver);
+    },
+    getInterceptor$z: function(receiver) {
+      if (receiver == null)
+        return receiver;
+      if (!(receiver instanceof P.Object))
+        return J.UnknownJavaScriptObject.prototype;
+      return receiver;
+    },
+    set$FALSE$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$FALSE(receiver, value);
+    },
+    set$NULL$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$NULL(receiver, value);
+    },
+    set$TRUE$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$TRUE(receiver, value);
+    },
+    set$cli_pkg_main_0_$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$cli_pkg_main_0_(receiver, value);
+    },
+    set$context$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$context(receiver, value);
+    },
+    set$dartValue$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$dartValue(receiver, value);
+    },
+    set$exitCode$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$exitCode(receiver, value);
+    },
+    set$info$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$info(receiver, value);
+    },
+    set$length$asx: function(receiver, value) {
+      return J.getInterceptor$asx(receiver).set$length(receiver, value);
+    },
+    set$render$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$render(receiver, value);
+    },
+    set$renderSync$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$renderSync(receiver, value);
+    },
+    set$types$x: function(receiver, value) {
+      return J.getInterceptor$x(receiver).set$types(receiver, value);
+    },
+    get$code$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$code(receiver);
+    },
+    get$current$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$current(receiver);
+    },
+    get$dartValue$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$dartValue(receiver);
+    },
+    get$end$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$end(receiver);
+    },
+    get$env$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$env(receiver);
+    },
+    get$exitCode$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$exitCode(receiver);
+    },
+    get$fiber$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$fiber(receiver);
+    },
+    get$file$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$file(receiver);
+    },
+    get$first$ax: function(receiver) {
+      return J.getInterceptor$ax(receiver).get$first(receiver);
+    },
+    get$hashCode$: function(receiver) {
+      return J.getInterceptor$(receiver).get$hashCode(receiver);
+    },
+    get$isEmpty$asx: function(receiver) {
+      return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
+    },
+    get$isNotEmpty$asx: function(receiver) {
+      return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
+    },
+    get$isTTY$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$isTTY(receiver);
+    },
+    get$iterator$ax: function(receiver) {
+      return J.getInterceptor$ax(receiver).get$iterator(receiver);
+    },
+    get$keys$z: function(receiver) {
+      return J.getInterceptor$z(receiver).get$keys(receiver);
+    },
+    get$last$ax: function(receiver) {
+      return J.getInterceptor$ax(receiver).get$last(receiver);
+    },
+    get$length$asx: function(receiver) {
+      return J.getInterceptor$asx(receiver).get$length(receiver);
+    },
+    get$message$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$message(receiver);
+    },
+    get$mtime$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$mtime(receiver);
+    },
+    get$options$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$options(receiver);
+    },
+    get$path$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$path(receiver);
+    },
+    get$platform$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$platform(receiver);
+    },
+    get$reversed$ax: function(receiver) {
+      return J.getInterceptor$ax(receiver).get$reversed(receiver);
+    },
+    get$runtimeType$u: function(receiver) {
+      return J.getInterceptor$u(receiver).get$runtimeType(receiver);
+    },
+    get$single$ax: function(receiver) {
+      return J.getInterceptor$ax(receiver).get$single(receiver);
+    },
+    get$sourceUrl$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$sourceUrl(receiver);
+    },
+    get$stderr$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$stderr(receiver);
+    },
+    get$stdin$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$stdin(receiver);
+    },
+    get$stdout$x: function(receiver) {
+      return J.getInterceptor$x(receiver).get$stdout(receiver);
+    },
+    get$values$z: function(receiver) {
+      return J.getInterceptor$z(receiver).get$values(receiver);
+    },
+    $add$ansx: function(receiver, a0) {
+      if (typeof receiver == "number" && typeof a0 == "number")
+        return receiver + a0;
+      return J.getInterceptor$ansx(receiver).$add(receiver, a0);
+    },
+    $eq$: function(receiver, a0) {
+      if (receiver == null)
+        return a0 == null;
+      if (typeof receiver != "object")
+        return a0 != null && receiver === a0;
+      return J.getInterceptor$(receiver).$eq(receiver, a0);
+    },
+    $index$asx: function(receiver, a0) {
+      if (typeof a0 === "number")
+        if (receiver.constructor == Array || typeof receiver == "string" || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
+          if (a0 >>> 0 === a0 && a0 < receiver.length)
+            return receiver[a0];
+      return J.getInterceptor$asx(receiver).$index(receiver, a0);
+    },
+    $indexSet$ax: function(receiver, a0, a1) {
+      if (typeof a0 === "number")
+        if ((receiver.constructor == Array || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName])) && !receiver.immutable$list && a0 >>> 0 === a0 && a0 < receiver.length)
+          return receiver[a0] = a1;
+      return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
+    },
+    _codeUnitAt$1$s: function(receiver, a0) {
+      return J.getInterceptor$s(receiver)._codeUnitAt$1(receiver, a0);
+    },
+    add$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).add$1(receiver, a0);
+    },
+    addAll$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).addAll$1(receiver, a0);
+    },
+    allMatches$1$s: function(receiver, a0) {
+      return J.getInterceptor$s(receiver).allMatches$1(receiver, a0);
+    },
+    allMatches$2$s: function(receiver, a0, a1) {
+      return J.getInterceptor$s(receiver).allMatches$2(receiver, a0, a1);
+    },
+    any$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).any$1(receiver, a0);
+    },
+    apply$2$x: function(receiver, a0, a1) {
+      return J.getInterceptor$x(receiver).apply$2(receiver, a0, a1);
+    },
+    cast$1$0$ax: function(receiver, $T1) {
+      return J.getInterceptor$ax(receiver).cast$1$0(receiver, $T1);
+    },
+    ceil$0$n: function(receiver) {
+      return J.getInterceptor$n(receiver).ceil$0(receiver);
+    },
+    clamp$2$n: function(receiver, a0, a1) {
+      return J.getInterceptor$n(receiver).clamp$2(receiver, a0, a1);
+    },
+    close$0$x: function(receiver) {
+      return J.getInterceptor$x(receiver).close$0(receiver);
+    },
+    codeUnitAt$1$s: function(receiver, a0) {
+      return J.getInterceptor$s(receiver).codeUnitAt$1(receiver, a0);
+    },
+    compareTo$1$ns: function(receiver, a0) {
+      return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
+    },
+    contains$1$asx: function(receiver, a0) {
+      return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
+    },
+    createInterface$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).createInterface$1(receiver, a0);
+    },
+    elementAt$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
+    },
+    endsWith$1$s: function(receiver, a0) {
+      return J.getInterceptor$s(receiver).endsWith$1(receiver, a0);
+    },
+    every$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).every$1(receiver, a0);
+    },
+    existsSync$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).existsSync$1(receiver, a0);
+    },
+    expand$1$1$ax: function(receiver, a0, $T1) {
+      return J.getInterceptor$ax(receiver).expand$1$1(receiver, a0, $T1);
+    },
+    fillRange$3$ax: function(receiver, a0, a1, a2) {
+      return J.getInterceptor$ax(receiver).fillRange$3(receiver, a0, a1, a2);
+    },
+    floor$0$n: function(receiver) {
+      return J.getInterceptor$n(receiver).floor$0(receiver);
+    },
+    fold$2$ax: function(receiver, a0, a1) {
+      return J.getInterceptor$ax(receiver).fold$2(receiver, a0, a1);
+    },
+    getRange$2$ax: function(receiver, a0, a1) {
+      return J.getInterceptor$ax(receiver).getRange$2(receiver, a0, a1);
+    },
+    getTime$0$x: function(receiver) {
+      return J.getInterceptor$x(receiver).getTime$0(receiver);
+    },
+    indexOf$1$asx: function(receiver, a0) {
+      return J.getInterceptor$asx(receiver).indexOf$1(receiver, a0);
+    },
+    isDirectory$0$x: function(receiver) {
+      return J.getInterceptor$x(receiver).isDirectory$0(receiver);
+    },
+    isFile$0$x: function(receiver) {
+      return J.getInterceptor$x(receiver).isFile$0(receiver);
+    },
+    join$0$ax: function(receiver) {
+      return J.getInterceptor$ax(receiver).join$0(receiver);
+    },
+    join$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).join$1(receiver, a0);
+    },
+    map$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).map$1(receiver, a0);
+    },
+    map$1$1$ax: function(receiver, a0, $T1) {
+      return J.getInterceptor$ax(receiver).map$1$1(receiver, a0, $T1);
+    },
+    matchAsPrefix$2$s: function(receiver, a0, a1) {
+      return J.getInterceptor$s(receiver).matchAsPrefix$2(receiver, a0, a1);
+    },
+    mkdirSync$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).mkdirSync$1(receiver, a0);
+    },
+    noSuchMethod$1$: function(receiver, a0) {
+      return J.getInterceptor$(receiver).noSuchMethod$1(receiver, a0);
+    },
+    on$2$x: function(receiver, a0, a1) {
+      return J.getInterceptor$x(receiver).on$2(receiver, a0, a1);
+    },
+    padRight$1$s: function(receiver, a0) {
+      return J.getInterceptor$s(receiver).padRight$1(receiver, a0);
+    },
+    readFileSync$2$x: function(receiver, a0, a1) {
+      return J.getInterceptor$x(receiver).readFileSync$2(receiver, a0, a1);
+    },
+    readdirSync$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).readdirSync$1(receiver, a0);
+    },
+    remove$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).remove$1(receiver, a0);
+    },
+    replaceRange$3$asx: function(receiver, a0, a1, a2) {
+      return J.getInterceptor$asx(receiver).replaceRange$3(receiver, a0, a1, a2);
+    },
+    round$0$n: function(receiver) {
+      return J.getInterceptor$n(receiver).round$0(receiver);
+    },
+    run$0$x: function(receiver) {
+      return J.getInterceptor$x(receiver).run$0(receiver);
+    },
+    run$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).run$1(receiver, a0);
+    },
+    setPrompt$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).setPrompt$1(receiver, a0);
+    },
+    setRange$4$ax: function(receiver, a0, a1, a2, a3) {
+      return J.getInterceptor$ax(receiver).setRange$4(receiver, a0, a1, a2, a3);
+    },
+    skip$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
+    },
+    sort$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
+    },
+    startsWith$1$s: function(receiver, a0) {
+      return J.getInterceptor$s(receiver).startsWith$1(receiver, a0);
+    },
+    startsWith$2$s: function(receiver, a0, a1) {
+      return J.getInterceptor$s(receiver).startsWith$2(receiver, a0, a1);
+    },
+    statSync$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).statSync$1(receiver, a0);
+    },
+    substring$1$s: function(receiver, a0) {
+      return J.getInterceptor$s(receiver).substring$1(receiver, a0);
+    },
+    substring$2$s: function(receiver, a0, a1) {
+      return J.getInterceptor$s(receiver).substring$2(receiver, a0, a1);
+    },
+    take$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).take$1(receiver, a0);
+    },
+    then$1$1$x: function(receiver, a0, $T1) {
+      return J.getInterceptor$x(receiver).then$1$1(receiver, a0, $T1);
+    },
+    then$1$2$onError$x: function(receiver, a0, a1, $T1) {
+      return J.getInterceptor$x(receiver).then$1$2$onError(receiver, a0, a1, $T1);
+    },
+    toList$0$ax: function(receiver) {
+      return J.getInterceptor$ax(receiver).toList$0(receiver);
+    },
+    toList$1$growable$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).toList$1$growable(receiver, a0);
+    },
+    toRadixString$1$n: function(receiver, a0) {
+      return J.getInterceptor$n(receiver).toRadixString$1(receiver, a0);
+    },
+    toSet$0$ax: function(receiver) {
+      return J.getInterceptor$ax(receiver).toSet$0(receiver);
+    },
+    toString$0$: function(receiver) {
+      return J.getInterceptor$(receiver).toString$0(receiver);
+    },
+    toString$1$color$: function(receiver, a0) {
+      return J.getInterceptor$(receiver).toString$1$color(receiver, a0);
+    },
+    trim$0$s: function(receiver) {
+      return J.getInterceptor$s(receiver).trim$0(receiver);
+    },
+    unlinkSync$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).unlinkSync$1(receiver, a0);
+    },
+    watch$2$x: function(receiver, a0, a1) {
+      return J.getInterceptor$x(receiver).watch$2(receiver, a0, a1);
+    },
+    where$1$ax: function(receiver, a0) {
+      return J.getInterceptor$ax(receiver).where$1(receiver, a0);
+    },
+    write$1$x: function(receiver, a0) {
+      return J.getInterceptor$x(receiver).write$1(receiver, a0);
+    },
+    writeFileSync$2$x: function(receiver, a0, a1) {
+      return J.getInterceptor$x(receiver).writeFileSync$2(receiver, a0, a1);
+    },
+    yield$0$x: function(receiver) {
+      return J.getInterceptor$x(receiver).yield$0(receiver);
+    },
+    Interceptor: function Interceptor() {
+    },
+    JSBool: function JSBool() {
+    },
+    JSNull: function JSNull() {
+    },
+    JavaScriptObject: function JavaScriptObject() {
+    },
+    PlainJavaScriptObject: function PlainJavaScriptObject() {
+    },
+    UnknownJavaScriptObject: function UnknownJavaScriptObject() {
+    },
+    JavaScriptFunction: function JavaScriptFunction() {
+    },
+    JSArray: function JSArray(t0) {
+      this.$ti = t0;
+    },
+    JSUnmodifiableArray: function JSUnmodifiableArray(t0) {
+      this.$ti = t0;
+    },
+    ArrayIterator: function ArrayIterator(t0, t1) {
+      var _ = this;
+      _._iterable = t0;
+      _._length = t1;
+      _._index = 0;
+      _._current = null;
+    },
+    JSNumber: function JSNumber() {
+    },
+    JSInt: function JSInt() {
+    },
+    JSDouble: function JSDouble() {
+    },
+    JSString: function JSString() {
+    }
+  },
+  P = {
+    _AsyncRun__initializeScheduleImmediate: function() {
+      var div, span, t1 = {};
+      if (self.scheduleImmediate != null)
+        return P.async__AsyncRun__scheduleImmediateJsOverride$closure();
+      if (self.MutationObserver != null && self.document != null) {
+        div = self.document.createElement("div");
+        span = self.document.createElement("span");
+        t1.storedCallback = null;
+        new self.MutationObserver(H.convertDartClosureToJS(new P._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
+        return new P._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
+      } else if (self.setImmediate != null)
+        return P.async__AsyncRun__scheduleImmediateWithSetImmediate$closure();
+      return P.async__AsyncRun__scheduleImmediateWithTimer$closure();
+    },
+    _AsyncRun__scheduleImmediateJsOverride: function(callback) {
+      self.scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(callback), 0));
+    },
+    _AsyncRun__scheduleImmediateWithSetImmediate: function(callback) {
+      self.setImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(callback), 0));
+    },
+    _AsyncRun__scheduleImmediateWithTimer: function(callback) {
+      P.Timer__createTimer(C.Duration_0, callback);
+    },
+    Timer__createTimer: function(duration, callback) {
+      var milliseconds = C.JSInt_methods._tdivFast$1(duration._duration, 1000);
+      return P._TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
+    },
+    _TimerImpl$: function(milliseconds, callback) {
+      var t1 = new P._TimerImpl(true);
+      t1._TimerImpl$2(milliseconds, callback);
+      return t1;
+    },
+    _TimerImpl$periodic: function(milliseconds, callback) {
+      var t1 = new P._TimerImpl(false);
+      t1._TimerImpl$periodic$2(milliseconds, callback);
+      return t1;
+    },
+    _makeAsyncAwaitCompleter: function($T) {
+      return new P._AsyncAwaitCompleter(new P._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncAwaitCompleter<0>"));
+    },
+    _asyncStartSync: function(bodyFunction, completer) {
+      bodyFunction.call$2(0, null);
+      completer.isSync = true;
+      return completer._future;
+    },
+    _asyncAwait: function(object, bodyFunction) {
+      P._awaitOnObject(object, bodyFunction);
+    },
+    _asyncReturn: function(object, completer) {
+      completer.complete$1(object);
+    },
+    _asyncRethrow: function(object, completer) {
+      completer.completeError$2(H.unwrapException(object), H.getTraceFromException(object));
+    },
+    _awaitOnObject: function(object, bodyFunction) {
+      var t1, future,
+        thenCallback = new P._awaitOnObject_closure(bodyFunction),
+        errorCallback = new P._awaitOnObject_closure0(bodyFunction);
+      if (object instanceof P._Future)
+        object._thenAwait$1$2(thenCallback, errorCallback, type$.dynamic);
+      else {
+        t1 = type$.dynamic;
+        if (type$.Future_dynamic._is(object))
+          object.then$1$2$onError(0, thenCallback, errorCallback, t1);
+        else {
+          future = new P._Future($.Zone__current, type$._Future_dynamic);
+          future._state = 4;
+          future._resultOrListeners = object;
+          future._thenAwait$1$2(thenCallback, errorCallback, t1);
+        }
+      }
+    },
+    _wrapJsFunctionForAsync: function($function) {
+      var $protected = function(fn, ERROR) {
+        return function(errorCode, result) {
+          while (true)
+            try {
+              fn(errorCode, result);
+              break;
+            } catch (error) {
+              result = error;
+              errorCode = ERROR;
+            }
+        };
+      }($function, 1);
+      return $.Zone__current.registerBinaryCallback$3$1(new P._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
+    },
+    _asyncStarHelper: function(object, bodyFunctionOrErrorCode, controller) {
+      var t1, t2, stream;
+      if (bodyFunctionOrErrorCode === 0) {
+        t1 = controller.cancelationFuture;
+        if (t1 != null)
+          t1._completeWithValue$1(null);
+        else
+          controller.get$controller().close$0(0);
+        return;
+      } else if (bodyFunctionOrErrorCode === 1) {
+        t1 = controller.cancelationFuture;
+        if (t1 != null)
+          t1._completeError$2(H.unwrapException(object), H.getTraceFromException(object));
+        else {
+          t1 = H.unwrapException(object);
+          t2 = H.getTraceFromException(object);
+          controller.get$controller().addError$2(t1, t2);
+          controller.get$controller().close$0(0);
+        }
+        return;
+      }
+      if (object instanceof P._IterationMarker) {
+        if (controller.cancelationFuture != null) {
+          bodyFunctionOrErrorCode.call$2(2, null);
+          return;
+        }
+        t1 = object.state;
+        if (t1 === 0) {
+          t1 = object.value;
+          controller.get$controller().add$1(0, t1);
+          P.scheduleMicrotask(new P._asyncStarHelper_closure(controller, bodyFunctionOrErrorCode));
+          return;
+        } else if (t1 === 1) {
+          stream = object.value;
+          controller.get$controller().addStream$2$cancelOnError(stream, false).then$1(0, new P._asyncStarHelper_closure0(controller, bodyFunctionOrErrorCode));
+          return;
+        }
+      }
+      P._awaitOnObject(object, bodyFunctionOrErrorCode);
+    },
+    _streamOfController: function(controller) {
+      var t1 = controller.get$controller();
+      return new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>"));
+    },
+    _AsyncStarStreamController$: function(body, $T) {
+      var t1 = new P._AsyncStarStreamController($T._eval$1("_AsyncStarStreamController<0>"));
+      t1._AsyncStarStreamController$1(body, $T);
+      return t1;
+    },
+    _makeAsyncStarStreamController: function(body, $T) {
+      return P._AsyncStarStreamController$(body, $T);
+    },
+    _IterationMarker_yieldStar: function(values) {
+      return new P._IterationMarker(values, 1);
+    },
+    _IterationMarker_endOfIteration: function() {
+      return C._IterationMarker_null_2;
+    },
+    _IterationMarker_yieldSingle: function(value) {
+      return new P._IterationMarker(value, 0);
+    },
+    _IterationMarker_uncaughtError: function(error) {
+      return new P._IterationMarker(error, 3);
+    },
+    _makeSyncStarIterable: function(body, $T) {
+      return new P._SyncStarIterable(body, $T._eval$1("_SyncStarIterable<0>"));
+    },
+    Future_Future$value: function(value, $T) {
+      var t1 = new P._Future($.Zone__current, $T._eval$1("_Future<0>"));
+      t1._asyncComplete$1(value);
+      return t1;
+    },
+    Future_Future$error: function(error, stackTrace, $T) {
+      var t1, replacement;
+      P.ArgumentError_checkNotNull(error, "error");
+      t1 = $.Zone__current;
+      if (t1 !== C.C__RootZone) {
+        replacement = t1.errorCallback$2(error, stackTrace);
+        if (replacement != null) {
+          error = replacement.error;
+          stackTrace = replacement.stackTrace;
+        }
+      }
+      if (stackTrace == null)
+        stackTrace = P.AsyncError_defaultStackTrace(error);
+      t1 = new P._Future($.Zone__current, $T._eval$1("_Future<0>"));
+      t1._asyncCompleteError$2(error, stackTrace);
+      return t1;
+    },
+    Future_wait: function(futures, $T) {
+      var _error_get, _error_set, _stackTrace_get, _stackTrace_set, handleError, future, pos, e, st, t1, t2, exception, _box_0 = {}, cleanUp = null,
+        eagerError = false,
+        _future = new P._Future($.Zone__current, $T._eval$1("_Future<List<0>>"));
+      _box_0.values = null;
+      _box_0.remaining = 0;
+      _box_0.error = null;
+      _error_get = new P.Future_wait__error_get(_box_0);
+      _error_set = new P.Future_wait__error_set(_box_0);
+      _box_0.stackTrace = null;
+      _stackTrace_get = new P.Future_wait__stackTrace_get(_box_0);
+      _stackTrace_set = new P.Future_wait__stackTrace_set(_box_0);
+      handleError = new P.Future_wait_handleError(_box_0, cleanUp, eagerError, _future, _error_set, _stackTrace_set, _error_get, _stackTrace_get);
+      try {
+        for (t1 = J.get$iterator$ax(futures), t2 = type$.Null; t1.moveNext$0();) {
+          future = t1.get$current(t1);
+          pos = _box_0.remaining;
+          J.then$1$2$onError$x(future, new P.Future_wait_closure(_box_0, pos, _future, cleanUp, eagerError, _error_get, _stackTrace_get, $T), handleError, t2);
+          ++_box_0.remaining;
+        }
+        t1 = _box_0.remaining;
+        if (t1 === 0) {
+          t1 = P.Future_Future$value(C.List_empty9, $T._eval$1("List<0>"));
+          return t1;
+        }
+        _box_0.values = P.List_List$filled(t1, null, false, $T._eval$1("0?"));
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        st = H.getTraceFromException(exception);
+        if (_box_0.remaining === 0 || eagerError)
+          return P.Future_Future$error(e, st, $T._eval$1("List<0>"));
+        else {
+          _error_set.call$1(e);
+          _stackTrace_set.call$1(st);
+        }
+      }
+      return _future;
+    },
+    _Future$zoneValue: function(value, _zone, $T) {
+      var t1 = new P._Future(_zone, $T._eval$1("_Future<0>"));
+      t1._state = 4;
+      t1._resultOrListeners = value;
+      return t1;
+    },
+    _Future__chainForeignFuture: function(source, target) {
+      var e, s, exception;
+      target._state = 1;
+      try {
+        source.then$1$2$onError(0, new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target), type$.Null);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        P.scheduleMicrotask(new P._Future__chainForeignFuture_closure1(target, e, s));
+      }
+    },
+    _Future__chainCoreFuture: function(source, target) {
+      var t1, listeners;
+      for (; t1 = source._state, t1 === 2;)
+        source = source._resultOrListeners;
+      if (t1 >= 4) {
+        listeners = target._removeListeners$0();
+        target._state = source._state;
+        target._resultOrListeners = source._resultOrListeners;
+        P._Future__propagateToListeners(target, listeners);
+      } else {
+        listeners = target._resultOrListeners;
+        target._state = 2;
+        target._resultOrListeners = source;
+        source._prependListeners$1(listeners);
+      }
+    },
+    _Future__propagateToListeners: function(source, listeners) {
+      var t2, _box_0, hasError, nextListener, nextListener0, t3, sourceResult, t4, t5, zone, oldZone, result, current, _box_1 = {},
+        t1 = _box_1.source = source;
+      for (t2 = type$.Future_dynamic; true;) {
+        _box_0 = {};
+        hasError = t1._state === 8;
+        if (listeners == null) {
+          if (hasError) {
+            t2 = t1._resultOrListeners;
+            t1._zone.handleUncaughtError$2(t2.error, t2.stackTrace);
+          }
+          return;
+        }
+        _box_0.listener = listeners;
+        nextListener = listeners._nextListener;
+        for (t1 = listeners; nextListener != null; t1 = nextListener, nextListener = nextListener0) {
+          t1._nextListener = null;
+          P._Future__propagateToListeners(_box_1.source, t1);
+          _box_0.listener = nextListener;
+          nextListener0 = nextListener._nextListener;
+        }
+        t3 = _box_1.source;
+        sourceResult = t3._resultOrListeners;
+        _box_0.listenerHasError = hasError;
+        _box_0.listenerValueOrError = sourceResult;
+        t4 = !hasError;
+        if (t4) {
+          t5 = t1.state;
+          t5 = (t5 & 1) !== 0 || (t5 & 15) === 8;
+        } else
+          t5 = true;
+        if (t5) {
+          zone = t1.result._zone;
+          if (hasError) {
+            t1 = t3._zone;
+            t1 = !(t1 === zone || t1.get$errorZone() === zone.get$errorZone());
+          } else
+            t1 = false;
+          if (t1) {
+            t1 = _box_1.source;
+            t2 = t1._resultOrListeners;
+            t1._zone.handleUncaughtError$2(t2.error, t2.stackTrace);
+            return;
+          }
+          oldZone = $.Zone__current;
+          if (oldZone !== zone)
+            $.Zone__current = zone;
+          else
+            oldZone = null;
+          t1 = _box_0.listener.state;
+          if ((t1 & 15) === 8)
+            new P._Future__propagateToListeners_handleWhenCompleteCallback(_box_0, _box_1, hasError).call$0();
+          else if (t4) {
+            if ((t1 & 1) !== 0)
+              new P._Future__propagateToListeners_handleValueCallback(_box_0, sourceResult).call$0();
+          } else if ((t1 & 2) !== 0)
+            new P._Future__propagateToListeners_handleError(_box_1, _box_0).call$0();
+          if (oldZone != null)
+            $.Zone__current = oldZone;
+          t1 = _box_0.listenerValueOrError;
+          if (t2._is(t1)) {
+            result = _box_0.listener.result;
+            if (t1._state >= 4) {
+              current = result._resultOrListeners;
+              result._resultOrListeners = null;
+              listeners = result._reverseListeners$1(current);
+              result._state = t1._state;
+              result._resultOrListeners = t1._resultOrListeners;
+              _box_1.source = t1;
+              continue;
+            } else
+              P._Future__chainCoreFuture(t1, result);
+            return;
+          }
+        }
+        result = _box_0.listener.result;
+        current = result._resultOrListeners;
+        result._resultOrListeners = null;
+        listeners = result._reverseListeners$1(current);
+        t1 = _box_0.listenerHasError;
+        t3 = _box_0.listenerValueOrError;
+        if (!t1) {
+          result._state = 4;
+          result._resultOrListeners = t3;
+        } else {
+          result._state = 8;
+          result._resultOrListeners = t3;
+        }
+        _box_1.source = result;
+        t1 = result;
+      }
+    },
+    _registerErrorHandler: function(errorHandler, zone) {
+      if (type$.dynamic_Function_Object_StackTrace._is(errorHandler))
+        return zone.registerBinaryCallback$3$1(errorHandler, type$.dynamic, type$.Object, type$.StackTrace);
+      if (type$.dynamic_Function_Object._is(errorHandler))
+        return zone.registerUnaryCallback$2$1(errorHandler, type$.dynamic, type$.Object);
+      throw H.wrapException(P.ArgumentError$value(errorHandler, "onError", "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a a valid result"));
+    },
+    _microtaskLoop: function() {
+      var entry, next;
+      for (entry = $._nextCallback; entry != null; entry = $._nextCallback) {
+        $._lastPriorityCallback = null;
+        next = entry.next;
+        $._nextCallback = next;
+        if (next == null)
+          $._lastCallback = null;
+        entry.callback.call$0();
+      }
+    },
+    _startMicrotaskLoop: function() {
+      $._isInCallbackLoop = true;
+      try {
+        P._microtaskLoop();
+      } finally {
+        $._lastPriorityCallback = null;
+        $._isInCallbackLoop = false;
+        if ($._nextCallback != null)
+          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(P.async___startMicrotaskLoop$closure());
+      }
+    },
+    _scheduleAsyncCallback: function(callback) {
+      var newEntry = new P._AsyncCallbackEntry(callback),
+        lastCallback = $._lastCallback;
+      if (lastCallback == null) {
+        $._nextCallback = $._lastCallback = newEntry;
+        if (!$._isInCallbackLoop)
+          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(P.async___startMicrotaskLoop$closure());
+      } else
+        $._lastCallback = lastCallback.next = newEntry;
+    },
+    _schedulePriorityAsyncCallback: function(callback) {
+      var entry, lastPriorityCallback, next,
+        t1 = $._nextCallback;
+      if (t1 == null) {
+        P._scheduleAsyncCallback(callback);
+        $._lastPriorityCallback = $._lastCallback;
+        return;
+      }
+      entry = new P._AsyncCallbackEntry(callback);
+      lastPriorityCallback = $._lastPriorityCallback;
+      if (lastPriorityCallback == null) {
+        entry.next = t1;
+        $._nextCallback = $._lastPriorityCallback = entry;
+      } else {
+        next = lastPriorityCallback.next;
+        entry.next = next;
+        $._lastPriorityCallback = lastPriorityCallback.next = entry;
+        if (next == null)
+          $._lastCallback = entry;
+      }
+    },
+    scheduleMicrotask: function(callback) {
+      var t1, _null = null,
+        currentZone = $.Zone__current;
+      if (C.C__RootZone === currentZone) {
+        P._rootScheduleMicrotask(_null, _null, C.C__RootZone, callback);
+        return;
+      }
+      if (C.C__RootZone === currentZone.get$_scheduleMicrotask().zone)
+        t1 = C.C__RootZone.get$errorZone() === currentZone.get$errorZone();
+      else
+        t1 = false;
+      if (t1) {
+        P._rootScheduleMicrotask(_null, _null, currentZone, currentZone.registerCallback$1$1(callback, type$.void));
+        return;
+      }
+      t1 = $.Zone__current;
+      t1.scheduleMicrotask$1(t1.bindCallbackGuarded$1(callback));
+    },
+    Stream_Stream$fromFuture: function(future, $T) {
+      var _null = null,
+        t1 = $T._eval$1("_SyncStreamController<0>"),
+        controller = new P._SyncStreamController(_null, _null, _null, _null, t1);
+      future.then$1$2$onError(0, new P.Stream_Stream$fromFuture_closure(controller, $T), new P.Stream_Stream$fromFuture_closure0(controller), type$.Null);
+      return new P._ControllerStream(controller, t1._eval$1("_ControllerStream<1>"));
+    },
+    StreamIterator_StreamIterator: function(stream) {
+      P.ArgumentError_checkNotNull(stream, "stream");
+      return new P._StreamIterator(stream);
+    },
+    StreamController_StreamController: function(onCancel, onListen, onPause, onResume, sync, $T) {
+      return sync ? new P._SyncStreamController(onListen, onPause, onResume, onCancel, $T._eval$1("_SyncStreamController<0>")) : new P._AsyncStreamController(onListen, onPause, onResume, onCancel, $T._eval$1("_AsyncStreamController<0>"));
+    },
+    _runGuarded: function(notificationHandler) {
+      var e, s, exception;
+      if (notificationHandler == null)
+        return;
+      try {
+        notificationHandler.call$0();
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        $.Zone__current.handleUncaughtError$2(e, s);
+      }
+    },
+    _ControllerSubscription$: function(_controller, onData, onError, onDone, cancelOnError, $T) {
+      var t1 = $.Zone__current,
+        t2 = cancelOnError ? 1 : 0,
+        t3 = P._BufferingStreamSubscription__registerDataHandler(t1, onData, $T),
+        t4 = P._BufferingStreamSubscription__registerErrorHandler(t1, onError),
+        t5 = onDone == null ? P.async___nullDoneHandler$closure() : onDone;
+      return new P._ControllerSubscription(_controller, t3, t4, t1.registerCallback$1$1(t5, type$.void), t1, t2, $T._eval$1("_ControllerSubscription<0>"));
+    },
+    _BufferingStreamSubscription__registerDataHandler: function(zone, handleData, $T) {
+      var t1 = handleData == null ? P.async___nullDataHandler$closure() : handleData;
+      return zone.registerUnaryCallback$2$1(t1, type$.void, $T);
+    },
+    _BufferingStreamSubscription__registerErrorHandler: function(zone, handleError) {
+      if (handleError == null)
+        handleError = P.async___nullErrorHandler$closure();
+      if (type$.void_Function_Object_StackTrace._is(handleError))
+        return zone.registerBinaryCallback$3$1(handleError, type$.dynamic, type$.Object, type$.StackTrace);
+      if (type$.void_Function_Object._is(handleError))
+        return zone.registerUnaryCallback$2$1(handleError, type$.dynamic, type$.Object);
+      throw H.wrapException(P.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace."));
+    },
+    _nullDataHandler: function(value) {
+    },
+    _nullErrorHandler: function(error, stackTrace) {
+      $.Zone__current.handleUncaughtError$2(error, stackTrace);
+    },
+    _nullDoneHandler: function() {
+    },
+    _addErrorWithReplacement: function(sink, error, stackTrace) {
+      var replacement = $.Zone__current.errorCallback$2(error, stackTrace);
+      if (replacement != null) {
+        error = replacement.error;
+        stackTrace = replacement.stackTrace;
+      }
+      sink._addError$2(error, stackTrace);
+    },
+    Timer_Timer: function(duration, callback) {
+      var t1 = $.Zone__current;
+      if (t1 === C.C__RootZone)
+        return t1.createTimer$2(duration, callback);
+      return t1.createTimer$2(duration, t1.bindCallbackGuarded$1(callback));
+    },
+    AsyncError$: function(error, stackTrace) {
+      var t1 = stackTrace == null ? P.AsyncError_defaultStackTrace(error) : stackTrace;
+      P.ArgumentError_checkNotNull(error, "error");
+      return new P.AsyncError(error, t1);
+    },
+    AsyncError_defaultStackTrace: function(error) {
+      var stackTrace;
+      if (type$.Error._is(error)) {
+        stackTrace = error.get$stackTrace();
+        if (stackTrace != null)
+          return stackTrace;
+      }
+      return C._StringStackTrace_3uE;
+    },
+    _rootHandleUncaughtError: function($self, $parent, zone, error, stackTrace) {
+      P._schedulePriorityAsyncCallback(new P._rootHandleUncaughtError_closure(error, stackTrace));
+    },
+    _rootRun: function($self, $parent, zone, f) {
+      var old,
+        t1 = $.Zone__current;
+      if (t1 === zone)
+        return f.call$0();
+      if (!(zone instanceof P._Zone))
+        throw H.wrapException(P.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
+      $.Zone__current = zone;
+      old = t1;
+      try {
+        t1 = f.call$0();
+        return t1;
+      } finally {
+        $.Zone__current = old;
+      }
+    },
+    _rootRunUnary: function($self, $parent, zone, f, arg) {
+      var old,
+        t1 = $.Zone__current;
+      if (t1 === zone)
+        return f.call$1(arg);
+      if (!(zone instanceof P._Zone))
+        throw H.wrapException(P.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
+      $.Zone__current = zone;
+      old = t1;
+      try {
+        t1 = f.call$1(arg);
+        return t1;
+      } finally {
+        $.Zone__current = old;
+      }
+    },
+    _rootRunBinary: function($self, $parent, zone, f, arg1, arg2) {
+      var old,
+        t1 = $.Zone__current;
+      if (t1 === zone)
+        return f.call$2(arg1, arg2);
+      if (!(zone instanceof P._Zone))
+        throw H.wrapException(P.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
+      $.Zone__current = zone;
+      old = t1;
+      try {
+        t1 = f.call$2(arg1, arg2);
+        return t1;
+      } finally {
+        $.Zone__current = old;
+      }
+    },
+    _rootRegisterCallback: function($self, $parent, zone, f) {
+      return f;
+    },
+    _rootRegisterUnaryCallback: function($self, $parent, zone, f) {
+      return f;
+    },
+    _rootRegisterBinaryCallback: function($self, $parent, zone, f) {
+      return f;
+    },
+    _rootErrorCallback: function($self, $parent, zone, error, stackTrace) {
+      return null;
+    },
+    _rootScheduleMicrotask: function($self, $parent, zone, f) {
+      var t1 = C.C__RootZone !== zone;
+      if (t1)
+        f = !(!t1 || C.C__RootZone.get$errorZone() === zone.get$errorZone()) ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
+      P._scheduleAsyncCallback(f);
+    },
+    _rootCreateTimer: function($self, $parent, zone, duration, callback) {
+      callback = zone.bindCallback$1$1(callback, type$.void);
+      return P.Timer__createTimer(duration, callback);
+    },
+    _rootCreatePeriodicTimer: function($self, $parent, zone, duration, callback) {
+      var milliseconds;
+      callback = zone.bindUnaryCallback$2$1(callback, type$.void, type$.Timer);
+      milliseconds = C.JSInt_methods._tdivFast$1(duration._duration, 1000);
+      return P._TimerImpl$periodic(milliseconds < 0 ? 0 : milliseconds, callback);
+    },
+    _rootPrint: function($self, $parent, zone, line) {
+      H.printString(H.S(line));
+    },
+    _printToZone: function(line) {
+      $.Zone__current.print$1(line);
+    },
+    _rootFork: function($self, $parent, zone, specification, zoneValues) {
+      var valueMap, t1, handleUncaughtError;
+      $.printToZone = P.async___printToZone$closure();
+      if (specification == null)
+        specification = C._ZoneSpecification_ALf;
+      if (zoneValues == null)
+        valueMap = zone.get$_async$_map();
+      else {
+        t1 = type$.nullable_Object;
+        valueMap = P.HashMap_HashMap$from(zoneValues, t1, t1);
+      }
+      t1 = new P._CustomZone(zone.get$_run(), zone.get$_runUnary(), zone.get$_runBinary(), zone.get$_registerCallback(), zone.get$_registerUnaryCallback(), zone.get$_registerBinaryCallback(), zone.get$_errorCallback(), zone.get$_scheduleMicrotask(), zone.get$_createTimer(), zone.get$_createPeriodicTimer(), zone.get$_print(), zone.get$_fork(), zone.get$_handleUncaughtError(), zone, valueMap);
+      handleUncaughtError = specification.handleUncaughtError;
+      if (handleUncaughtError != null)
+        t1._handleUncaughtError = new P._ZoneFunction(t1, handleUncaughtError);
+      return t1;
+    },
+    runZoned: function(body, zoneValues, $R) {
+      P.ArgumentError_checkNotNull(body, "body");
+      return P._runZoned(body, zoneValues, null, $R);
+    },
+    _runZoned: function(body, zoneValues, specification, $R) {
+      return $.Zone__current.fork$2$specification$zoneValues(specification, zoneValues).run$1$1(0, body, $R);
+    },
+    _AsyncRun__initializeScheduleImmediate_internalCallback: function _AsyncRun__initializeScheduleImmediate_internalCallback(t0) {
+      this._box_0 = t0;
+    },
+    _AsyncRun__initializeScheduleImmediate_closure: function _AsyncRun__initializeScheduleImmediate_closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.div = t1;
+      this.span = t2;
+    },
+    _AsyncRun__scheduleImmediateJsOverride_internalCallback: function _AsyncRun__scheduleImmediateJsOverride_internalCallback(t0) {
+      this.callback = t0;
+    },
+    _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback: function _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(t0) {
+      this.callback = t0;
+    },
+    _TimerImpl: function _TimerImpl(t0) {
+      this._once = t0;
+      this._handle = null;
+      this._tick = 0;
+    },
+    _TimerImpl_internalCallback: function _TimerImpl_internalCallback(t0, t1) {
+      this.$this = t0;
+      this.callback = t1;
+    },
+    _TimerImpl$periodic_closure: function _TimerImpl$periodic_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.milliseconds = t1;
+      _.start = t2;
+      _.callback = t3;
+    },
+    _AsyncAwaitCompleter: function _AsyncAwaitCompleter(t0, t1) {
+      this._future = t0;
+      this.isSync = false;
+      this.$ti = t1;
+    },
+    _awaitOnObject_closure: function _awaitOnObject_closure(t0) {
+      this.bodyFunction = t0;
+    },
+    _awaitOnObject_closure0: function _awaitOnObject_closure0(t0) {
+      this.bodyFunction = t0;
+    },
+    _wrapJsFunctionForAsync_closure: function _wrapJsFunctionForAsync_closure(t0) {
+      this.$protected = t0;
+    },
+    _asyncStarHelper_closure: function _asyncStarHelper_closure(t0, t1) {
+      this.controller = t0;
+      this.bodyFunction = t1;
+    },
+    _asyncStarHelper_closure0: function _asyncStarHelper_closure0(t0, t1) {
+      this.controller = t0;
+      this.bodyFunction = t1;
+    },
+    _AsyncStarStreamController: function _AsyncStarStreamController(t0) {
+      var _ = this;
+      _.___AsyncStarStreamController_controller = null;
+      _.isSuspended = false;
+      _.cancelationFuture = null;
+      _.$ti = t0;
+    },
+    _AsyncStarStreamController__resumeBody: function _AsyncStarStreamController__resumeBody(t0) {
+      this.body = t0;
+    },
+    _AsyncStarStreamController__resumeBody_closure: function _AsyncStarStreamController__resumeBody_closure(t0) {
+      this.body = t0;
+    },
+    _AsyncStarStreamController_closure0: function _AsyncStarStreamController_closure0(t0) {
+      this._resumeBody = t0;
+    },
+    _AsyncStarStreamController_closure1: function _AsyncStarStreamController_closure1(t0, t1) {
+      this.$this = t0;
+      this._resumeBody = t1;
+    },
+    _AsyncStarStreamController_closure: function _AsyncStarStreamController_closure(t0, t1) {
+      this.$this = t0;
+      this.body = t1;
+    },
+    _AsyncStarStreamController__closure: function _AsyncStarStreamController__closure(t0) {
+      this.body = t0;
+    },
+    _IterationMarker: function _IterationMarker(t0, t1) {
+      this.value = t0;
+      this.state = t1;
+    },
+    _SyncStarIterator: function _SyncStarIterator(t0) {
+      var _ = this;
+      _._body = t0;
+      _._suspendedBodies = _._nestedIterator = _._async$_current = null;
+    },
+    _SyncStarIterable: function _SyncStarIterable(t0, t1) {
+      this._outerHelper = t0;
+      this.$ti = t1;
+    },
+    _BroadcastStream: function _BroadcastStream(t0, t1) {
+      this._async$_controller = t0;
+      this.$ti = t1;
+    },
+    _BroadcastSubscription: function _BroadcastSubscription(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._eventState = 0;
+      _._async$_previous = _._async$_next = null;
+      _._async$_controller = t0;
+      _._onData = t1;
+      _._onError = t2;
+      _._onDone = t3;
+      _._zone = t4;
+      _._state = t5;
+      _._pending = _._cancelFuture = null;
+      _.$ti = t6;
+    },
+    _BroadcastStreamController: function _BroadcastStreamController() {
+    },
+    _SyncBroadcastStreamController: function _SyncBroadcastStreamController(t0, t1, t2) {
+      var _ = this;
+      _.onListen = t0;
+      _.onCancel = t1;
+      _._state = 0;
+      _._doneFuture = _._addStreamState = _._lastSubscription = _._firstSubscription = null;
+      _.$ti = t2;
+    },
+    _SyncBroadcastStreamController__sendData_closure: function _SyncBroadcastStreamController__sendData_closure(t0, t1) {
+      this.$this = t0;
+      this.data = t1;
+    },
+    _SyncBroadcastStreamController__sendError_closure: function _SyncBroadcastStreamController__sendError_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.error = t1;
+      this.stackTrace = t2;
+    },
+    _SyncBroadcastStreamController__sendDone_closure: function _SyncBroadcastStreamController__sendDone_closure(t0) {
+      this.$this = t0;
+    },
+    Future_wait__error_set: function Future_wait__error_set(t0) {
+      this._box_0 = t0;
+    },
+    Future_wait__stackTrace_set: function Future_wait__stackTrace_set(t0) {
+      this._box_0 = t0;
+    },
+    Future_wait__error_get: function Future_wait__error_get(t0) {
+      this._box_0 = t0;
+    },
+    Future_wait__stackTrace_get: function Future_wait__stackTrace_get(t0) {
+      this._box_0 = t0;
+    },
+    Future_wait_handleError: function Future_wait_handleError(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _._box_0 = t0;
+      _.cleanUp = t1;
+      _.eagerError = t2;
+      _._future = t3;
+      _._error_set = t4;
+      _._stackTrace_set = t5;
+      _._error_get = t6;
+      _._stackTrace_get = t7;
+    },
+    Future_wait_closure: function Future_wait_closure(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _._box_0 = t0;
+      _.pos = t1;
+      _._future = t2;
+      _.cleanUp = t3;
+      _.eagerError = t4;
+      _._error_get = t5;
+      _._stackTrace_get = t6;
+      _.T = t7;
+    },
+    _Completer: function _Completer() {
+    },
+    _AsyncCompleter: function _AsyncCompleter(t0, t1) {
+      this.future = t0;
+      this.$ti = t1;
+    },
+    _FutureListener: function _FutureListener(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._nextListener = null;
+      _.result = t0;
+      _.state = t1;
+      _.callback = t2;
+      _.errorCallback = t3;
+      _.$ti = t4;
+    },
+    _Future: function _Future(t0, t1) {
+      var _ = this;
+      _._state = 0;
+      _._zone = t0;
+      _._resultOrListeners = null;
+      _.$ti = t1;
+    },
+    _Future__addListener_closure: function _Future__addListener_closure(t0, t1) {
+      this.$this = t0;
+      this.listener = t1;
+    },
+    _Future__prependListeners_closure: function _Future__prependListeners_closure(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _Future__chainForeignFuture_closure: function _Future__chainForeignFuture_closure(t0) {
+      this.target = t0;
+    },
+    _Future__chainForeignFuture_closure0: function _Future__chainForeignFuture_closure0(t0) {
+      this.target = t0;
+    },
+    _Future__chainForeignFuture_closure1: function _Future__chainForeignFuture_closure1(t0, t1, t2) {
+      this.target = t0;
+      this.e = t1;
+      this.s = t2;
+    },
+    _Future__asyncCompleteWithValue_closure: function _Future__asyncCompleteWithValue_closure(t0, t1) {
+      this.$this = t0;
+      this.value = t1;
+    },
+    _Future__chainFuture_closure: function _Future__chainFuture_closure(t0, t1) {
+      this.$this = t0;
+      this.value = t1;
+    },
+    _Future__asyncCompleteError_closure: function _Future__asyncCompleteError_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.error = t1;
+      this.stackTrace = t2;
+    },
+    _Future__propagateToListeners_handleWhenCompleteCallback: function _Future__propagateToListeners_handleWhenCompleteCallback(t0, t1, t2) {
+      this._box_0 = t0;
+      this._box_1 = t1;
+      this.hasError = t2;
+    },
+    _Future__propagateToListeners_handleWhenCompleteCallback_closure: function _Future__propagateToListeners_handleWhenCompleteCallback_closure(t0) {
+      this.originalSource = t0;
+    },
+    _Future__propagateToListeners_handleValueCallback: function _Future__propagateToListeners_handleValueCallback(t0, t1) {
+      this._box_0 = t0;
+      this.sourceResult = t1;
+    },
+    _Future__propagateToListeners_handleError: function _Future__propagateToListeners_handleError(t0, t1) {
+      this._box_1 = t0;
+      this._box_0 = t1;
+    },
+    _AsyncCallbackEntry: function _AsyncCallbackEntry(t0) {
+      this.callback = t0;
+      this.next = null;
+    },
+    Stream: function Stream() {
+    },
+    Stream_Stream$fromFuture_closure: function Stream_Stream$fromFuture_closure(t0, t1) {
+      this.controller = t0;
+      this.T = t1;
+    },
+    Stream_Stream$fromFuture_closure0: function Stream_Stream$fromFuture_closure0(t0) {
+      this.controller = t0;
+    },
+    Stream_length_closure: function Stream_length_closure(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    Stream_length_closure0: function Stream_length_closure0(t0, t1) {
+      this._box_0 = t0;
+      this.future = t1;
+    },
+    StreamTransformerBase: function StreamTransformerBase() {
+    },
+    _StreamController: function _StreamController() {
+    },
+    _StreamController__subscribe_closure: function _StreamController__subscribe_closure(t0) {
+      this.$this = t0;
+    },
+    _StreamController__recordCancel_complete: function _StreamController__recordCancel_complete(t0) {
+      this.$this = t0;
+    },
+    _SyncStreamControllerDispatch: function _SyncStreamControllerDispatch() {
+    },
+    _AsyncStreamControllerDispatch: function _AsyncStreamControllerDispatch() {
+    },
+    _AsyncStreamController: function _AsyncStreamController(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._varData = null;
+      _._state = 0;
+      _._doneFuture = null;
+      _.onListen = t0;
+      _.onPause = t1;
+      _.onResume = t2;
+      _.onCancel = t3;
+      _.$ti = t4;
+    },
+    _SyncStreamController: function _SyncStreamController(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._varData = null;
+      _._state = 0;
+      _._doneFuture = null;
+      _.onListen = t0;
+      _.onPause = t1;
+      _.onResume = t2;
+      _.onCancel = t3;
+      _.$ti = t4;
+    },
+    _ControllerStream: function _ControllerStream(t0, t1) {
+      this._async$_controller = t0;
+      this.$ti = t1;
+    },
+    _ControllerSubscription: function _ControllerSubscription(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._async$_controller = t0;
+      _._onData = t1;
+      _._onError = t2;
+      _._onDone = t3;
+      _._zone = t4;
+      _._state = t5;
+      _._pending = _._cancelFuture = null;
+      _.$ti = t6;
+    },
+    _AddStreamState: function _AddStreamState() {
+    },
+    _AddStreamState_cancel_closure: function _AddStreamState_cancel_closure(t0) {
+      this.$this = t0;
+    },
+    _StreamControllerAddStreamState: function _StreamControllerAddStreamState(t0, t1, t2) {
+      this.varData = t0;
+      this.addStreamFuture = t1;
+      this.addSubscription = t2;
+    },
+    _BufferingStreamSubscription: function _BufferingStreamSubscription() {
+    },
+    _BufferingStreamSubscription__sendError_sendError: function _BufferingStreamSubscription__sendError_sendError(t0, t1, t2) {
+      this.$this = t0;
+      this.error = t1;
+      this.stackTrace = t2;
+    },
+    _BufferingStreamSubscription__sendDone_sendDone: function _BufferingStreamSubscription__sendDone_sendDone(t0) {
+      this.$this = t0;
+    },
+    _StreamImpl: function _StreamImpl() {
+    },
+    _DelayedEvent: function _DelayedEvent() {
+    },
+    _DelayedData: function _DelayedData(t0) {
+      this.value = t0;
+      this.next = null;
+    },
+    _DelayedError: function _DelayedError(t0, t1) {
+      this.error = t0;
+      this.stackTrace = t1;
+      this.next = null;
+    },
+    _DelayedDone: function _DelayedDone() {
+    },
+    _PendingEvents: function _PendingEvents() {
+    },
+    _PendingEvents_schedule_closure: function _PendingEvents_schedule_closure(t0, t1) {
+      this.$this = t0;
+      this.dispatch = t1;
+    },
+    _StreamImplEvents: function _StreamImplEvents() {
+      this.lastPendingEvent = this.firstPendingEvent = null;
+      this._state = 0;
+    },
+    _DoneStreamSubscription: function _DoneStreamSubscription(t0, t1, t2) {
+      var _ = this;
+      _._zone = t0;
+      _._state = 0;
+      _._onDone = t1;
+      _.$ti = t2;
+    },
+    _StreamIterator: function _StreamIterator(t0) {
+      this._subscription = null;
+      this._stateData = t0;
+      this._isPaused = false;
+    },
+    _ForwardingStream: function _ForwardingStream() {
+    },
+    _ForwardingStreamSubscription: function _ForwardingStreamSubscription(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._stream = t0;
+      _._subscription = null;
+      _._onData = t1;
+      _._onError = t2;
+      _._onDone = t3;
+      _._zone = t4;
+      _._state = t5;
+      _._pending = _._cancelFuture = null;
+      _.$ti = t6;
+    },
+    _ExpandStream: function _ExpandStream(t0, t1, t2) {
+      this._expand = t0;
+      this._async$_source = t1;
+      this.$ti = t2;
+    },
+    AsyncError: function AsyncError(t0, t1) {
+      this.error = t0;
+      this.stackTrace = t1;
+    },
+    _ZoneFunction: function _ZoneFunction(t0, t1) {
+      this.zone = t0;
+      this.$function = t1;
+    },
+    _RunNullaryZoneFunction: function _RunNullaryZoneFunction(t0, t1) {
+      this.zone = t0;
+      this.$function = t1;
+    },
+    _RunUnaryZoneFunction: function _RunUnaryZoneFunction(t0, t1) {
+      this.zone = t0;
+      this.$function = t1;
+    },
+    _RunBinaryZoneFunction: function _RunBinaryZoneFunction(t0, t1) {
+      this.zone = t0;
+      this.$function = t1;
+    },
+    _RegisterNullaryZoneFunction: function _RegisterNullaryZoneFunction(t0, t1) {
+      this.zone = t0;
+      this.$function = t1;
+    },
+    _RegisterUnaryZoneFunction: function _RegisterUnaryZoneFunction(t0, t1) {
+      this.zone = t0;
+      this.$function = t1;
+    },
+    _RegisterBinaryZoneFunction: function _RegisterBinaryZoneFunction(t0, t1) {
+      this.zone = t0;
+      this.$function = t1;
+    },
+    _ZoneSpecification: function _ZoneSpecification(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
+      var _ = this;
+      _.handleUncaughtError = t0;
+      _.run = t1;
+      _.runUnary = t2;
+      _.runBinary = t3;
+      _.registerCallback = t4;
+      _.registerUnaryCallback = t5;
+      _.registerBinaryCallback = t6;
+      _.errorCallback = t7;
+      _.scheduleMicrotask = t8;
+      _.createTimer = t9;
+      _.createPeriodicTimer = t10;
+      _.print = t11;
+      _.fork = t12;
+    },
+    _ZoneDelegate: function _ZoneDelegate(t0) {
+      this._delegationTarget = t0;
+    },
+    _Zone: function _Zone() {
+    },
+    _CustomZone: function _CustomZone(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14) {
+      var _ = this;
+      _._run = t0;
+      _._runUnary = t1;
+      _._runBinary = t2;
+      _._registerCallback = t3;
+      _._registerUnaryCallback = t4;
+      _._registerBinaryCallback = t5;
+      _._errorCallback = t6;
+      _._scheduleMicrotask = t7;
+      _._createTimer = t8;
+      _._createPeriodicTimer = t9;
+      _._print = t10;
+      _._fork = t11;
+      _._handleUncaughtError = t12;
+      _._delegateCache = null;
+      _.parent = t13;
+      _._async$_map = t14;
+    },
+    _CustomZone_bindCallback_closure: function _CustomZone_bindCallback_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.registered = t1;
+      this.R = t2;
+    },
+    _CustomZone_bindUnaryCallback_closure: function _CustomZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.registered = t1;
+      _.T = t2;
+      _.R = t3;
+    },
+    _CustomZone_bindCallbackGuarded_closure: function _CustomZone_bindCallbackGuarded_closure(t0, t1) {
+      this.$this = t0;
+      this.registered = t1;
+    },
+    _rootHandleUncaughtError_closure: function _rootHandleUncaughtError_closure(t0, t1) {
+      this.error = t0;
+      this.stackTrace = t1;
+    },
+    _RootZone: function _RootZone() {
+    },
+    _RootZone_bindCallback_closure: function _RootZone_bindCallback_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.f = t1;
+      this.R = t2;
+    },
+    _RootZone_bindCallbackGuarded_closure: function _RootZone_bindCallbackGuarded_closure(t0, t1) {
+      this.$this = t0;
+      this.f = t1;
+    },
+    HashMap_HashMap: function($K, $V) {
+      return new P._HashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_HashMap<1,2>"));
+    },
+    _HashMap__getTableEntry: function(table, key) {
+      var entry = table[key];
+      return entry === table ? null : entry;
+    },
+    _HashMap__setTableEntry: function(table, key, value) {
+      if (value == null)
+        table[key] = table;
+      else
+        table[key] = value;
+    },
+    _HashMap__newHashTable: function() {
+      var table = Object.create(null);
+      P._HashMap__setTableEntry(table, "<non-identifier-key>", table);
+      delete table["<non-identifier-key>"];
+      return table;
+    },
+    LinkedHashMap_LinkedHashMap: function(equals, hashCode, isValidKey, $K, $V) {
+      if (isValidKey == null)
+        if (hashCode == null) {
+          if (equals == null)
+            return new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
+          hashCode = P.collection___defaultHashCode$closure();
+        } else {
+          if (P.core__identityHashCode$closure() === hashCode && P.core__identical$closure() === equals)
+            return P._LinkedIdentityHashMap__LinkedIdentityHashMap$es6($K, $V);
+          if (equals == null)
+            equals = P.collection___defaultEquals$closure();
+        }
+      else {
+        if (hashCode == null)
+          hashCode = P.collection___defaultHashCode$closure();
+        if (equals == null)
+          equals = P.collection___defaultEquals$closure();
+      }
+      return P._LinkedCustomHashMap$(equals, hashCode, isValidKey, $K, $V);
+    },
+    LinkedHashMap_LinkedHashMap$_literal: function(keyValuePairs, $K, $V) {
+      return H.fillLiteralMap(keyValuePairs, new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>")));
+    },
+    LinkedHashMap_LinkedHashMap$_empty: function($K, $V) {
+      return new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
+    },
+    _LinkedIdentityHashMap__LinkedIdentityHashMap$es6: function($K, $V) {
+      return new P._LinkedIdentityHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_LinkedIdentityHashMap<1,2>"));
+    },
+    _LinkedCustomHashMap$: function(_equals, _hashCode, validKey, $K, $V) {
+      var t1 = validKey != null ? validKey : new P._LinkedCustomHashMap_closure($K);
+      return new P._LinkedCustomHashMap(_equals, _hashCode, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("_LinkedCustomHashMap<1,2>"));
+    },
+    LinkedHashSet_LinkedHashSet: function($E) {
+      return new P._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
+    },
+    LinkedHashSet_LinkedHashSet$_empty: function($E) {
+      return new P._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
+    },
+    LinkedHashSet_LinkedHashSet$_literal: function(values, $E) {
+      return H.fillLiteralSet(values, new P._LinkedHashSet($E._eval$1("_LinkedHashSet<0>")));
+    },
+    _LinkedHashSet__newHashTable: function() {
+      var table = Object.create(null);
+      table["<non-identifier-key>"] = table;
+      delete table["<non-identifier-key>"];
+      return table;
+    },
+    _LinkedHashSetIterator$: function(_set, _modifications) {
+      var t1 = new P._LinkedHashSetIterator(_set, _modifications);
+      t1._collection$_cell = _set._collection$_first;
+      return t1;
+    },
+    UnmodifiableListView$: function(source, $E) {
+      return new P.UnmodifiableListView(source, $E._eval$1("UnmodifiableListView<0>"));
+    },
+    _defaultEquals: function(a, b) {
+      return J.$eq$(a, b);
+    },
+    _defaultHashCode: function(a) {
+      return J.get$hashCode$(a);
+    },
+    HashMap_HashMap$from: function(other, $K, $V) {
+      var result = P.HashMap_HashMap($K, $V);
+      other.forEach$1(0, new P.HashMap_HashMap$from_closure(result, $K, $V));
+      return result;
+    },
+    IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
+      var parts, t1;
+      if (P._isToStringVisiting(iterable)) {
+        if (leftDelimiter === "(" && rightDelimiter === ")")
+          return "(...)";
+        return leftDelimiter + "..." + rightDelimiter;
+      }
+      parts = H.setRuntimeTypeInfo([], type$.JSArray_String);
+      $._toStringVisiting.push(iterable);
+      try {
+        P._iterablePartsToStrings(iterable, parts);
+      } finally {
+        $._toStringVisiting.pop();
+      }
+      t1 = P.StringBuffer__writeAll(leftDelimiter, parts, ", ") + rightDelimiter;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
+      var buffer, t1;
+      if (P._isToStringVisiting(iterable))
+        return leftDelimiter + "..." + rightDelimiter;
+      buffer = new P.StringBuffer(leftDelimiter);
+      $._toStringVisiting.push(iterable);
+      try {
+        t1 = buffer;
+        t1._contents = P.StringBuffer__writeAll(t1._contents, iterable, ", ");
+      } finally {
+        $._toStringVisiting.pop();
+      }
+      buffer._contents += rightDelimiter;
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _isToStringVisiting: function(o) {
+      var t1, i;
+      for (t1 = $._toStringVisiting.length, i = 0; i < t1; ++i)
+        if (o === $._toStringVisiting[i])
+          return true;
+      return false;
+    },
+    _iterablePartsToStrings: function(iterable, parts) {
+      var next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision,
+        it = iterable.get$iterator(iterable),
+        $length = 0, count = 0;
+      while (true) {
+        if (!($length < 80 || count < 3))
+          break;
+        if (!it.moveNext$0())
+          return;
+        next = H.S(it.get$current(it));
+        parts.push(next);
+        $length += next.length + 2;
+        ++count;
+      }
+      if (!it.moveNext$0()) {
+        if (count <= 5)
+          return;
+        ultimateString = parts.pop();
+        penultimateString = parts.pop();
+      } else {
+        penultimate = it.get$current(it);
+        ++count;
+        if (!it.moveNext$0()) {
+          if (count <= 4) {
+            parts.push(H.S(penultimate));
+            return;
+          }
+          ultimateString = H.S(penultimate);
+          penultimateString = parts.pop();
+          $length += ultimateString.length + 2;
+        } else {
+          ultimate = it.get$current(it);
+          ++count;
+          for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
+            ultimate0 = it.get$current(it);
+            ++count;
+            if (count > 100) {
+              while (true) {
+                if (!($length > 75 && count > 3))
+                  break;
+                $length -= parts.pop().length + 2;
+                --count;
+              }
+              parts.push("...");
+              return;
+            }
+          }
+          penultimateString = H.S(penultimate);
+          ultimateString = H.S(ultimate);
+          $length += ultimateString.length + penultimateString.length + 4;
+        }
+      }
+      if (count > parts.length + 2) {
+        $length += 5;
+        elision = "...";
+      } else
+        elision = null;
+      while (true) {
+        if (!($length > 80 && parts.length > 3))
+          break;
+        $length -= parts.pop().length + 2;
+        if (elision == null) {
+          $length += 5;
+          elision = "...";
+        }
+      }
+      if (elision != null)
+        parts.push(elision);
+      parts.push(penultimateString);
+      parts.push(ultimateString);
+    },
+    LinkedHashMap_LinkedHashMap$from: function(other, $K, $V) {
+      var result = P.LinkedHashMap_LinkedHashMap(null, null, null, $K, $V);
+      other.forEach$1(0, new P.LinkedHashMap_LinkedHashMap$from_closure(result, $K, $V));
+      return result;
+    },
+    LinkedHashMap_LinkedHashMap$of: function(other, $K, $V) {
+      var t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, $K, $V);
+      t1.addAll$1(0, other);
+      return t1;
+    },
+    LinkedHashSet_LinkedHashSet$from: function(elements, $E) {
+      var t1, _i,
+        result = P.LinkedHashSet_LinkedHashSet($E);
+      for (t1 = elements.length, _i = 0; _i < elements.length; elements.length === t1 || (0, H.throwConcurrentModificationError)(elements), ++_i)
+        result.add$1(0, $E._as(elements[_i]));
+      return result;
+    },
+    LinkedHashSet_LinkedHashSet$of: function(elements, $E) {
+      var t1 = P.LinkedHashSet_LinkedHashSet($E);
+      t1.addAll$1(0, elements);
+      return t1;
+    },
+    ListMixin__compareAny: function(a, b) {
+      var t1 = type$.Comparable_dynamic;
+      return J.compareTo$1$ns(t1._as(a), t1._as(b));
+    },
+    MapBase_mapToString: function(m) {
+      var result, t1 = {};
+      if (P._isToStringVisiting(m))
+        return "{...}";
+      result = new P.StringBuffer("");
+      try {
+        $._toStringVisiting.push(m);
+        result._contents += "{";
+        t1.first = true;
+        m.forEach$1(0, new P.MapBase_mapToString_closure(t1, result));
+        result._contents += "}";
+      } finally {
+        $._toStringVisiting.pop();
+      }
+      t1 = result._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    MapBase__fillMapWithIterables: function(map, keys, values) {
+      var keyIterator = keys.get$iterator(keys),
+        valueIterator = values.get$iterator(values),
+        hasNextKey = keyIterator.moveNext$0(),
+        hasNextValue = valueIterator.moveNext$0();
+      while (true) {
+        if (!(hasNextKey && hasNextValue))
+          break;
+        map.$indexSet(0, keyIterator.get$current(keyIterator), valueIterator.get$current(valueIterator));
+        hasNextKey = keyIterator.moveNext$0();
+        hasNextValue = valueIterator.moveNext$0();
+      }
+      if (hasNextKey || hasNextValue)
+        throw H.wrapException(P.ArgumentError$("Iterables do not have same length."));
+    },
+    ListQueue$: function($E) {
+      return new P.ListQueue(P.List_List$filled(P.ListQueue__calculateCapacity(null), null, false, $E._eval$1("0?")), $E._eval$1("ListQueue<0>"));
+    },
+    ListQueue__calculateCapacity: function(initialCapacity) {
+      return 8;
+    },
+    ListQueue_ListQueue$of: function(elements, $E) {
+      var t1 = P.ListQueue$($E);
+      t1.addAll$1(0, elements);
+      return t1;
+    },
+    ListQueue__nextPowerOf2: function(number) {
+      var nextNumber;
+      number = (number << 1 >>> 0) - 1;
+      for (; true; number = nextNumber) {
+        nextNumber = (number & number - 1) >>> 0;
+        if (nextNumber === 0)
+          return number;
+      }
+    },
+    _ListQueueIterator$: function(queue) {
+      return new P._ListQueueIterator(queue, queue._collection$_tail, queue._modificationCount, queue._collection$_head);
+    },
+    _HashMap: function _HashMap(t0) {
+      var _ = this;
+      _._collection$_length = 0;
+      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
+      _.$ti = t0;
+    },
+    _HashMap_values_closure: function _HashMap_values_closure(t0) {
+      this.$this = t0;
+    },
+    _HashMap_addAll_closure: function _HashMap_addAll_closure(t0) {
+      this.$this = t0;
+    },
+    _HashMapKeyIterable: function _HashMapKeyIterable(t0, t1) {
+      this._collection$_map = t0;
+      this.$ti = t1;
+    },
+    _HashMapKeyIterator: function _HashMapKeyIterator(t0, t1) {
+      var _ = this;
+      _._collection$_map = t0;
+      _._keys = t1;
+      _._offset = 0;
+      _._collection$_current = null;
+    },
+    _LinkedIdentityHashMap: function _LinkedIdentityHashMap(t0) {
+      var _ = this;
+      _.__js_helper$_length = 0;
+      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
+      _._modifications = 0;
+      _.$ti = t0;
+    },
+    _LinkedCustomHashMap: function _LinkedCustomHashMap(t0, t1, t2, t3) {
+      var _ = this;
+      _._equals = t0;
+      _._hashCode = t1;
+      _._validKey = t2;
+      _.__js_helper$_length = 0;
+      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
+      _._modifications = 0;
+      _.$ti = t3;
+    },
+    _LinkedCustomHashMap_closure: function _LinkedCustomHashMap_closure(t0) {
+      this.K = t0;
+    },
+    _LinkedHashSet: function _LinkedHashSet(t0) {
+      var _ = this;
+      _._collection$_length = 0;
+      _._collection$_last = _._collection$_first = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
+      _._collection$_modifications = 0;
+      _.$ti = t0;
+    },
+    _LinkedIdentityHashSet: function _LinkedIdentityHashSet(t0) {
+      var _ = this;
+      _._collection$_length = 0;
+      _._collection$_last = _._collection$_first = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
+      _._collection$_modifications = 0;
+      _.$ti = t0;
+    },
+    _LinkedHashSetCell: function _LinkedHashSetCell(t0) {
+      this._element = t0;
+      this._collection$_previous = this._collection$_next = null;
+    },
+    _LinkedHashSetIterator: function _LinkedHashSetIterator(t0, t1) {
+      var _ = this;
+      _._set = t0;
+      _._collection$_modifications = t1;
+      _._collection$_current = _._collection$_cell = null;
+    },
+    UnmodifiableListView: function UnmodifiableListView(t0, t1) {
+      this._collection$_source = t0;
+      this.$ti = t1;
+    },
+    HashMap_HashMap$from_closure: function HashMap_HashMap$from_closure(t0, t1, t2) {
+      this.result = t0;
+      this.K = t1;
+      this.V = t2;
+    },
+    IterableBase: function IterableBase() {
+    },
+    LinkedHashMap_LinkedHashMap$from_closure: function LinkedHashMap_LinkedHashMap$from_closure(t0, t1, t2) {
+      this.result = t0;
+      this.K = t1;
+      this.V = t2;
+    },
+    ListBase: function ListBase() {
+    },
+    ListMixin: function ListMixin() {
+    },
+    MapBase: function MapBase() {
+    },
+    MapBase_mapToString_closure: function MapBase_mapToString_closure(t0, t1) {
+      this._box_0 = t0;
+      this.result = t1;
+    },
+    MapMixin: function MapMixin() {
+    },
+    MapMixin_entries_closure: function MapMixin_entries_closure(t0) {
+      this.$this = t0;
+    },
+    UnmodifiableMapBase: function UnmodifiableMapBase() {
+    },
+    _MapBaseValueIterable: function _MapBaseValueIterable(t0, t1) {
+      this._collection$_map = t0;
+      this.$ti = t1;
+    },
+    _MapBaseValueIterator: function _MapBaseValueIterator(t0, t1) {
+      this._keys = t0;
+      this._collection$_map = t1;
+      this._collection$_current = null;
+    },
+    _UnmodifiableMapMixin: function _UnmodifiableMapMixin() {
+    },
+    MapView: function MapView() {
+    },
+    UnmodifiableMapView: function UnmodifiableMapView(t0, t1) {
+      this._collection$_map = t0;
+      this.$ti = t1;
+    },
+    ListQueue: function ListQueue(t0, t1) {
+      var _ = this;
+      _._collection$_table = t0;
+      _._modificationCount = _._collection$_tail = _._collection$_head = 0;
+      _.$ti = t1;
+    },
+    _ListQueueIterator: function _ListQueueIterator(t0, t1, t2, t3) {
+      var _ = this;
+      _._queue = t0;
+      _._collection$_end = t1;
+      _._modificationCount = t2;
+      _._collection$_position = t3;
+      _._collection$_current = null;
+    },
+    _SetBase: function _SetBase() {
+    },
+    _UnmodifiableSet: function _UnmodifiableSet(t0, t1) {
+      this._collection$_map = t0;
+      this.$ti = t1;
+    },
+    _ListBase_Object_ListMixin: function _ListBase_Object_ListMixin() {
+    },
+    _UnmodifiableMapView_MapView__UnmodifiableMapMixin: function _UnmodifiableMapView_MapView__UnmodifiableMapMixin() {
+    },
+    Utf8Decoder__convertIntercepted: function(allowMalformed, codeUnits, start, end) {
+      var casted, result;
+      if (codeUnits instanceof Uint8Array) {
+        casted = codeUnits;
+        end = casted.length;
+        if (end - start < 15)
+          return null;
+        result = P.Utf8Decoder__convertInterceptedUint8List(allowMalformed, casted, start, end);
+        if (result != null && allowMalformed)
+          if (result.indexOf("\ufffd") >= 0)
+            return null;
+        return result;
+      }
+      return null;
+    },
+    Utf8Decoder__convertInterceptedUint8List: function(allowMalformed, codeUnits, start, end) {
+      var decoder = allowMalformed ? $.$get$Utf8Decoder__decoderNonfatal() : $.$get$Utf8Decoder__decoder();
+      if (decoder == null)
+        return null;
+      if (0 === start && end === codeUnits.length)
+        return P.Utf8Decoder__useTextDecoder(decoder, codeUnits);
+      return P.Utf8Decoder__useTextDecoder(decoder, codeUnits.subarray(start, P.RangeError_checkValidRange(start, end, codeUnits.length)));
+    },
+    Utf8Decoder__useTextDecoder: function(decoder, codeUnits) {
+      var t1, exception;
+      try {
+        t1 = decoder.decode(codeUnits);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+      return null;
+    },
+    Base64Codec__checkPadding: function(source, sourceIndex, sourceEnd, firstPadding, paddingCount, $length) {
+      if (C.JSInt_methods.$mod($length, 4) !== 0)
+        throw H.wrapException(P.FormatException$("Invalid base64 padding, padded length must be multiple of four, is " + $length, source, sourceEnd));
+      if (firstPadding + paddingCount !== $length)
+        throw H.wrapException(P.FormatException$("Invalid base64 padding, '=' not at the end", source, sourceIndex));
+      if (paddingCount > 2)
+        throw H.wrapException(P.FormatException$("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
+    },
+    _Base64Encoder_encodeChunk: function(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
+      var t1, i, byteOr, byte, outputIndex0, outputIndex1,
+        bits = state >>> 2,
+        expectedChars = 3 - (state & 3);
+      for (t1 = J.getInterceptor$asx(bytes), i = start, byteOr = 0; i < end; ++i) {
+        byte = t1.$index(bytes, i);
+        byteOr = (byteOr | byte) >>> 0;
+        bits = (bits << 8 | byte) & 16777215;
+        --expectedChars;
+        if (expectedChars === 0) {
+          outputIndex0 = outputIndex + 1;
+          output[outputIndex] = C.JSString_methods._codeUnitAt$1(alphabet, bits >>> 18 & 63);
+          outputIndex = outputIndex0 + 1;
+          output[outputIndex0] = C.JSString_methods._codeUnitAt$1(alphabet, bits >>> 12 & 63);
+          outputIndex0 = outputIndex + 1;
+          output[outputIndex] = C.JSString_methods._codeUnitAt$1(alphabet, bits >>> 6 & 63);
+          outputIndex = outputIndex0 + 1;
+          output[outputIndex0] = C.JSString_methods._codeUnitAt$1(alphabet, bits & 63);
+          bits = 0;
+          expectedChars = 3;
+        }
+      }
+      if (byteOr >= 0 && byteOr <= 255) {
+        if (isLast && expectedChars < 3) {
+          outputIndex0 = outputIndex + 1;
+          outputIndex1 = outputIndex0 + 1;
+          if (3 - expectedChars === 1) {
+            output[outputIndex] = C.JSString_methods._codeUnitAt$1(alphabet, bits >>> 2 & 63);
+            output[outputIndex0] = C.JSString_methods._codeUnitAt$1(alphabet, bits << 4 & 63);
+            output[outputIndex1] = 61;
+            output[outputIndex1 + 1] = 61;
+          } else {
+            output[outputIndex] = C.JSString_methods._codeUnitAt$1(alphabet, bits >>> 10 & 63);
+            output[outputIndex0] = C.JSString_methods._codeUnitAt$1(alphabet, bits >>> 4 & 63);
+            output[outputIndex1] = C.JSString_methods._codeUnitAt$1(alphabet, bits << 2 & 63);
+            output[outputIndex1 + 1] = 61;
+          }
+          return 0;
+        }
+        return (bits << 2 | 3 - expectedChars) >>> 0;
+      }
+      for (i = start; i < end;) {
+        byte = t1.$index(bytes, i);
+        if (byte < 0 || byte > 255)
+          break;
+        ++i;
+      }
+      throw H.wrapException(P.ArgumentError$value(bytes, "Not a byte value at index " + i + ": 0x" + J.toRadixString$1$n(t1.$index(bytes, i), 16), null));
+    },
+    JsonUnsupportedObjectError$: function(unsupportedObject, cause, partialResult) {
+      return new P.JsonUnsupportedObjectError(unsupportedObject, cause);
+    },
+    _defaultToEncodable: function(object) {
+      return object.toJson$0();
+    },
+    _JsonStringStringifier$: function(_sink, _toEncodable) {
+      return new P._JsonStringStringifier(_sink, [], P.convert___defaultToEncodable$closure());
+    },
+    _JsonStringStringifier_stringify: function(object, toEncodable, indent) {
+      var t1,
+        output = new P.StringBuffer("");
+      P._JsonStringStringifier_printOn(object, output, toEncodable, indent);
+      t1 = output._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _JsonStringStringifier_printOn: function(object, output, toEncodable, indent) {
+      var stringifier = P._JsonStringStringifier$(output, toEncodable);
+      stringifier.writeObject$1(object);
+    },
+    _Utf8Decoder_errorDescription: function(state) {
+      switch (state) {
+        case 65:
+          return "Missing extension byte";
+        case 67:
+          return "Unexpected extension byte";
+        case 69:
+          return "Invalid UTF-8 byte";
+        case 71:
+          return "Overlong encoding";
+        case 73:
+          return "Out of unicode range";
+        case 75:
+          return "Encoded surrogate";
+        case 77:
+          return "Unfinished UTF-8 octet sequence";
+        default:
+          return "";
+      }
+    },
+    _Utf8Decoder__makeUint8List: function(codeUnits, start, end) {
+      var t1, i, b,
+        $length = end - start,
+        bytes = new Uint8Array($length);
+      for (t1 = J.getInterceptor$asx(codeUnits), i = 0; i < $length; ++i) {
+        b = t1.$index(codeUnits, start + i);
+        bytes[i] = (b & 4294967040) >>> 0 !== 0 ? 255 : b;
+      }
+      return bytes;
+    },
+    Utf8Decoder_closure: function Utf8Decoder_closure() {
+    },
+    Utf8Decoder_closure0: function Utf8Decoder_closure0() {
+    },
+    AsciiCodec: function AsciiCodec() {
+    },
+    _UnicodeSubsetEncoder: function _UnicodeSubsetEncoder() {
+    },
+    AsciiEncoder: function AsciiEncoder(t0) {
+      this._subsetMask = t0;
+    },
+    Base64Codec: function Base64Codec() {
+    },
+    Base64Encoder: function Base64Encoder() {
+    },
+    _Base64Encoder: function _Base64Encoder(t0) {
+      this._convert$_state = 0;
+      this._alphabet = t0;
+    },
+    _BufferCachingBase64Encoder: function _BufferCachingBase64Encoder(t0) {
+      this.bufferCache = null;
+      this._convert$_state = 0;
+      this._alphabet = t0;
+    },
+    _Base64EncoderSink: function _Base64EncoderSink() {
+    },
+    _AsciiBase64EncoderSink: function _AsciiBase64EncoderSink(t0, t1) {
+      this._sink = t0;
+      this._encoder = t1;
+    },
+    _Utf8Base64EncoderSink: function _Utf8Base64EncoderSink(t0, t1) {
+      this._sink = t0;
+      this._encoder = t1;
+    },
+    ByteConversionSink: function ByteConversionSink() {
+    },
+    ByteConversionSinkBase: function ByteConversionSinkBase() {
+    },
+    ChunkedConversionSink: function ChunkedConversionSink() {
+    },
+    Codec: function Codec() {
+    },
+    Converter: function Converter() {
+    },
+    Encoding: function Encoding() {
+    },
+    JsonUnsupportedObjectError: function JsonUnsupportedObjectError(t0, t1) {
+      this.unsupportedObject = t0;
+      this.cause = t1;
+    },
+    JsonCyclicError: function JsonCyclicError(t0, t1) {
+      this.unsupportedObject = t0;
+      this.cause = t1;
+    },
+    JsonCodec: function JsonCodec() {
+    },
+    JsonEncoder: function JsonEncoder(t0) {
+      this._toEncodable = t0;
+    },
+    _JsonStringifier: function _JsonStringifier() {
+    },
+    _JsonStringifier_writeMap_closure: function _JsonStringifier_writeMap_closure(t0, t1) {
+      this._box_0 = t0;
+      this.keyValueList = t1;
+    },
+    _JsonStringStringifier: function _JsonStringStringifier(t0, t1, t2) {
+      this._sink = t0;
+      this._seen = t1;
+      this._toEncodable = t2;
+    },
+    StringConversionSinkBase: function StringConversionSinkBase() {
+    },
+    StringConversionSinkMixin: function StringConversionSinkMixin() {
+    },
+    _StringSinkConversionSink: function _StringSinkConversionSink(t0) {
+      this._stringSink = t0;
+    },
+    _StringCallbackSink: function _StringCallbackSink(t0, t1) {
+      this._convert$_callback = t0;
+      this._stringSink = t1;
+    },
+    _StringAdapterSink: function _StringAdapterSink(t0) {
+      this._sink = t0;
+    },
+    _Utf8StringSinkAdapter: function _Utf8StringSinkAdapter(t0, t1, t2) {
+      this._decoder = t0;
+      this._sink = t1;
+      this._stringSink = t2;
+    },
+    _Utf8ConversionSink: function _Utf8ConversionSink(t0, t1, t2) {
+      this._decoder = t0;
+      this._chunkedSink = t1;
+      this._convert$_buffer = t2;
+    },
+    Utf8Codec: function Utf8Codec() {
+    },
+    Utf8Encoder: function Utf8Encoder() {
+    },
+    _Utf8Encoder: function _Utf8Encoder(t0) {
+      this._bufferIndex = this._carry = 0;
+      this._convert$_buffer = t0;
+    },
+    Utf8Decoder: function Utf8Decoder(t0) {
+      this._allowMalformed = t0;
+    },
+    _Utf8Decoder: function _Utf8Decoder(t0) {
+      this.allowMalformed = t0;
+      this._convert$_state = 16;
+      this._charOrIndex = 0;
+    },
+    identityHashCode: function(object) {
+      return H.objectHashCode(object);
+    },
+    Function_apply: function($function, positionalArguments) {
+      return H.Primitives_applyFunction($function, positionalArguments, null);
+    },
+    int_parse: function(source, radix) {
+      var value = H.Primitives_parseInt(source, radix);
+      if (value != null)
+        return value;
+      throw H.wrapException(P.FormatException$(source, null, null));
+    },
+    double_parse: function(source) {
+      var value = H.Primitives_parseDouble(source);
+      if (value != null)
+        return value;
+      throw H.wrapException(P.FormatException$("Invalid double", source, null));
+    },
+    Error__objectToString: function(object) {
+      if (object instanceof H.Closure)
+        return object.toString$0(0);
+      return "Instance of '" + H.S(H.Primitives_objectTypeName(object)) + "'";
+    },
+    List_List$filled: function($length, fill, growable, $E) {
+      var i,
+        result = growable ? J.JSArray_JSArray$growable($length, $E) : J.JSArray_JSArray$fixed($length, $E);
+      if ($length !== 0 && fill != null)
+        for (i = 0; i < result.length; ++i)
+          result[i] = fill;
+      return result;
+    },
+    List_List$from: function(elements, growable, $E) {
+      var t1,
+        list = H.setRuntimeTypeInfo([], $E._eval$1("JSArray<0>"));
+      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
+        list.push(t1.get$current(t1));
+      if (growable)
+        return list;
+      return J.JSArray_markFixedList(list);
+    },
+    List_List$generate: function($length, generator, growable, $E) {
+      var i,
+        result = growable ? J.JSArray_JSArray$growable($length, $E) : J.JSArray_JSArray$fixed($length, $E);
+      for (i = 0; i < $length; ++i)
+        result[i] = generator.call$1(i);
+      return result;
+    },
+    List_List$unmodifiable: function(elements, $E) {
+      return J.JSArray_markUnmodifiableList(P.List_List$from(elements, false, $E));
+    },
+    String_String$fromCharCodes: function(charCodes, start, end) {
+      var array, len;
+      if (Array.isArray(charCodes)) {
+        array = charCodes;
+        len = array.length;
+        end = P.RangeError_checkValidRange(start, end, len);
+        return H.Primitives_stringFromCharCodes(start > 0 || end < len ? array.slice(start, end) : array);
+      }
+      if (type$.NativeUint8List._is(charCodes))
+        return H.Primitives_stringFromNativeUint8List(charCodes, start, P.RangeError_checkValidRange(start, end, charCodes.length));
+      return P.String__stringFromIterable(charCodes, start, end);
+    },
+    String_String$fromCharCode: function(charCode) {
+      return H.Primitives_stringFromCharCode(charCode);
+    },
+    String__stringFromIterable: function(charCodes, start, end) {
+      var t1, it, i, list, _null = null;
+      if (start < 0)
+        throw H.wrapException(P.RangeError$range(start, 0, J.get$length$asx(charCodes), _null, _null));
+      t1 = end == null;
+      if (!t1 && end < start)
+        throw H.wrapException(P.RangeError$range(end, start, J.get$length$asx(charCodes), _null, _null));
+      it = J.get$iterator$ax(charCodes);
+      for (i = 0; i < start; ++i)
+        if (!it.moveNext$0())
+          throw H.wrapException(P.RangeError$range(start, 0, i, _null, _null));
+      list = [];
+      if (t1)
+        for (; it.moveNext$0();)
+          list.push(it.get$current(it));
+      else
+        for (i = start; i < end; ++i) {
+          if (!it.moveNext$0())
+            throw H.wrapException(P.RangeError$range(end, start, i, _null, _null));
+          list.push(it.get$current(it));
+        }
+      return H.Primitives_stringFromCharCodes(list);
+    },
+    RegExp_RegExp: function(source, multiLine) {
+      return new H.JSSyntaxRegExp(source, H.JSSyntaxRegExp_makeNative(source, multiLine, true, false, false, false));
+    },
+    identical: function(a, b) {
+      return a == null ? b == null : a === b;
+    },
+    StringBuffer__writeAll: function(string, objects, separator) {
+      var iterator = J.get$iterator$ax(objects);
+      if (!iterator.moveNext$0())
+        return string;
+      if (separator.length === 0) {
+        do
+          string += H.S(iterator.get$current(iterator));
+        while (iterator.moveNext$0());
+      } else {
+        string += H.S(iterator.get$current(iterator));
+        for (; iterator.moveNext$0();)
+          string = string + separator + H.S(iterator.get$current(iterator));
+      }
+      return string;
+    },
+    NoSuchMethodError$: function(receiver, memberName, positionalArguments, namedArguments) {
+      return new P.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments);
+    },
+    Uri_base: function() {
+      var uri = H.Primitives_currentUri();
+      if (uri != null)
+        return P.Uri_parse(uri);
+      throw H.wrapException(P.UnsupportedError$("'Uri.base' is not supported"));
+    },
+    _Uri__uriEncode: function(canonicalTable, text, encoding, spaceToPlus) {
+      var t1, bytes, i, t2, byte,
+        _s16_ = "0123456789ABCDEF";
+      if (encoding === C.C_Utf8Codec) {
+        t1 = $.$get$_Uri__needsNoEncoding()._nativeRegExp;
+        if (typeof text != "string")
+          H.throwExpression(H.argumentErrorValue(text));
+        t1 = t1.test(text);
+      } else
+        t1 = false;
+      if (t1)
+        return text;
+      bytes = encoding.get$encoder().convert$1(text);
+      for (t1 = bytes.length, i = 0, t2 = ""; i < t1; ++i) {
+        byte = bytes[i];
+        if (byte < 128 && (canonicalTable[byte >>> 4] & 1 << (byte & 15)) !== 0)
+          t2 += H.Primitives_stringFromCharCode(byte);
+        else
+          t2 = spaceToPlus && byte === 32 ? t2 + "+" : t2 + "%" + _s16_[byte >>> 4 & 15] + _s16_[byte & 15];
+      }
+      return t2.charCodeAt(0) == 0 ? t2 : t2;
+    },
+    StackTrace_current: function() {
+      var stackTrace, exception;
+      if ($.$get$_hasErrorStackProperty())
+        return H.getTraceFromException(new Error());
+      try {
+        throw H.wrapException("");
+      } catch (exception) {
+        H.unwrapException(exception);
+        stackTrace = H.getTraceFromException(exception);
+        return stackTrace;
+      }
+    },
+    DateTime$_withValue: function(_value, isUtc) {
+      var t1;
+      if (Math.abs(_value) <= 864e13)
+        t1 = false;
+      else
+        t1 = true;
+      if (t1)
+        H.throwExpression(P.ArgumentError$("DateTime is outside valid range: " + _value));
+      P.ArgumentError_checkNotNull(false, "isUtc");
+      return new P.DateTime(_value, false);
+    },
+    DateTime__fourDigits: function(n) {
+      var absN = Math.abs(n),
+        sign = n < 0 ? "-" : "";
+      if (absN >= 1000)
+        return "" + n;
+      if (absN >= 100)
+        return sign + "0" + absN;
+      if (absN >= 10)
+        return sign + "00" + absN;
+      return sign + "000" + absN;
+    },
+    DateTime__threeDigits: function(n) {
+      if (n >= 100)
+        return "" + n;
+      if (n >= 10)
+        return "0" + n;
+      return "00" + n;
+    },
+    DateTime__twoDigits: function(n) {
+      if (n >= 10)
+        return "" + n;
+      return "0" + n;
+    },
+    Duration$: function(milliseconds) {
+      return new P.Duration(1000 * milliseconds);
+    },
+    Error_safeToString: function(object) {
+      if (typeof object == "number" || H._isBool(object) || null == object)
+        return J.toString$0$(object);
+      if (typeof object == "string")
+        return JSON.stringify(object);
+      return P.Error__objectToString(object);
+    },
+    AssertionError$: function(message) {
+      return new P.AssertionError(message);
+    },
+    ArgumentError$: function(message) {
+      return new P.ArgumentError(false, null, null, message);
+    },
+    ArgumentError$value: function(value, $name, message) {
+      return new P.ArgumentError(true, value, $name, message);
+    },
+    ArgumentError$notNull: function($name) {
+      return new P.ArgumentError(false, null, $name, "Must not be null");
+    },
+    ArgumentError_checkNotNull: function(argument, $name) {
+      if (argument == null)
+        throw H.wrapException(P.ArgumentError$notNull($name));
+      return argument;
+    },
+    RangeError$: function(message) {
+      var _null = null;
+      return new P.RangeError(_null, _null, false, _null, _null, message);
+    },
+    RangeError$value: function(value, $name, message) {
+      return new P.RangeError(null, null, true, value, $name, message == null ? "Value not in range" : message);
+    },
+    RangeError$range: function(invalidValue, minValue, maxValue, $name, message) {
+      return new P.RangeError(minValue, maxValue, true, invalidValue, $name, message == null ? "Invalid value" : message);
+    },
+    RangeError_checkValueInInterval: function(value, minValue, maxValue, $name) {
+      if (value < minValue || value > maxValue)
+        throw H.wrapException(P.RangeError$range(value, minValue, maxValue, $name, null));
+      return value;
+    },
+    RangeError_checkValidIndex: function(index, indexable, $name) {
+      var $length = indexable.get$length(indexable);
+      if (0 > index || index >= $length)
+        throw H.wrapException(P.IndexError$(index, indexable, $name == null ? "index" : $name, null, $length));
+      return index;
+    },
+    RangeError_checkValidRange: function(start, end, $length) {
+      if (0 > start || start > $length)
+        throw H.wrapException(P.RangeError$range(start, 0, $length, "start", null));
+      if (end != null) {
+        if (start > end || end > $length)
+          throw H.wrapException(P.RangeError$range(end, start, $length, "end", null));
+        return end;
+      }
+      return $length;
+    },
+    RangeError_checkNotNegative: function(value, $name) {
+      if (value < 0)
+        throw H.wrapException(P.RangeError$range(value, 0, null, $name, null));
+      return value;
+    },
+    IndexError$: function(invalidValue, indexable, $name, message, $length) {
+      var t1 = $length == null ? J.get$length$asx(indexable) : $length;
+      return new P.IndexError(t1, true, invalidValue, $name, "Index out of range");
+    },
+    UnsupportedError$: function(message) {
+      return new P.UnsupportedError(message);
+    },
+    UnimplementedError$: function(message) {
+      return new P.UnimplementedError(message);
+    },
+    StateError$: function(message) {
+      return new P.StateError(message);
+    },
+    ConcurrentModificationError$: function(modifiedObject) {
+      return new P.ConcurrentModificationError(modifiedObject);
+    },
+    FormatException$: function(message, source, offset) {
+      return new P.FormatException(message, source, offset);
+    },
+    Iterable_Iterable$generate: function(count, generator, $E) {
+      if (count <= 0)
+        return new H.EmptyIterable($E._eval$1("EmptyIterable<0>"));
+      return new P._GeneratorIterable(count, generator, $E._eval$1("_GeneratorIterable<0>"));
+    },
+    print: function(object) {
+      var line = J.toString$0$(object),
+        toZone = $.printToZone;
+      if (toZone == null)
+        H.printString(H.S(line));
+      else
+        toZone.call$1(line);
+    },
+    Set_castFrom: function(source, newSet, $S, $T) {
+      return new H.CastSet(source, newSet, $S._eval$1("@<0>")._bind$1($T)._eval$1("CastSet<1,2>"));
+    },
+    _combineSurrogatePair: function(start, end) {
+      return 65536 + ((start & 1023) << 10) + (end & 1023);
+    },
+    RuneIterator$: function(string) {
+      return new P.RuneIterator(string);
+    },
+    Uri_Uri$dataFromString: function($content, encoding, mimeType) {
+      var encodingName, t1,
+        buffer = new P.StringBuffer(""),
+        indices = H.setRuntimeTypeInfo([-1], type$.JSArray_int);
+      if (encoding == null)
+        encodingName = null;
+      else
+        encodingName = "utf-8";
+      if (encoding == null)
+        encoding = C.C_AsciiCodec;
+      P.UriData__writeUri(mimeType, encodingName, null, buffer, indices);
+      indices.push(buffer._contents.length);
+      buffer._contents += ",";
+      P.UriData__uriEncodeBytes(C.List_CVk, encoding.encode$1($content), buffer);
+      t1 = buffer._contents;
+      return new P.UriData(t1.charCodeAt(0) == 0 ? t1 : t1, indices, null).get$uri();
+    },
+    Uri_parse: function(uri) {
+      var delta, indices, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, isSimple, scheme, t1, t2, schemeAuth, queryStart0, pathStart0, userInfoStart, userInfo, host, portNumber, port, path, query, _null = null,
+        end = uri.length;
+      if (end >= 5) {
+        delta = ((J._codeUnitAt$1$s(uri, 4) ^ 58) * 3 | C.JSString_methods._codeUnitAt$1(uri, 0) ^ 100 | C.JSString_methods._codeUnitAt$1(uri, 1) ^ 97 | C.JSString_methods._codeUnitAt$1(uri, 2) ^ 116 | C.JSString_methods._codeUnitAt$1(uri, 3) ^ 97) >>> 0;
+        if (delta === 0)
+          return P.UriData__parse(end < end ? C.JSString_methods.substring$2(uri, 0, end) : uri, 5, _null).get$uri();
+        else if (delta === 32)
+          return P.UriData__parse(C.JSString_methods.substring$2(uri, 5, end), 0, _null).get$uri();
+      }
+      indices = P.List_List$filled(8, 0, false, type$.int);
+      indices[0] = 0;
+      indices[1] = -1;
+      indices[2] = -1;
+      indices[7] = -1;
+      indices[3] = 0;
+      indices[4] = 0;
+      indices[5] = end;
+      indices[6] = end;
+      if (P._scan(uri, 0, end, 0, indices) >= 14)
+        indices[7] = end;
+      schemeEnd = indices[1];
+      if (schemeEnd >= 0)
+        if (P._scan(uri, 0, schemeEnd, 20, indices) === 20)
+          indices[7] = schemeEnd;
+      hostStart = indices[2] + 1;
+      portStart = indices[3];
+      pathStart = indices[4];
+      queryStart = indices[5];
+      fragmentStart = indices[6];
+      if (fragmentStart < queryStart)
+        queryStart = fragmentStart;
+      if (pathStart < hostStart)
+        pathStart = queryStart;
+      else if (pathStart <= schemeEnd)
+        pathStart = schemeEnd + 1;
+      if (portStart < hostStart)
+        portStart = pathStart;
+      isSimple = indices[7] < 0;
+      if (isSimple)
+        if (hostStart > schemeEnd + 3) {
+          scheme = _null;
+          isSimple = false;
+        } else {
+          t1 = portStart > 0;
+          if (t1 && portStart + 1 === pathStart) {
+            scheme = _null;
+            isSimple = false;
+          } else {
+            if (!(queryStart < end && queryStart === pathStart + 2 && J.startsWith$2$s(uri, "..", pathStart)))
+              t2 = queryStart > pathStart + 2 && J.startsWith$2$s(uri, "/..", queryStart - 3);
+            else
+              t2 = true;
+            if (t2) {
+              scheme = _null;
+              isSimple = false;
+            } else {
+              if (schemeEnd === 4)
+                if (J.startsWith$2$s(uri, "file", 0)) {
+                  if (hostStart <= 0) {
+                    if (!C.JSString_methods.startsWith$2(uri, "/", pathStart)) {
+                      schemeAuth = "file:///";
+                      delta = 3;
+                    } else {
+                      schemeAuth = "file://";
+                      delta = 2;
+                    }
+                    uri = schemeAuth + C.JSString_methods.substring$2(uri, pathStart, end);
+                    schemeEnd -= 0;
+                    t1 = delta - 0;
+                    queryStart += t1;
+                    fragmentStart += t1;
+                    end = uri.length;
+                    hostStart = 7;
+                    portStart = 7;
+                    pathStart = 7;
+                  } else if (pathStart === queryStart) {
+                    ++fragmentStart;
+                    queryStart0 = queryStart + 1;
+                    uri = C.JSString_methods.replaceRange$3(uri, pathStart, queryStart, "/");
+                    ++end;
+                    queryStart = queryStart0;
+                  }
+                  scheme = "file";
+                } else if (C.JSString_methods.startsWith$2(uri, "http", 0)) {
+                  if (t1 && portStart + 3 === pathStart && C.JSString_methods.startsWith$2(uri, "80", portStart + 1)) {
+                    fragmentStart -= 3;
+                    pathStart0 = pathStart - 3;
+                    queryStart -= 3;
+                    uri = C.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
+                    end -= 3;
+                    pathStart = pathStart0;
+                  }
+                  scheme = "http";
+                } else
+                  scheme = _null;
+              else if (schemeEnd === 5 && J.startsWith$2$s(uri, "https", 0)) {
+                if (t1 && portStart + 4 === pathStart && J.startsWith$2$s(uri, "443", portStart + 1)) {
+                  fragmentStart -= 4;
+                  pathStart0 = pathStart - 4;
+                  queryStart -= 4;
+                  uri = J.replaceRange$3$asx(uri, portStart, pathStart, "");
+                  end -= 3;
+                  pathStart = pathStart0;
+                }
+                scheme = "https";
+              } else
+                scheme = _null;
+              isSimple = true;
+            }
+          }
+        }
+      else
+        scheme = _null;
+      if (isSimple) {
+        t1 = uri.length;
+        if (end < t1) {
+          uri = J.substring$2$s(uri, 0, end);
+          schemeEnd -= 0;
+          hostStart -= 0;
+          portStart -= 0;
+          pathStart -= 0;
+          queryStart -= 0;
+          fragmentStart -= 0;
+        }
+        return new P._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+      }
+      if (scheme == null)
+        if (schemeEnd > 0)
+          scheme = P._Uri__makeScheme(uri, 0, schemeEnd);
+        else {
+          if (schemeEnd === 0)
+            P._Uri__fail(uri, 0, "Invalid empty scheme");
+          scheme = "";
+        }
+      if (hostStart > 0) {
+        userInfoStart = schemeEnd + 3;
+        userInfo = userInfoStart < hostStart ? P._Uri__makeUserInfo(uri, userInfoStart, hostStart - 1) : "";
+        host = P._Uri__makeHost(uri, hostStart, portStart, false);
+        t1 = portStart + 1;
+        if (t1 < pathStart) {
+          portNumber = H.Primitives_parseInt(J.substring$2$s(uri, t1, pathStart), _null);
+          port = P._Uri__makePort(portNumber == null ? H.throwExpression(P.FormatException$("Invalid port", uri, t1)) : portNumber, scheme);
+        } else
+          port = _null;
+      } else {
+        port = _null;
+        host = port;
+        userInfo = "";
+      }
+      path = P._Uri__makePath(uri, pathStart, queryStart, _null, scheme, host != null);
+      query = queryStart < fragmentStart ? P._Uri__makeQuery(uri, queryStart + 1, fragmentStart, _null) : _null;
+      return new P._Uri(scheme, userInfo, host, port, path, query, fragmentStart < end ? P._Uri__makeFragment(uri, fragmentStart + 1, end) : _null);
+    },
+    Uri_decodeComponent: function(encodedComponent) {
+      return P._Uri__uriDecode(encodedComponent, 0, encodedComponent.length, C.C_Utf8Codec, false);
+    },
+    Uri__parseIPv4Address: function(host, start, end) {
+      var i, partStart, partIndex, char, part, partIndex0,
+        _s43_ = "IPv4 address should contain exactly 4 parts",
+        _s37_ = "each part must be in the range 0..255",
+        error = new P.Uri__parseIPv4Address_error(host),
+        result = new Uint8Array(4);
+      for (i = start, partStart = i, partIndex = 0; i < end; ++i) {
+        char = C.JSString_methods.codeUnitAt$1(host, i);
+        if (char !== 46) {
+          if ((char ^ 48) > 9)
+            error.call$2("invalid character", i);
+        } else {
+          if (partIndex === 3)
+            error.call$2(_s43_, i);
+          part = P.int_parse(C.JSString_methods.substring$2(host, partStart, i), null);
+          if (part > 255)
+            error.call$2(_s37_, partStart);
+          partIndex0 = partIndex + 1;
+          result[partIndex] = part;
+          partStart = i + 1;
+          partIndex = partIndex0;
+        }
+      }
+      if (partIndex !== 3)
+        error.call$2(_s43_, end);
+      part = P.int_parse(C.JSString_methods.substring$2(host, partStart, end), null);
+      if (part > 255)
+        error.call$2(_s37_, partStart);
+      result[partIndex] = part;
+      return result;
+    },
+    Uri_parseIPv6Address: function(host, start, end) {
+      var parts, i, partStart, wildcardSeen, seenDot, char, atEnd, t1, last, bytes, wildCardLength, index, value, j,
+        error = new P.Uri_parseIPv6Address_error(host),
+        parseHex = new P.Uri_parseIPv6Address_parseHex(error, host);
+      if (host.length < 2)
+        error.call$1("address is too short");
+      parts = H.setRuntimeTypeInfo([], type$.JSArray_int);
+      for (i = start, partStart = i, wildcardSeen = false, seenDot = false; i < end; ++i) {
+        char = C.JSString_methods.codeUnitAt$1(host, i);
+        if (char === 58) {
+          if (i === start) {
+            ++i;
+            if (C.JSString_methods.codeUnitAt$1(host, i) !== 58)
+              error.call$2("invalid start colon.", i);
+            partStart = i;
+          }
+          if (i === partStart) {
+            if (wildcardSeen)
+              error.call$2("only one wildcard `::` is allowed", i);
+            parts.push(-1);
+            wildcardSeen = true;
+          } else
+            parts.push(parseHex.call$2(partStart, i));
+          partStart = i + 1;
+        } else if (char === 46)
+          seenDot = true;
+      }
+      if (parts.length === 0)
+        error.call$1("too few parts");
+      atEnd = partStart === end;
+      t1 = C.JSArray_methods.get$last(parts);
+      if (atEnd && t1 !== -1)
+        error.call$2("expected a part after last `:`", end);
+      if (!atEnd)
+        if (!seenDot)
+          parts.push(parseHex.call$2(partStart, end));
+        else {
+          last = P.Uri__parseIPv4Address(host, partStart, end);
+          parts.push((last[0] << 8 | last[1]) >>> 0);
+          parts.push((last[2] << 8 | last[3]) >>> 0);
+        }
+      if (wildcardSeen) {
+        if (parts.length > 7)
+          error.call$1("an address with a wildcard must have less than 7 parts");
+      } else if (parts.length !== 8)
+        error.call$1("an address without a wildcard must contain exactly 8 parts");
+      bytes = new Uint8Array(16);
+      for (t1 = parts.length, wildCardLength = 9 - t1, i = 0, index = 0; i < t1; ++i) {
+        value = parts[i];
+        if (value === -1)
+          for (j = 0; j < wildCardLength; ++j) {
+            bytes[index] = 0;
+            bytes[index + 1] = 0;
+            index += 2;
+          }
+        else {
+          bytes[index] = C.JSInt_methods._shrOtherPositive$1(value, 8);
+          bytes[index + 1] = value & 255;
+          index += 2;
+        }
+      }
+      return bytes;
+    },
+    _Uri__Uri: function(host, path, pathSegments, scheme) {
+      var userInfo, query, fragment, port, isFile, t1, hasAuthority, t2, _null = null;
+      scheme = scheme == null ? "" : P._Uri__makeScheme(scheme, 0, scheme.length);
+      userInfo = P._Uri__makeUserInfo(_null, 0, 0);
+      host = P._Uri__makeHost(host, 0, host == null ? 0 : host.length, false);
+      query = P._Uri__makeQuery(_null, 0, 0, _null);
+      fragment = P._Uri__makeFragment(_null, 0, 0);
+      port = P._Uri__makePort(_null, scheme);
+      isFile = scheme === "file";
+      if (host == null)
+        t1 = userInfo.length !== 0 || port != null || isFile;
+      else
+        t1 = false;
+      if (t1)
+        host = "";
+      t1 = host == null;
+      hasAuthority = !t1;
+      path = P._Uri__makePath(path, 0, path == null ? 0 : path.length, pathSegments, scheme, hasAuthority);
+      t2 = scheme.length === 0;
+      if (t2 && t1 && !C.JSString_methods.startsWith$1(path, "/"))
+        path = P._Uri__normalizeRelativePath(path, !t2 || hasAuthority);
+      else
+        path = P._Uri__removeDotSegments(path);
+      return new P._Uri(scheme, userInfo, t1 && C.JSString_methods.startsWith$1(path, "//") ? "" : host, port, path, query, fragment);
+    },
+    _Uri__defaultPort: function(scheme) {
+      if (scheme === "http")
+        return 80;
+      if (scheme === "https")
+        return 443;
+      return 0;
+    },
+    _Uri__fail: function(uri, index, message) {
+      throw H.wrapException(P.FormatException$(message, uri, index));
+    },
+    _Uri__Uri$file: function(path, windows) {
+      return windows ? P._Uri__makeWindowsFileUrl(path, false) : P._Uri__makeFileUri(path, false);
+    },
+    _Uri__checkNonWindowsPathReservedCharacters: function(segments, argumentError) {
+      var t1, _i, segment, t2, t3;
+      for (t1 = segments.length, _i = 0; _i < t1; ++_i) {
+        segment = segments[_i];
+        segment.toString;
+        t2 = J.getInterceptor$asx(segment);
+        t3 = t2.get$length(segment);
+        if (0 > t3)
+          H.throwExpression(P.RangeError$range(0, 0, t2.get$length(segment), null, null));
+        if (H.stringContainsUnchecked(segment, "/", 0)) {
+          t1 = P.UnsupportedError$("Illegal path character " + H.S(segment));
+          throw H.wrapException(t1);
+        }
+      }
+    },
+    _Uri__checkWindowsPathReservedCharacters: function(segments, argumentError, firstSegment) {
+      var t1, cur, t2;
+      for (t1 = H.SubListIterable$(segments, firstSegment, null, H._arrayInstanceType(segments)._precomputed1), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        t2 = P.RegExp_RegExp('["*/:<>?\\\\|]', false);
+        cur.toString;
+        if (H.stringContainsUnchecked(cur, t2, 0))
+          if (argumentError)
+            throw H.wrapException(P.ArgumentError$("Illegal character in path"));
+          else
+            throw H.wrapException(P.UnsupportedError$("Illegal character in path: " + cur));
+      }
+    },
+    _Uri__checkWindowsDriveLetter: function(charCode, argumentError) {
+      var t1,
+        _s21_ = "Illegal drive letter ";
+      if (!(65 <= charCode && charCode <= 90))
+        t1 = 97 <= charCode && charCode <= 122;
+      else
+        t1 = true;
+      if (t1)
+        return;
+      if (argumentError)
+        throw H.wrapException(P.ArgumentError$(_s21_ + P.String_String$fromCharCode(charCode)));
+      else
+        throw H.wrapException(P.UnsupportedError$(_s21_ + P.String_String$fromCharCode(charCode)));
+    },
+    _Uri__makeFileUri: function(path, slashTerminated) {
+      var _null = null,
+        segments = H.setRuntimeTypeInfo(path.split("/"), type$.JSArray_String);
+      if (C.JSString_methods.startsWith$1(path, "/"))
+        return P._Uri__Uri(_null, _null, segments, "file");
+      else
+        return P._Uri__Uri(_null, _null, segments, _null);
+    },
+    _Uri__makeWindowsFileUrl: function(path, slashTerminated) {
+      var t1, pathSegments, pathStart, hostPart, _s1_ = "\\", _null = null, _s4_ = "file";
+      if (C.JSString_methods.startsWith$1(path, "\\\\?\\"))
+        if (C.JSString_methods.startsWith$2(path, "UNC\\", 4))
+          path = C.JSString_methods.replaceRange$3(path, 0, 7, _s1_);
+        else {
+          path = C.JSString_methods.substring$1(path, 4);
+          if (path.length < 3 || C.JSString_methods._codeUnitAt$1(path, 1) !== 58 || C.JSString_methods._codeUnitAt$1(path, 2) !== 92)
+            throw H.wrapException(P.ArgumentError$("Windows paths with \\\\?\\ prefix must be absolute"));
+        }
+      else
+        path = H.stringReplaceAllUnchecked(path, "/", _s1_);
+      t1 = path.length;
+      if (t1 > 1 && C.JSString_methods._codeUnitAt$1(path, 1) === 58) {
+        P._Uri__checkWindowsDriveLetter(C.JSString_methods._codeUnitAt$1(path, 0), true);
+        if (t1 === 2 || C.JSString_methods._codeUnitAt$1(path, 2) !== 92)
+          throw H.wrapException(P.ArgumentError$("Windows paths with drive letter must be absolute"));
+        pathSegments = H.setRuntimeTypeInfo(path.split(_s1_), type$.JSArray_String);
+        P._Uri__checkWindowsPathReservedCharacters(pathSegments, true, 1);
+        return P._Uri__Uri(_null, _null, pathSegments, _s4_);
+      }
+      if (C.JSString_methods.startsWith$1(path, _s1_))
+        if (C.JSString_methods.startsWith$2(path, _s1_, 1)) {
+          pathStart = C.JSString_methods.indexOf$2(path, _s1_, 2);
+          t1 = pathStart < 0;
+          hostPart = t1 ? C.JSString_methods.substring$1(path, 2) : C.JSString_methods.substring$2(path, 2, pathStart);
+          pathSegments = H.setRuntimeTypeInfo((t1 ? "" : C.JSString_methods.substring$1(path, pathStart + 1)).split(_s1_), type$.JSArray_String);
+          P._Uri__checkWindowsPathReservedCharacters(pathSegments, true, 0);
+          return P._Uri__Uri(hostPart, _null, pathSegments, _s4_);
+        } else {
+          pathSegments = H.setRuntimeTypeInfo(path.split(_s1_), type$.JSArray_String);
+          P._Uri__checkWindowsPathReservedCharacters(pathSegments, true, 0);
+          return P._Uri__Uri(_null, _null, pathSegments, _s4_);
+        }
+      else {
+        pathSegments = H.setRuntimeTypeInfo(path.split(_s1_), type$.JSArray_String);
+        P._Uri__checkWindowsPathReservedCharacters(pathSegments, true, 0);
+        return P._Uri__Uri(_null, _null, pathSegments, _null);
+      }
+    },
+    _Uri__makePort: function(port, scheme) {
+      if (port != null && port === P._Uri__defaultPort(scheme))
+        return null;
+      return port;
+    },
+    _Uri__makeHost: function(host, start, end, strictIPv6) {
+      var t1, t2, index, zoneIDstart, zoneID, i;
+      if (host == null)
+        return null;
+      if (start === end)
+        return "";
+      if (C.JSString_methods.codeUnitAt$1(host, start) === 91) {
+        t1 = end - 1;
+        if (C.JSString_methods.codeUnitAt$1(host, t1) !== 93)
+          P._Uri__fail(host, start, "Missing end `]` to match `[` in host");
+        t2 = start + 1;
+        index = P._Uri__checkZoneID(host, t2, t1);
+        if (index < t1) {
+          zoneIDstart = index + 1;
+          zoneID = P._Uri__normalizeZoneID(host, C.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, t1, "%25");
+        } else
+          zoneID = "";
+        P.Uri_parseIPv6Address(host, t2, index);
+        return C.JSString_methods.substring$2(host, start, index).toLowerCase() + zoneID + "]";
+      }
+      for (i = start; i < end; ++i)
+        if (C.JSString_methods.codeUnitAt$1(host, i) === 58) {
+          index = C.JSString_methods.indexOf$2(host, "%", start);
+          index = index >= start && index < end ? index : end;
+          if (index < end) {
+            zoneIDstart = index + 1;
+            zoneID = P._Uri__normalizeZoneID(host, C.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, end, "%25");
+          } else
+            zoneID = "";
+          P.Uri_parseIPv6Address(host, start, index);
+          return "[" + C.JSString_methods.substring$2(host, start, index) + zoneID + "]";
+        }
+      return P._Uri__normalizeRegName(host, start, end);
+    },
+    _Uri__checkZoneID: function(host, start, end) {
+      var index = C.JSString_methods.indexOf$2(host, "%", start);
+      return index >= start && index < end ? index : end;
+    },
+    _Uri__normalizeZoneID: function(host, start, end, prefix) {
+      var index, sectionStart, isNormalized, char, replacement, t1, t2, tail, sourceLength, slice,
+        buffer = prefix !== "" ? new P.StringBuffer(prefix) : null;
+      for (index = start, sectionStart = index, isNormalized = true; index < end;) {
+        char = C.JSString_methods.codeUnitAt$1(host, index);
+        if (char === 37) {
+          replacement = P._Uri__normalizeEscape(host, index, true);
+          t1 = replacement == null;
+          if (t1 && isNormalized) {
+            index += 3;
+            continue;
+          }
+          if (buffer == null)
+            buffer = new P.StringBuffer("");
+          t2 = buffer._contents += C.JSString_methods.substring$2(host, sectionStart, index);
+          if (t1)
+            replacement = C.JSString_methods.substring$2(host, index, index + 3);
+          else if (replacement === "%")
+            P._Uri__fail(host, index, "ZoneID should not contain % anymore");
+          buffer._contents = t2 + replacement;
+          index += 3;
+          sectionStart = index;
+          isNormalized = true;
+        } else if (char < 127 && (C.List_nxB[char >>> 4] & 1 << (char & 15)) !== 0) {
+          if (isNormalized && 65 <= char && 90 >= char) {
+            if (buffer == null)
+              buffer = new P.StringBuffer("");
+            if (sectionStart < index) {
+              buffer._contents += C.JSString_methods.substring$2(host, sectionStart, index);
+              sectionStart = index;
+            }
+            isNormalized = false;
+          }
+          ++index;
+        } else {
+          if ((char & 64512) === 55296 && index + 1 < end) {
+            tail = C.JSString_methods.codeUnitAt$1(host, index + 1);
+            if ((tail & 64512) === 56320) {
+              char = 65536 | (char & 1023) << 10 | tail & 1023;
+              sourceLength = 2;
+            } else
+              sourceLength = 1;
+          } else
+            sourceLength = 1;
+          slice = C.JSString_methods.substring$2(host, sectionStart, index);
+          if (buffer == null) {
+            buffer = new P.StringBuffer("");
+            t1 = buffer;
+          } else
+            t1 = buffer;
+          t1._contents += slice;
+          t1._contents += P._Uri__escapeChar(char);
+          index += sourceLength;
+          sectionStart = index;
+        }
+      }
+      if (buffer == null)
+        return C.JSString_methods.substring$2(host, start, end);
+      if (sectionStart < end)
+        buffer._contents += C.JSString_methods.substring$2(host, sectionStart, end);
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _Uri__normalizeRegName: function(host, start, end) {
+      var index, sectionStart, buffer, isNormalized, char, replacement, t1, slice, t2, sourceLength, tail;
+      for (index = start, sectionStart = index, buffer = null, isNormalized = true; index < end;) {
+        char = C.JSString_methods.codeUnitAt$1(host, index);
+        if (char === 37) {
+          replacement = P._Uri__normalizeEscape(host, index, true);
+          t1 = replacement == null;
+          if (t1 && isNormalized) {
+            index += 3;
+            continue;
+          }
+          if (buffer == null)
+            buffer = new P.StringBuffer("");
+          slice = C.JSString_methods.substring$2(host, sectionStart, index);
+          t2 = buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
+          if (t1) {
+            replacement = C.JSString_methods.substring$2(host, index, index + 3);
+            sourceLength = 3;
+          } else if (replacement === "%") {
+            replacement = "%25";
+            sourceLength = 1;
+          } else
+            sourceLength = 3;
+          buffer._contents = t2 + replacement;
+          index += sourceLength;
+          sectionStart = index;
+          isNormalized = true;
+        } else if (char < 127 && (C.List_qNA[char >>> 4] & 1 << (char & 15)) !== 0) {
+          if (isNormalized && 65 <= char && 90 >= char) {
+            if (buffer == null)
+              buffer = new P.StringBuffer("");
+            if (sectionStart < index) {
+              buffer._contents += C.JSString_methods.substring$2(host, sectionStart, index);
+              sectionStart = index;
+            }
+            isNormalized = false;
+          }
+          ++index;
+        } else if (char <= 93 && (C.List_2Vk[char >>> 4] & 1 << (char & 15)) !== 0)
+          P._Uri__fail(host, index, "Invalid character");
+        else {
+          if ((char & 64512) === 55296 && index + 1 < end) {
+            tail = C.JSString_methods.codeUnitAt$1(host, index + 1);
+            if ((tail & 64512) === 56320) {
+              char = 65536 | (char & 1023) << 10 | tail & 1023;
+              sourceLength = 2;
+            } else
+              sourceLength = 1;
+          } else
+            sourceLength = 1;
+          slice = C.JSString_methods.substring$2(host, sectionStart, index);
+          if (!isNormalized)
+            slice = slice.toLowerCase();
+          if (buffer == null) {
+            buffer = new P.StringBuffer("");
+            t1 = buffer;
+          } else
+            t1 = buffer;
+          t1._contents += slice;
+          t1._contents += P._Uri__escapeChar(char);
+          index += sourceLength;
+          sectionStart = index;
+        }
+      }
+      if (buffer == null)
+        return C.JSString_methods.substring$2(host, start, end);
+      if (sectionStart < end) {
+        slice = C.JSString_methods.substring$2(host, sectionStart, end);
+        buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
+      }
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _Uri__makeScheme: function(scheme, start, end) {
+      var i, containsUpperCase, codeUnit;
+      if (start === end)
+        return "";
+      if (!P._Uri__isAlphabeticCharacter(J.getInterceptor$s(scheme)._codeUnitAt$1(scheme, start)))
+        P._Uri__fail(scheme, start, "Scheme not starting with alphabetic character");
+      for (i = start, containsUpperCase = false; i < end; ++i) {
+        codeUnit = C.JSString_methods._codeUnitAt$1(scheme, i);
+        if (!(codeUnit < 128 && (C.List_JYB[codeUnit >>> 4] & 1 << (codeUnit & 15)) !== 0))
+          P._Uri__fail(scheme, i, "Illegal scheme character");
+        if (65 <= codeUnit && codeUnit <= 90)
+          containsUpperCase = true;
+      }
+      scheme = C.JSString_methods.substring$2(scheme, start, end);
+      return P._Uri__canonicalizeScheme(containsUpperCase ? scheme.toLowerCase() : scheme);
+    },
+    _Uri__canonicalizeScheme: function(scheme) {
+      if (scheme === "http")
+        return "http";
+      if (scheme === "file")
+        return "file";
+      if (scheme === "https")
+        return "https";
+      if (scheme === "package")
+        return "package";
+      return scheme;
+    },
+    _Uri__makeUserInfo: function(userInfo, start, end) {
+      if (userInfo == null)
+        return "";
+      return P._Uri__normalizeOrSubstring(userInfo, start, end, C.List_gRj, false);
+    },
+    _Uri__makePath: function(path, start, end, pathSegments, scheme, hasAuthority) {
+      var result,
+        isFile = scheme === "file",
+        ensureLeadingSlash = isFile || hasAuthority;
+      if (path == null) {
+        if (pathSegments == null)
+          return isFile ? "/" : "";
+        result = new H.MappedListIterable(pathSegments, new P._Uri__makePath_closure(), H._arrayInstanceType(pathSegments)._eval$1("MappedListIterable<1,String>")).join$1(0, "/");
+      } else if (pathSegments != null)
+        throw H.wrapException(P.ArgumentError$("Both path and pathSegments specified"));
+      else
+        result = P._Uri__normalizeOrSubstring(path, start, end, C.List_qg4, true);
+      if (result.length === 0) {
+        if (isFile)
+          return "/";
+      } else if (ensureLeadingSlash && !C.JSString_methods.startsWith$1(result, "/"))
+        result = "/" + result;
+      return P._Uri__normalizePath(result, scheme, hasAuthority);
+    },
+    _Uri__normalizePath: function(path, scheme, hasAuthority) {
+      var t1 = scheme.length === 0;
+      if (t1 && !hasAuthority && !C.JSString_methods.startsWith$1(path, "/"))
+        return P._Uri__normalizeRelativePath(path, !t1 || hasAuthority);
+      return P._Uri__removeDotSegments(path);
+    },
+    _Uri__makeQuery: function(query, start, end, queryParameters) {
+      if (query != null)
+        return P._Uri__normalizeOrSubstring(query, start, end, C.List_CVk, true);
+      return null;
+    },
+    _Uri__makeFragment: function(fragment, start, end) {
+      if (fragment == null)
+        return null;
+      return P._Uri__normalizeOrSubstring(fragment, start, end, C.List_CVk, true);
+    },
+    _Uri__normalizeEscape: function(source, index, lowerCase) {
+      var firstDigit, secondDigit, firstDigitValue, secondDigitValue, value,
+        t1 = index + 2;
+      if (t1 >= source.length)
+        return "%";
+      firstDigit = C.JSString_methods.codeUnitAt$1(source, index + 1);
+      secondDigit = C.JSString_methods.codeUnitAt$1(source, t1);
+      firstDigitValue = H.hexDigitValue(firstDigit);
+      secondDigitValue = H.hexDigitValue(secondDigit);
+      if (firstDigitValue < 0 || secondDigitValue < 0)
+        return "%";
+      value = firstDigitValue * 16 + secondDigitValue;
+      if (value < 127 && (C.List_nxB[C.JSInt_methods._shrOtherPositive$1(value, 4)] & 1 << (value & 15)) !== 0)
+        return H.Primitives_stringFromCharCode(lowerCase && 65 <= value && 90 >= value ? (value | 32) >>> 0 : value);
+      if (firstDigit >= 97 || secondDigit >= 97)
+        return C.JSString_methods.substring$2(source, index, index + 3).toUpperCase();
+      return null;
+    },
+    _Uri__escapeChar: function(char) {
+      var codeUnits, flag, encodedBytes, index, byte,
+        _s16_ = "0123456789ABCDEF";
+      if (char < 128) {
+        codeUnits = new Uint8Array(3);
+        codeUnits[0] = 37;
+        codeUnits[1] = C.JSString_methods._codeUnitAt$1(_s16_, char >>> 4);
+        codeUnits[2] = C.JSString_methods._codeUnitAt$1(_s16_, char & 15);
+      } else {
+        if (char > 2047)
+          if (char > 65535) {
+            flag = 240;
+            encodedBytes = 4;
+          } else {
+            flag = 224;
+            encodedBytes = 3;
+          }
+        else {
+          flag = 192;
+          encodedBytes = 2;
+        }
+        codeUnits = new Uint8Array(3 * encodedBytes);
+        for (index = 0; --encodedBytes, encodedBytes >= 0; flag = 128) {
+          byte = C.JSInt_methods._shrReceiverPositive$1(char, 6 * encodedBytes) & 63 | flag;
+          codeUnits[index] = 37;
+          codeUnits[index + 1] = C.JSString_methods._codeUnitAt$1(_s16_, byte >>> 4);
+          codeUnits[index + 2] = C.JSString_methods._codeUnitAt$1(_s16_, byte & 15);
+          index += 3;
+        }
+      }
+      return P.String_String$fromCharCodes(codeUnits, 0, null);
+    },
+    _Uri__normalizeOrSubstring: function(component, start, end, charTable, escapeDelimiters) {
+      var t1 = P._Uri__normalize(component, start, end, charTable, escapeDelimiters);
+      return t1 == null ? C.JSString_methods.substring$2(component, start, end) : t1;
+    },
+    _Uri__normalize: function(component, start, end, charTable, escapeDelimiters) {
+      var t1, index, sectionStart, buffer, char, replacement, sourceLength, t2, tail, _null = null;
+      for (t1 = !escapeDelimiters, index = start, sectionStart = index, buffer = _null; index < end;) {
+        char = C.JSString_methods.codeUnitAt$1(component, index);
+        if (char < 127 && (charTable[char >>> 4] & 1 << (char & 15)) !== 0)
+          ++index;
+        else {
+          if (char === 37) {
+            replacement = P._Uri__normalizeEscape(component, index, false);
+            if (replacement == null) {
+              index += 3;
+              continue;
+            }
+            if ("%" === replacement) {
+              replacement = "%25";
+              sourceLength = 1;
+            } else
+              sourceLength = 3;
+          } else if (t1 && char <= 93 && (C.List_2Vk[char >>> 4] & 1 << (char & 15)) !== 0) {
+            P._Uri__fail(component, index, "Invalid character");
+            sourceLength = _null;
+            replacement = sourceLength;
+          } else {
+            if ((char & 64512) === 55296) {
+              t2 = index + 1;
+              if (t2 < end) {
+                tail = C.JSString_methods.codeUnitAt$1(component, t2);
+                if ((tail & 64512) === 56320) {
+                  char = 65536 | (char & 1023) << 10 | tail & 1023;
+                  sourceLength = 2;
+                } else
+                  sourceLength = 1;
+              } else
+                sourceLength = 1;
+            } else
+              sourceLength = 1;
+            replacement = P._Uri__escapeChar(char);
+          }
+          if (buffer == null) {
+            buffer = new P.StringBuffer("");
+            t2 = buffer;
+          } else
+            t2 = buffer;
+          t2._contents += C.JSString_methods.substring$2(component, sectionStart, index);
+          t2._contents += H.S(replacement);
+          index += sourceLength;
+          sectionStart = index;
+        }
+      }
+      if (buffer == null)
+        return _null;
+      if (sectionStart < end)
+        buffer._contents += C.JSString_methods.substring$2(component, sectionStart, end);
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _Uri__mayContainDotSegments: function(path) {
+      if (C.JSString_methods.startsWith$1(path, "."))
+        return true;
+      return C.JSString_methods.indexOf$1(path, "/.") !== -1;
+    },
+    _Uri__removeDotSegments: function(path) {
+      var output, t1, t2, appendSlash, _i, segment;
+      if (!P._Uri__mayContainDotSegments(path))
+        return path;
+      output = H.setRuntimeTypeInfo([], type$.JSArray_String);
+      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
+        segment = t1[_i];
+        if (J.$eq$(segment, "..")) {
+          if (output.length !== 0) {
+            output.pop();
+            if (output.length === 0)
+              output.push("");
+          }
+          appendSlash = true;
+        } else if ("." === segment)
+          appendSlash = true;
+        else {
+          output.push(segment);
+          appendSlash = false;
+        }
+      }
+      if (appendSlash)
+        output.push("");
+      return C.JSArray_methods.join$1(output, "/");
+    },
+    _Uri__normalizeRelativePath: function(path, allowScheme) {
+      var output, t1, t2, appendSlash, _i, segment;
+      if (!P._Uri__mayContainDotSegments(path))
+        return !allowScheme ? P._Uri__escapeScheme(path) : path;
+      output = H.setRuntimeTypeInfo([], type$.JSArray_String);
+      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
+        segment = t1[_i];
+        if (".." === segment)
+          if (output.length !== 0 && C.JSArray_methods.get$last(output) !== "..") {
+            output.pop();
+            appendSlash = true;
+          } else {
+            output.push("..");
+            appendSlash = false;
+          }
+        else if ("." === segment)
+          appendSlash = true;
+        else {
+          output.push(segment);
+          appendSlash = false;
+        }
+      }
+      t1 = output.length;
+      if (t1 !== 0)
+        t1 = t1 === 1 && output[0].length === 0;
+      else
+        t1 = true;
+      if (t1)
+        return "./";
+      if (appendSlash || C.JSArray_methods.get$last(output) === "..")
+        output.push("");
+      if (!allowScheme)
+        output[0] = P._Uri__escapeScheme(output[0]);
+      return C.JSArray_methods.join$1(output, "/");
+    },
+    _Uri__escapeScheme: function(path) {
+      var i, char,
+        t1 = path.length;
+      if (t1 >= 2 && P._Uri__isAlphabeticCharacter(J._codeUnitAt$1$s(path, 0)))
+        for (i = 1; i < t1; ++i) {
+          char = C.JSString_methods._codeUnitAt$1(path, i);
+          if (char === 58)
+            return C.JSString_methods.substring$2(path, 0, i) + "%3A" + C.JSString_methods.substring$1(path, i + 1);
+          if (char > 127 || (C.List_JYB[char >>> 4] & 1 << (char & 15)) === 0)
+            break;
+        }
+      return path;
+    },
+    _Uri__toWindowsFilePath: function(uri) {
+      var hasDriveLetter, t2, host,
+        segments = uri.get$pathSegments(),
+        t1 = segments.length;
+      if (t1 > 0 && J.get$length$asx(segments[0]) === 2 && J.codeUnitAt$1$s(segments[0], 1) === 58) {
+        P._Uri__checkWindowsDriveLetter(J.codeUnitAt$1$s(segments[0], 0), false);
+        P._Uri__checkWindowsPathReservedCharacters(segments, false, 1);
+        hasDriveLetter = true;
+      } else {
+        P._Uri__checkWindowsPathReservedCharacters(segments, false, 0);
+        hasDriveLetter = false;
+      }
+      t2 = uri.get$hasAbsolutePath() && !hasDriveLetter ? "\\" : "";
+      if (uri.get$hasAuthority()) {
+        host = uri.get$host();
+        if (host.length !== 0)
+          t2 = t2 + "\\" + host + "\\";
+      }
+      t2 = P.StringBuffer__writeAll(t2, segments, "\\");
+      t1 = hasDriveLetter && t1 === 1 ? t2 + "\\" : t2;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _Uri__hexCharPairToByte: function(s, pos) {
+      var byte, i, charCode;
+      for (byte = 0, i = 0; i < 2; ++i) {
+        charCode = C.JSString_methods._codeUnitAt$1(s, pos + i);
+        if (48 <= charCode && charCode <= 57)
+          byte = byte * 16 + charCode - 48;
+        else {
+          charCode |= 32;
+          if (97 <= charCode && charCode <= 102)
+            byte = byte * 16 + charCode - 87;
+          else
+            throw H.wrapException(P.ArgumentError$("Invalid URL encoding"));
+        }
+      }
+      return byte;
+    },
+    _Uri__uriDecode: function(text, start, end, encoding, plusToSpace) {
+      var simple, codeUnit, t2, bytes,
+        t1 = J.getInterceptor$s(text),
+        i = start;
+      while (true) {
+        if (!(i < end)) {
+          simple = true;
+          break;
+        }
+        codeUnit = t1._codeUnitAt$1(text, i);
+        if (codeUnit <= 127)
+          if (codeUnit !== 37)
+            t2 = false;
+          else
+            t2 = true;
+        else
+          t2 = true;
+        if (t2) {
+          simple = false;
+          break;
+        }
+        ++i;
+      }
+      if (simple) {
+        if (C.C_Utf8Codec !== encoding)
+          t2 = false;
+        else
+          t2 = true;
+        if (t2)
+          return t1.substring$2(text, start, end);
+        else
+          bytes = new H.CodeUnits(t1.substring$2(text, start, end));
+      } else {
+        bytes = H.setRuntimeTypeInfo([], type$.JSArray_int);
+        for (i = start; i < end; ++i) {
+          codeUnit = t1._codeUnitAt$1(text, i);
+          if (codeUnit > 127)
+            throw H.wrapException(P.ArgumentError$("Illegal percent encoding in URI"));
+          if (codeUnit === 37) {
+            if (i + 3 > text.length)
+              throw H.wrapException(P.ArgumentError$("Truncated URI"));
+            bytes.push(P._Uri__hexCharPairToByte(text, i + 1));
+            i += 2;
+          } else
+            bytes.push(codeUnit);
+        }
+      }
+      return C.Utf8Decoder_false.convert$1(bytes);
+    },
+    _Uri__isAlphabeticCharacter: function(codeUnit) {
+      var lowerCase = codeUnit | 32;
+      return 97 <= lowerCase && lowerCase <= 122;
+    },
+    UriData__writeUri: function(mimeType, charsetName, parameters, buffer, indices) {
+      var t1, slashIndex;
+      if (mimeType == null || mimeType === "text/plain")
+        mimeType = "";
+      if (mimeType.length === 0 || mimeType === "application/octet-stream")
+        t1 = buffer._contents += mimeType;
+      else {
+        slashIndex = P.UriData__validateMimeType(mimeType);
+        if (slashIndex < 0)
+          throw H.wrapException(P.ArgumentError$value(mimeType, "mimeType", "Invalid MIME type"));
+        t1 = buffer._contents += H.S(P._Uri__uriEncode(C.List_qFt, C.JSString_methods.substring$2(mimeType, 0, slashIndex), C.C_Utf8Codec, false));
+        buffer._contents = t1 + "/";
+        t1 = buffer._contents += H.S(P._Uri__uriEncode(C.List_qFt, C.JSString_methods.substring$1(mimeType, slashIndex + 1), C.C_Utf8Codec, false));
+      }
+      if (charsetName != null) {
+        indices.push(t1.length);
+        indices.push(buffer._contents.length + 8);
+        buffer._contents += ";charset=";
+        buffer._contents += H.S(P._Uri__uriEncode(C.List_qFt, charsetName, C.C_Utf8Codec, false));
+      }
+    },
+    UriData__validateMimeType: function(mimeType) {
+      var t1, slashIndex, i;
+      for (t1 = mimeType.length, slashIndex = -1, i = 0; i < t1; ++i) {
+        if (C.JSString_methods._codeUnitAt$1(mimeType, i) !== 47)
+          continue;
+        if (slashIndex < 0) {
+          slashIndex = i;
+          continue;
+        }
+        return -1;
+      }
+      return slashIndex;
+    },
+    UriData__parse: function(text, start, sourceUri) {
+      var t1, i, slashIndex, char, equalsIndex, lastSeparator, t2, data,
+        _s17_ = "Invalid MIME type",
+        indices = H.setRuntimeTypeInfo([start - 1], type$.JSArray_int);
+      for (t1 = text.length, i = start, slashIndex = -1, char = null; i < t1; ++i) {
+        char = C.JSString_methods._codeUnitAt$1(text, i);
+        if (char === 44 || char === 59)
+          break;
+        if (char === 47) {
+          if (slashIndex < 0) {
+            slashIndex = i;
+            continue;
+          }
+          throw H.wrapException(P.FormatException$(_s17_, text, i));
+        }
+      }
+      if (slashIndex < 0 && i > start)
+        throw H.wrapException(P.FormatException$(_s17_, text, i));
+      for (; char !== 44;) {
+        indices.push(i);
+        ++i;
+        for (equalsIndex = -1; i < t1; ++i) {
+          char = C.JSString_methods._codeUnitAt$1(text, i);
+          if (char === 61) {
+            if (equalsIndex < 0)
+              equalsIndex = i;
+          } else if (char === 59 || char === 44)
+            break;
+        }
+        if (equalsIndex >= 0)
+          indices.push(equalsIndex);
+        else {
+          lastSeparator = C.JSArray_methods.get$last(indices);
+          if (char !== 44 || i !== lastSeparator + 7 || !C.JSString_methods.startsWith$2(text, "base64", lastSeparator + 1))
+            throw H.wrapException(P.FormatException$("Expecting '='", text, i));
+          break;
+        }
+      }
+      indices.push(i);
+      t2 = i + 1;
+      if ((indices.length & 1) === 1)
+        text = C.C_Base64Codec.normalize$3(text, t2, t1);
+      else {
+        data = P._Uri__normalize(text, t2, t1, C.List_CVk, true);
+        if (data != null)
+          text = C.JSString_methods.replaceRange$3(text, t2, t1, data);
+      }
+      return new P.UriData(text, indices, sourceUri);
+    },
+    UriData__uriEncodeBytes: function(canonicalTable, bytes, buffer) {
+      var t1, byteOr, i, byte,
+        _s16_ = "0123456789ABCDEF";
+      for (t1 = J.getInterceptor$asx(bytes), byteOr = 0, i = 0; i < t1.get$length(bytes); ++i) {
+        byte = t1.$index(bytes, i);
+        byteOr |= byte;
+        if (byte < 128 && (canonicalTable[C.JSInt_methods._shrOtherPositive$1(byte, 4)] & 1 << (byte & 15)) !== 0)
+          buffer._contents += H.Primitives_stringFromCharCode(byte);
+        else {
+          buffer._contents += H.Primitives_stringFromCharCode(37);
+          buffer._contents += H.Primitives_stringFromCharCode(C.JSString_methods._codeUnitAt$1(_s16_, C.JSInt_methods._shrOtherPositive$1(byte, 4)));
+          buffer._contents += H.Primitives_stringFromCharCode(C.JSString_methods._codeUnitAt$1(_s16_, byte & 15));
+        }
+      }
+      if ((byteOr & 4294967040) >>> 0 !== 0)
+        for (i = 0; i < t1.get$length(bytes); ++i) {
+          byte = t1.$index(bytes, i);
+          if (byte < 0 || byte > 255)
+            throw H.wrapException(P.ArgumentError$value(byte, "non-byte value", null));
+        }
+    },
+    _createTables: function() {
+      var _s77_ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~!$&'()*+,;=",
+        _s1_ = ".", _s1_0 = ":", _s1_1 = "/", _s1_2 = "?", _s1_3 = "#",
+        tables = P.List_List$generate(22, new P._createTables_closure(), true, type$.Uint8List),
+        t1 = new P._createTables_build(tables),
+        t2 = new P._createTables_setChars(),
+        t3 = new P._createTables_setRange(),
+        b = t1.call$2(0, 225);
+      t2.call$3(b, _s77_, 1);
+      t2.call$3(b, _s1_, 14);
+      t2.call$3(b, _s1_0, 34);
+      t2.call$3(b, _s1_1, 3);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(14, 225);
+      t2.call$3(b, _s77_, 1);
+      t2.call$3(b, _s1_, 15);
+      t2.call$3(b, _s1_0, 34);
+      t2.call$3(b, _s1_1, 234);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(15, 225);
+      t2.call$3(b, _s77_, 1);
+      t2.call$3(b, "%", 225);
+      t2.call$3(b, _s1_0, 34);
+      t2.call$3(b, _s1_1, 9);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(1, 225);
+      t2.call$3(b, _s77_, 1);
+      t2.call$3(b, _s1_0, 34);
+      t2.call$3(b, _s1_1, 10);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(2, 235);
+      t2.call$3(b, _s77_, 139);
+      t2.call$3(b, _s1_1, 131);
+      t2.call$3(b, _s1_, 146);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(3, 235);
+      t2.call$3(b, _s77_, 11);
+      t2.call$3(b, _s1_1, 68);
+      t2.call$3(b, _s1_, 18);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(4, 229);
+      t2.call$3(b, _s77_, 5);
+      t3.call$3(b, "AZ", 229);
+      t2.call$3(b, _s1_0, 102);
+      t2.call$3(b, "@", 68);
+      t2.call$3(b, "[", 232);
+      t2.call$3(b, _s1_1, 138);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(5, 229);
+      t2.call$3(b, _s77_, 5);
+      t3.call$3(b, "AZ", 229);
+      t2.call$3(b, _s1_0, 102);
+      t2.call$3(b, "@", 68);
+      t2.call$3(b, _s1_1, 138);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(6, 231);
+      t3.call$3(b, "19", 7);
+      t2.call$3(b, "@", 68);
+      t2.call$3(b, _s1_1, 138);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(7, 231);
+      t3.call$3(b, "09", 7);
+      t2.call$3(b, "@", 68);
+      t2.call$3(b, _s1_1, 138);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      t2.call$3(t1.call$2(8, 8), "]", 5);
+      b = t1.call$2(9, 235);
+      t2.call$3(b, _s77_, 11);
+      t2.call$3(b, _s1_, 16);
+      t2.call$3(b, _s1_1, 234);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(16, 235);
+      t2.call$3(b, _s77_, 11);
+      t2.call$3(b, _s1_, 17);
+      t2.call$3(b, _s1_1, 234);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(17, 235);
+      t2.call$3(b, _s77_, 11);
+      t2.call$3(b, _s1_1, 9);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(10, 235);
+      t2.call$3(b, _s77_, 11);
+      t2.call$3(b, _s1_, 18);
+      t2.call$3(b, _s1_1, 234);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(18, 235);
+      t2.call$3(b, _s77_, 11);
+      t2.call$3(b, _s1_, 19);
+      t2.call$3(b, _s1_1, 234);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(19, 235);
+      t2.call$3(b, _s77_, 11);
+      t2.call$3(b, _s1_1, 234);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(11, 235);
+      t2.call$3(b, _s77_, 11);
+      t2.call$3(b, _s1_1, 10);
+      t2.call$3(b, _s1_2, 172);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(12, 236);
+      t2.call$3(b, _s77_, 12);
+      t2.call$3(b, _s1_2, 12);
+      t2.call$3(b, _s1_3, 205);
+      b = t1.call$2(13, 237);
+      t2.call$3(b, _s77_, 13);
+      t2.call$3(b, _s1_2, 13);
+      t3.call$3(t1.call$2(20, 245), "az", 21);
+      b = t1.call$2(21, 245);
+      t3.call$3(b, "az", 21);
+      t3.call$3(b, "09", 21);
+      t2.call$3(b, "+-.", 21);
+      return tables;
+    },
+    _scan: function(uri, start, end, state, indices) {
+      var t1, i, table, char, transition,
+        tables = $.$get$_scannerTables();
+      for (t1 = J.getInterceptor$s(uri), i = start; i < end; ++i) {
+        table = tables[state];
+        char = t1._codeUnitAt$1(uri, i) ^ 96;
+        transition = table[char > 95 ? 31 : char];
+        state = transition & 31;
+        indices[transition >>> 5] = i;
+      }
+      return state;
+    },
+    NoSuchMethodError_toString_closure: function NoSuchMethodError_toString_closure(t0, t1) {
+      this._box_0 = t0;
+      this.sb = t1;
+    },
+    DateTime: function DateTime(t0, t1) {
+      this._value = t0;
+      this.isUtc = t1;
+    },
+    Duration: function Duration(t0) {
+      this._duration = t0;
+    },
+    Duration_toString_sixDigits: function Duration_toString_sixDigits() {
+    },
+    Duration_toString_twoDigits: function Duration_toString_twoDigits() {
+    },
+    Error: function Error() {
+    },
+    AssertionError: function AssertionError(t0) {
+      this.message = t0;
+    },
+    TypeError: function TypeError() {
+    },
+    NullThrownError: function NullThrownError() {
+    },
+    ArgumentError: function ArgumentError(t0, t1, t2, t3) {
+      var _ = this;
+      _._hasValue = t0;
+      _.invalidValue = t1;
+      _.name = t2;
+      _.message = t3;
+    },
+    RangeError: function RangeError(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.start = t0;
+      _.end = t1;
+      _._hasValue = t2;
+      _.invalidValue = t3;
+      _.name = t4;
+      _.message = t5;
+    },
+    IndexError: function IndexError(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.length = t0;
+      _._hasValue = t1;
+      _.invalidValue = t2;
+      _.name = t3;
+      _.message = t4;
+    },
+    NoSuchMethodError: function NoSuchMethodError(t0, t1, t2, t3) {
+      var _ = this;
+      _._core$_receiver = t0;
+      _._memberName = t1;
+      _._core$_arguments = t2;
+      _._namedArguments = t3;
+    },
+    UnsupportedError: function UnsupportedError(t0) {
+      this.message = t0;
+    },
+    UnimplementedError: function UnimplementedError(t0) {
+      this.message = t0;
+    },
+    StateError: function StateError(t0) {
+      this.message = t0;
+    },
+    ConcurrentModificationError: function ConcurrentModificationError(t0) {
+      this.modifiedObject = t0;
+    },
+    OutOfMemoryError: function OutOfMemoryError() {
+    },
+    StackOverflowError: function StackOverflowError() {
+    },
+    CyclicInitializationError: function CyclicInitializationError(t0) {
+      this.variableName = t0;
+    },
+    _Exception: function _Exception(t0) {
+      this.message = t0;
+    },
+    FormatException: function FormatException(t0, t1, t2) {
+      this.message = t0;
+      this.source = t1;
+      this.offset = t2;
+    },
+    Iterable: function Iterable() {
+    },
+    _GeneratorIterable: function _GeneratorIterable(t0, t1, t2) {
+      this.length = t0;
+      this._generator = t1;
+      this.$ti = t2;
+    },
+    Iterator: function Iterator() {
+    },
+    MapEntry: function MapEntry(t0, t1, t2) {
+      this.key = t0;
+      this.value = t1;
+      this.$ti = t2;
+    },
+    Null: function Null() {
+    },
+    Object: function Object() {
+    },
+    _StringStackTrace: function _StringStackTrace(t0) {
+      this._stackTrace = t0;
+    },
+    Runes: function Runes(t0) {
+      this.string = t0;
+    },
+    RuneIterator: function RuneIterator(t0) {
+      var _ = this;
+      _.string = t0;
+      _._nextPosition = _._position = 0;
+      _._currentCodePoint = -1;
+    },
+    StringBuffer: function StringBuffer(t0) {
+      this._contents = t0;
+    },
+    Uri__parseIPv4Address_error: function Uri__parseIPv4Address_error(t0) {
+      this.host = t0;
+    },
+    Uri_parseIPv6Address_error: function Uri_parseIPv6Address_error(t0) {
+      this.host = t0;
+    },
+    Uri_parseIPv6Address_parseHex: function Uri_parseIPv6Address_parseHex(t0, t1) {
+      this.error = t0;
+      this.host = t1;
+    },
+    _Uri: function _Uri(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.scheme = t0;
+      _._userInfo = t1;
+      _._host = t2;
+      _._port = t3;
+      _.path = t4;
+      _._query = t5;
+      _._fragment = t6;
+      _.___Uri_hashCode = _.___Uri_pathSegments = _.___Uri__text = null;
+    },
+    _Uri__makePath_closure: function _Uri__makePath_closure() {
+    },
+    UriData: function UriData(t0, t1, t2) {
+      this._text = t0;
+      this._separatorIndices = t1;
+      this._uriCache = t2;
+    },
+    _createTables_closure: function _createTables_closure() {
+    },
+    _createTables_build: function _createTables_build(t0) {
+      this.tables = t0;
+    },
+    _createTables_setChars: function _createTables_setChars() {
+    },
+    _createTables_setRange: function _createTables_setRange() {
+    },
+    _SimpleUri: function _SimpleUri(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _._uri = t0;
+      _._schemeEnd = t1;
+      _._hostStart = t2;
+      _._portStart = t3;
+      _._pathStart = t4;
+      _._queryStart = t5;
+      _._fragmentStart = t6;
+      _._schemeCache = t7;
+      _._hashCodeCache = null;
+    },
+    _DataUri: function _DataUri(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.scheme = t0;
+      _._userInfo = t1;
+      _._host = t2;
+      _._port = t3;
+      _.path = t4;
+      _._query = t5;
+      _._fragment = t6;
+      _.___Uri_hashCode = _.___Uri_pathSegments = _.___Uri__text = null;
+    },
+    max: function(a, b) {
+      return Math.max(H.checkNum(a), H.checkNum(b));
+    },
+    pow: function(x, exponent) {
+      H.checkNum(x);
+      H.checkNum(exponent);
+      return Math.pow(x, exponent);
+    },
+    Random_Random: function() {
+      return C.C__JSRandom;
+    },
+    _JSRandom: function _JSRandom() {
+    },
+    _convertDartFunctionFast: function(f) {
+      var ret,
+        existing = f.$dart_jsFunction;
+      if (existing != null)
+        return existing;
+      ret = function(_call, f) {
+        return function() {
+          return _call(f, Array.prototype.slice.apply(arguments));
+        };
+      }(P._callDartFunctionFast, f);
+      ret[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
+      f.$dart_jsFunction = ret;
+      return ret;
+    },
+    _convertDartFunctionFastCaptureThis: function(f) {
+      var ret,
+        existing = f._$dart_jsFunctionCaptureThis;
+      if (existing != null)
+        return existing;
+      ret = function(_call, f) {
+        return function() {
+          return _call(f, this, Array.prototype.slice.apply(arguments));
+        };
+      }(P._callDartFunctionFastCaptureThis, f);
+      ret[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
+      f._$dart_jsFunctionCaptureThis = ret;
+      return ret;
+    },
+    _callDartFunctionFast: function(callback, $arguments) {
+      return P.Function_apply(callback, $arguments);
+    },
+    _callDartFunctionFastCaptureThis: function(callback, $self, $arguments) {
+      var t1 = [$self];
+      C.JSArray_methods.addAll$1(t1, $arguments);
+      return P.Function_apply(callback, t1);
+    },
+    allowInterop: function(f) {
+      if (typeof f == "function")
+        return f;
+      else
+        return P._convertDartFunctionFast(f);
+    },
+    allowInteropCaptureThis: function(f) {
+      if (typeof f == "function")
+        throw H.wrapException(P.ArgumentError$("Function is already a JS function so cannot capture this."));
+      else
+        return P._convertDartFunctionFastCaptureThis(f);
+    },
+    callConstructor: function(constr, $arguments) {
+      var args, factoryFunction;
+      if ($arguments instanceof Array)
+        switch ($arguments.length) {
+          case 0:
+            return new constr();
+          case 1:
+            return new constr($arguments[0]);
+          case 2:
+            return new constr($arguments[0], $arguments[1]);
+          case 3:
+            return new constr($arguments[0], $arguments[1], $arguments[2]);
+          case 4:
+            return new constr($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
+        }
+      args = [null];
+      C.JSArray_methods.addAll$1(args, $arguments);
+      factoryFunction = constr.bind.apply(constr, args);
+      String(factoryFunction);
+      return new factoryFunction();
+    }
+  },
+  N = {ArgParser: function ArgParser(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._arg_parser$_options = t0;
+      _.options = t1;
+      _.commands = t2;
+      _._optionsAndSeparators = t3;
+      _.allowTrailingOptions = t4;
+      _.usageLineLength = t5;
+    }, ArgParser_findByAbbreviation_closure: function ArgParser_findByAbbreviation_closure(t0) {
+      this.abbr = t0;
+    }, ArgParser_findByAbbreviation_closure0: function ArgParser_findByAbbreviation_closure0() {
+    }, TTY: function TTY() {
+    }, TTYReadStream: function TTYReadStream() {
+    }, TTYWriteStream: function TTYWriteStream() {
+    }, AttributeSelector: function AttributeSelector(t0, t1, t2, t3) {
+      var _ = this;
+      _.name = t0;
+      _.op = t1;
+      _.value = t2;
+      _.modifier = t3;
+    }, AttributeOperator: function AttributeOperator(t0) {
+      this._attribute$_text = t0;
+    }, IDSelector: function IDSelector(t0) {
+      this.name = t0;
+    }, IDSelector_unify_closure: function IDSelector_unify_closure(t0) {
+      this.$this = t0;
+    }, PlaceholderSelector: function PlaceholderSelector(t0) {
+      this.name = t0;
+    }, UniversalSelector: function UniversalSelector(t0) {
+      this.namespace = t0;
+    }, NoSourceMapBuffer0: function NoSourceMapBuffer0(t0) {
+      this._no_source_map_buffer0$_buffer = t0;
+    }, UnitlessSassNumber: function UnitlessSassNumber(t0, t1) {
+      this.value = t0;
+      this.asSlash = t1;
+    },
+    serialize: function(node, charset, indentWidth, inspect, lineFeed, sourceMap, style, useSpaces) {
+      var t1, css, t2, prefix, t3,
+        visitor = N._SerializeVisitor$0(2, inspect, lineFeed, true, sourceMap, style, true);
+      node.accept$1(visitor);
+      t1 = visitor._serialize$_buffer;
+      css = t1.toString$0(0);
+      if (charset) {
+        t2 = new H.CodeUnits(css);
+        t2 = t2.any$1(t2, new N.serialize_closure());
+      } else
+        t2 = false;
+      if (t2)
+        prefix = style === C.OutputStyle_compressed ? "\ufeff" : '@charset "UTF-8";\n';
+      else
+        prefix = "";
+      t2 = prefix + css;
+      t3 = sourceMap ? t1.buildSourceMap$1$prefix(prefix) : null;
+      if (sourceMap)
+        t1.get$sourceFiles();
+      return new N.SerializeResult(t2, t3);
+    },
+    serializeValue0: function(value, inspect, quote) {
+      var visitor = N._SerializeVisitor$0(null, inspect, null, quote, false, null, true);
+      value.accept$1(visitor);
+      return visitor._serialize$_buffer.toString$0(0);
+    },
+    _SerializeVisitor$0: function(indentWidth, inspect, lineFeed, quote, sourceMap, style, useSpaces) {
+      var t1 = sourceMap ? new D.SourceMapBuffer0(new P.StringBuffer(""), H.setRuntimeTypeInfo([], type$.JSArray_legacy_Entry), P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Uri, type$.legacy_SourceFile)) : new N.NoSourceMapBuffer0(new P.StringBuffer("")),
+        t2 = style == null ? C.OutputStyle_expanded0 : style,
+        t3 = indentWidth == null ? 2 : indentWidth;
+      P.RangeError_checkValueInInterval(t3, 0, 10, "indentWidth");
+      return new N._SerializeVisitor0(t1, t2, inspect, quote, 32, t3, C.C_LineFeed);
+    },
+    serialize_closure: function serialize_closure() {
+    },
+    _SerializeVisitor0: function _SerializeVisitor0(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._serialize$_buffer = t0;
+      _._indentation = 0;
+      _._style = t1;
+      _._serialize$_inspect = t2;
+      _._quote = t3;
+      _._indentCharacter = t4;
+      _._indentWidth = t5;
+      _._serialize$_lineFeed = t6;
+    },
+    _SerializeVisitor_visitCssComment_closure: function _SerializeVisitor_visitCssComment_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssAtRule_closure: function _SerializeVisitor_visitCssAtRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssMediaRule_closure: function _SerializeVisitor_visitCssMediaRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssImport_closure: function _SerializeVisitor_visitCssImport_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssImport__closure: function _SerializeVisitor_visitCssImport__closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssKeyframeBlock_closure: function _SerializeVisitor_visitCssKeyframeBlock_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssStyleRule_closure: function _SerializeVisitor_visitCssStyleRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssSupportsRule_closure: function _SerializeVisitor_visitCssSupportsRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssDeclaration_closure: function _SerializeVisitor_visitCssDeclaration_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssDeclaration_closure0: function _SerializeVisitor_visitCssDeclaration_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitList_closure: function _SerializeVisitor_visitList_closure() {
+    },
+    _SerializeVisitor_visitList_closure0: function _SerializeVisitor_visitList_closure0(t0, t1) {
+      this.$this = t0;
+      this.value = t1;
+    },
+    _SerializeVisitor_visitList_closure1: function _SerializeVisitor_visitList_closure1(t0) {
+      this.$this = t0;
+    },
+    _SerializeVisitor_visitMap_closure: function _SerializeVisitor_visitMap_closure(t0, t1) {
+      this.$this = t0;
+      this.map = t1;
+    },
+    _SerializeVisitor_visitSelectorList_closure: function _SerializeVisitor_visitSelectorList_closure() {
+    },
+    _SerializeVisitor__write_closure: function _SerializeVisitor__write_closure(t0, t1) {
+      this.$this = t0;
+      this.value = t1;
+    },
+    _SerializeVisitor__visitChildren_closure: function _SerializeVisitor__visitChildren_closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.children = t2;
+    },
+    OutputStyle: function OutputStyle(t0) {
+      this._serialize$_name = t0;
+    },
+    LineFeed: function LineFeed() {
+    },
+    SerializeResult: function SerializeResult(t0, t1) {
+      this.css = t0;
+      this.sourceMap = t1;
+    },
+    warn: function(message, deprecation) {
+      var warnDefinition = $.Zone__current.$index(0, C.Symbol__warn);
+      if (warnDefinition == null)
+        throw H.wrapException(P.ArgumentError$(string$.warn__));
+      warnDefinition.call$2(message, true);
+    },
+    withWarnCallback: function(warn, callback, $T) {
+      var t1 = type$.legacy_Object;
+      return P.runZoned(new N.withWarnCallback_closure(callback, $T), P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol__warn, warn], t1, t1), $T._eval$1("0*"));
+    },
+    withWarnCallback_closure: function withWarnCallback_closure(t0, t1) {
+      this.callback = t0;
+      this.T = t1;
+    },
+    UnparsedFrame: function UnparsedFrame(t0, t1) {
+      this.uri = t0;
+      this.member = t1;
+    },
+    AttributeSelector0: function AttributeSelector0(t0, t1, t2, t3) {
+      var _ = this;
+      _.name = t0;
+      _.op = t1;
+      _.value = t2;
+      _.modifier = t3;
+    },
+    AttributeOperator0: function AttributeOperator0(t0) {
+      this._attribute0$_text = t0;
+    },
+    IDSelector0: function IDSelector0(t0) {
+      this.name = t0;
+    },
+    IDSelector_unify_closure0: function IDSelector_unify_closure0(t0) {
+      this.$this = t0;
+    },
+    NoSourceMapBuffer: function NoSourceMapBuffer(t0) {
+      this._no_source_map_buffer$_buffer = t0;
+    },
+    PlaceholderSelector0: function PlaceholderSelector0(t0) {
+      this.name = t0;
+    },
+    serialize0: function(node, charset, indentWidth, inspect, lineFeed, sourceMap, style, useSpaces) {
+      var t1, css, t2, prefix, t3,
+        visitor = N._SerializeVisitor$(indentWidth == null ? 2 : indentWidth, inspect, lineFeed, true, sourceMap, style, useSpaces);
+      node.accept$1(visitor);
+      t1 = visitor._buffer;
+      css = t1.toString$0(0);
+      t2 = new H.CodeUnits(css);
+      t2 = t2.any$1(t2, new N.serialize_closure0());
+      if (t2)
+        prefix = style === C.OutputStyle_compressed0 ? "\ufeff" : '@charset "UTF-8";\n';
+      else
+        prefix = "";
+      t2 = prefix + css;
+      t3 = sourceMap ? t1.buildSourceMap$1$prefix(prefix) : null;
+      if (sourceMap)
+        t1.get$sourceFiles();
+      return new N.SerializeResult0(t2, t3);
+    },
+    serializeValue: function(value, inspect, quote) {
+      var visitor = N._SerializeVisitor$(null, inspect, null, quote, false, null, true);
+      value.accept$1(visitor);
+      return visitor._buffer.toString$0(0);
+    },
+    _SerializeVisitor$: function(indentWidth, inspect, lineFeed, quote, sourceMap, style, useSpaces) {
+      var t1 = sourceMap ? new D.SourceMapBuffer(new P.StringBuffer(""), H.setRuntimeTypeInfo([], type$.JSArray_legacy_Entry), P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Uri, type$.legacy_SourceFile)) : new N.NoSourceMapBuffer(new P.StringBuffer("")),
+        t2 = style == null ? C.OutputStyle_expanded : style,
+        t3 = useSpaces ? 32 : 9,
+        t4 = indentWidth == null ? 2 : indentWidth,
+        t5 = lineFeed == null ? C.LineFeed_D6m : lineFeed;
+      P.RangeError_checkValueInInterval(t4, 0, 10, "indentWidth");
+      return new N._SerializeVisitor(t1, t2, inspect, quote, t3, t4, t5);
+    },
+    serialize_closure0: function serialize_closure0() {
+    },
+    _SerializeVisitor: function _SerializeVisitor(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._buffer = t0;
+      _._serialize0$_indentation = 0;
+      _._serialize0$_style = t1;
+      _._inspect = t2;
+      _._serialize0$_quote = t3;
+      _._serialize0$_indentCharacter = t4;
+      _._serialize0$_indentWidth = t5;
+      _._lineFeed = t6;
+    },
+    _SerializeVisitor_visitCssComment_closure0: function _SerializeVisitor_visitCssComment_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssAtRule_closure0: function _SerializeVisitor_visitCssAtRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssMediaRule_closure0: function _SerializeVisitor_visitCssMediaRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssImport_closure0: function _SerializeVisitor_visitCssImport_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssImport__closure0: function _SerializeVisitor_visitCssImport__closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssKeyframeBlock_closure0: function _SerializeVisitor_visitCssKeyframeBlock_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssStyleRule_closure0: function _SerializeVisitor_visitCssStyleRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssSupportsRule_closure0: function _SerializeVisitor_visitCssSupportsRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssDeclaration_closure1: function _SerializeVisitor_visitCssDeclaration_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitCssDeclaration_closure2: function _SerializeVisitor_visitCssDeclaration_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _SerializeVisitor_visitList_closure2: function _SerializeVisitor_visitList_closure2() {
+    },
+    _SerializeVisitor_visitList_closure3: function _SerializeVisitor_visitList_closure3(t0, t1) {
+      this.$this = t0;
+      this.value = t1;
+    },
+    _SerializeVisitor_visitList_closure4: function _SerializeVisitor_visitList_closure4(t0) {
+      this.$this = t0;
+    },
+    _SerializeVisitor_visitMap_closure0: function _SerializeVisitor_visitMap_closure0(t0, t1) {
+      this.$this = t0;
+      this.map = t1;
+    },
+    _SerializeVisitor_visitSelectorList_closure0: function _SerializeVisitor_visitSelectorList_closure0() {
+    },
+    _SerializeVisitor__write_closure0: function _SerializeVisitor__write_closure0(t0, t1) {
+      this.$this = t0;
+      this.value = t1;
+    },
+    _SerializeVisitor__visitChildren_closure0: function _SerializeVisitor__visitChildren_closure0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.children = t2;
+    },
+    OutputStyle0: function OutputStyle0(t0) {
+      this._name = t0;
+    },
+    LineFeed0: function LineFeed0(t0, t1) {
+      this.name = t0;
+      this.text = t1;
+    },
+    SerializeResult0: function SerializeResult0(t0, t1) {
+      this.css = t0;
+      this.sourceMap = t1;
+    },
+    UnitlessSassNumber0: function UnitlessSassNumber0(t0, t1) {
+      this.value = t0;
+      this.asSlash = t1;
+    },
+    UniversalSelector0: function UniversalSelector0(t0) {
+      this.namespace = t0;
+    },
+    warn0: function(message, deprecation) {
+      var warnDefinition = $.Zone__current.$index(0, C.Symbol__warn);
+      if (warnDefinition == null)
+        throw H.wrapException(P.ArgumentError$(string$.warn__));
+      warnDefinition.call$2(message, true);
+    },
+    withWarnCallback0: function(warn, callback, $T) {
+      var t1 = type$.legacy_Object;
+      return P.runZoned(new N.withWarnCallback_closure0(callback, $T), P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol__warn, warn], t1, t1), $T._eval$1("0*"));
+    },
+    withWarnCallback_closure0: function withWarnCallback_closure0(t0, t1) {
+      this.callback = t0;
+      this.T = t1;
+    }
+  },
+  Z = {
+    ArgParserException$: function(message, commands) {
+      return new Z.ArgParserException(commands == null ? C.List_empty : P.List_List$unmodifiable(commands, type$.legacy_String), message, null, null);
+    },
+    ArgParserException: function ArgParserException(t0, t1, t2, t3) {
+      var _ = this;
+      _.commands = t0;
+      _.message = t1;
+      _.source = t2;
+      _.offset = t3;
+    },
+    Argument: function Argument(t0, t1, t2) {
+      this.name = t0;
+      this.defaultValue = t1;
+      this.span = t2;
+    },
+    ConfiguredVariable: function ConfiguredVariable(t0, t1, t2, t3) {
+      var _ = this;
+      _.name = t0;
+      _.expression = t1;
+      _.isGuarded = t2;
+      _.span = t3;
+    },
+    BooleanExpression: function BooleanExpression(t0, t1) {
+      this.value = t0;
+      this.span = t1;
+    },
+    VariableDeclaration$: function($name, expression, span, comment, global, guarded, namespace) {
+      if (namespace != null && global)
+        H.throwExpression(P.ArgumentError$(string$.Other_));
+      return new Z.VariableDeclaration(namespace, $name, expression, guarded, global, span);
+    },
+    VariableDeclaration: function VariableDeclaration(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.namespace = t0;
+      _.name = t1;
+      _.expression = t2;
+      _.isGuarded = t3;
+      _.isGlobal = t4;
+      _.span = t5;
+    },
+    ConfiguredValue: function ConfiguredValue(t0, t1, t2) {
+      this.value = t0;
+      this.configurationSpan = t1;
+      this.assignmentNode = t2;
+    },
+    InterpolationBuffer: function InterpolationBuffer(t0, t1) {
+      this._interpolation_buffer$_text = t0;
+      this._interpolation_buffer$_contents = t1;
+    },
+    MergedMapView$: function(maps, $K, $V) {
+      var t1 = $K._eval$1("@<0>")._bind$1($V);
+      t1 = new Z.MergedMapView(P.LinkedHashMap_LinkedHashMap$_empty($K._eval$1("0*"), t1._eval$1("Map<1*,2*>*")), t1._eval$1("MergedMapView<1,2>"));
+      t1.MergedMapView$1(maps, $K, $V);
+      return t1;
+    },
+    MergedMapView: function MergedMapView(t0, t1) {
+      this._mapsByKey = t0;
+      this.$ti = t1;
+    },
+    SassBoolean: function SassBoolean(t0) {
+      this.value = t0;
+    },
+    LineScanner$: function(string) {
+      return new Z.LineScanner(null, string);
+    },
+    LineScanner: function LineScanner(t0, t1) {
+      var _ = this;
+      _._line_scanner$_column = _._line_scanner$_line = 0;
+      _.sourceUrl = t0;
+      _.string = t1;
+      _._string_scanner$_position = 0;
+      _._lastMatchPosition = _._lastMatch = null;
+    },
+    Argument0: function Argument0(t0, t1, t2) {
+      this.name = t0;
+      this.defaultValue = t1;
+      this.span = t2;
+    },
+    BooleanExpression0: function BooleanExpression0(t0, t1) {
+      this.value = t0;
+      this.span = t1;
+    },
+    closure263: function closure263() {
+    },
+    _closure34: function _closure34() {
+    },
+    _closure35: function _closure35() {
+    },
+    SassBoolean0: function SassBoolean0(t0) {
+      this.value = t0;
+    },
+    ConfiguredValue0: function ConfiguredValue0(t0, t1, t2) {
+      this.value = t0;
+      this.configurationSpan = t1;
+      this.assignmentNode = t2;
+    },
+    ConfiguredVariable0: function ConfiguredVariable0(t0, t1, t2, t3) {
+      var _ = this;
+      _.name = t0;
+      _.expression = t1;
+      _.isGuarded = t2;
+      _.span = t3;
+    },
+    InterpolationBuffer0: function InterpolationBuffer0(t0, t1) {
+      this._interpolation_buffer0$_text = t0;
+      this._interpolation_buffer0$_contents = t1;
+    },
+    MergedMapView$0: function(maps, $K, $V) {
+      var t1 = $K._eval$1("@<0>")._bind$1($V);
+      t1 = new Z.MergedMapView0(P.LinkedHashMap_LinkedHashMap$_empty($K._eval$1("0*"), t1._eval$1("Map<1*,2*>*")), t1._eval$1("MergedMapView0<1,2>"));
+      t1.MergedMapView$10(maps, $K, $V);
+      return t1;
+    },
+    MergedMapView0: function MergedMapView0(t0, t1) {
+      this._merged_map_view$_mapsByKey = t0;
+      this.$ti = t1;
+    },
+    RenderContext: function RenderContext() {
+    },
+    VariableDeclaration$0: function($name, expression, span, comment, global, guarded, namespace) {
+      if (namespace != null && global)
+        H.throwExpression(P.ArgumentError$(string$.Other_));
+      return new Z.VariableDeclaration0(namespace, $name, expression, guarded, global, span);
+    },
+    VariableDeclaration0: function VariableDeclaration0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.namespace = t0;
+      _.name = t1;
+      _.expression = t2;
+      _.isGuarded = t3;
+      _.isGlobal = t4;
+      _.span = t5;
+    }
+  },
+  V = {ArgResults: function ArgResults(t0, t1, t2, t3) {
+      var _ = this;
+      _._parser = t0;
+      _._parsed = t1;
+      _.name = t2;
+      _.rest = t3;
+    }, ErrorResult: function ErrorResult(t0, t1) {
+      this.error = t0;
+      this.stackTrace = t1;
+    }, BufferModule: function BufferModule() {
+    }, BufferConstants: function BufferConstants() {
+    }, Buffer: function Buffer() {
+    },
+    ModifiableCssStylesheet$: function(span) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode);
+      return new V.ModifiableCssStylesheet(span, new P.UnmodifiableListView(t1, type$.UnmodifiableListView_legacy_ModifiableCssNode), t1);
+    },
+    ModifiableCssStylesheet: function ModifiableCssStylesheet(t0, t1, t2) {
+      var _ = this;
+      _.span = t0;
+      _.children = t1;
+      _._children = t2;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    CssStylesheet: function CssStylesheet(t0, t1) {
+      this.children = t0;
+      this.span = t1;
+    },
+    AtRootQuery: function AtRootQuery(t0, t1, t2, t3) {
+      var _ = this;
+      _.include = t0;
+      _.names = t1;
+      _._all = t2;
+      _._at_root_query$_rule = t3;
+    },
+    BinaryOperationExpression: function BinaryOperationExpression(t0, t1, t2, t3) {
+      var _ = this;
+      _.operator = t0;
+      _.left = t1;
+      _.right = t2;
+      _.allowsSlash = t3;
+    },
+    BinaryOperator: function BinaryOperator(t0, t1, t2) {
+      this.name = t0;
+      this.operator = t1;
+      this.precedence = t2;
+    },
+    AtRootRule$: function(children, span, query) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new V.AtRootRule(query, span, t1, t2);
+    },
+    AtRootRule: function AtRootRule(t0, t1, t2, t3) {
+      var _ = this;
+      _.query = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    EachRule$: function(variables, list, children, span) {
+      var t1 = P.List_List$unmodifiable(variables, type$.legacy_String),
+        t2 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t3 = C.JSArray_methods.any$1(t2, new M.ParentStatement_closure());
+      return new V.EachRule(t1, list, span, t2, t3);
+    },
+    EachRule: function EachRule(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.variables = t0;
+      _.list = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    EachRule_toString_closure: function EachRule_toString_closure() {
+    },
+    IfClause$: function(expression, children) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement);
+      return new V.IfClause(expression, t1, C.JSArray_methods.any$1(t1, new V.IfClause$__closure()));
+    },
+    IfClause$last: function(children) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement);
+      return new V.IfClause(null, t1, C.JSArray_methods.any$1(t1, new V.IfClause$__closure()));
+    },
+    IfRule: function IfRule(t0, t1, t2) {
+      this.clauses = t0;
+      this.lastClause = t1;
+      this.span = t2;
+    },
+    IfRule_toString_closure: function IfRule_toString_closure(t0) {
+      this._box_0 = t0;
+    },
+    IfClause: function IfClause(t0, t1, t2) {
+      this.expression = t0;
+      this.children = t1;
+      this.hasDeclarations = t2;
+    },
+    IfClause$__closure: function IfClause$__closure() {
+    },
+    IfClause$___closure: function IfClause$___closure() {
+    },
+    Stylesheet$: function(children, span, plainCss) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_UseRule),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ForwardRule),
+        t3 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t4 = C.JSArray_methods.any$1(t3, new M.ParentStatement_closure());
+      t1 = new V.Stylesheet(span, plainCss, t1, t2, t3, t4);
+      t1.Stylesheet$3$plainCss(children, span, plainCss);
+      return t1;
+    },
+    Stylesheet_Stylesheet$parse: function(contents, syntax, logger, url) {
+      var t1, t2;
+      switch (syntax) {
+        case C.Syntax_Sass:
+          t1 = S.SpanScanner$(contents, url);
+          t2 = logger == null ? C.StderrLogger_false : logger;
+          return new U.SassParser(P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_VariableDeclaration), t1, t2).parse$0();
+        case C.Syntax_SCSS:
+          return L.ScssParser$(contents, logger, url).parse$0();
+        case C.Syntax_CSS:
+          t1 = S.SpanScanner$(contents, url);
+          t2 = logger == null ? C.StderrLogger_false : logger;
+          return new Q.CssParser(P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_VariableDeclaration), t1, t2).parse$0();
+        default:
+          throw H.wrapException(P.ArgumentError$("Unknown syntax " + syntax.toString$0(0) + "."));
+      }
+    },
+    Stylesheet: function Stylesheet(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.span = t0;
+      _.plainCss = t1;
+      _._uses = t2;
+      _._forwards = t3;
+      _.children = t4;
+      _.hasDeclarations = t5;
+    },
+    AtRootQueryParser$: function(contents, logger, url) {
+      var t1 = S.SpanScanner$(contents, url);
+      return new V.AtRootQueryParser(t1, logger);
+    },
+    AtRootQueryParser: function AtRootQueryParser(t0, t1) {
+      this.scanner = t0;
+      this.logger = t1;
+    },
+    AtRootQueryParser_parse_closure: function AtRootQueryParser_parse_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser: function StylesheetParser() {
+    },
+    StylesheetParser_parse_closure: function StylesheetParser_parse_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser_parse__closure: function StylesheetParser_parse__closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser_parse__closure0: function StylesheetParser_parse__closure0() {
+    },
+    StylesheetParser_parseArgumentDeclaration_closure: function StylesheetParser_parseArgumentDeclaration_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser_parseVariableDeclaration_closure: function StylesheetParser_parseVariableDeclaration_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser_parseUseRule_closure: function StylesheetParser_parseUseRule_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser__parseSingleProduction_closure: function StylesheetParser__parseSingleProduction_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.production = t1;
+      this.T = t2;
+    },
+    StylesheetParser__statement_closure: function StylesheetParser__statement_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser_variableDeclarationWithoutNamespace_closure: function StylesheetParser_variableDeclarationWithoutNamespace_closure(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    StylesheetParser_variableDeclarationWithoutNamespace_closure0: function StylesheetParser_variableDeclarationWithoutNamespace_closure0(t0) {
+      this.declaration = t0;
+    },
+    StylesheetParser__declarationOrBuffer_closure: function StylesheetParser__declarationOrBuffer_closure(t0) {
+      this.name = t0;
+    },
+    StylesheetParser__declarationOrBuffer_closure0: function StylesheetParser__declarationOrBuffer_closure0(t0, t1) {
+      this._box_0 = t0;
+      this.name = t1;
+    },
+    StylesheetParser__styleRule_closure: function StylesheetParser__styleRule_closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.wasInStyleRule = t2;
+    },
+    StylesheetParser__propertyOrVariableDeclaration_closure: function StylesheetParser__propertyOrVariableDeclaration_closure(t0) {
+      this._box_0 = t0;
+    },
+    StylesheetParser__propertyOrVariableDeclaration_closure0: function StylesheetParser__propertyOrVariableDeclaration_closure0(t0, t1) {
+      this._box_0 = t0;
+      this.value = t1;
+    },
+    StylesheetParser__atRootRule_closure: function StylesheetParser__atRootRule_closure(t0) {
+      this.query = t0;
+    },
+    StylesheetParser__atRootRule_closure0: function StylesheetParser__atRootRule_closure0() {
+    },
+    StylesheetParser__eachRule_closure: function StylesheetParser__eachRule_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.wasInControlDirective = t1;
+      _.variables = t2;
+      _.list = t3;
+    },
+    StylesheetParser__functionRule_closure: function StylesheetParser__functionRule_closure(t0, t1, t2) {
+      this.name = t0;
+      this.$arguments = t1;
+      this.precedingComment = t2;
+    },
+    StylesheetParser__forRule_closure: function StylesheetParser__forRule_closure(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    StylesheetParser__forRule_closure0: function StylesheetParser__forRule_closure0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.wasInControlDirective = t2;
+      _.variable = t3;
+      _.from = t4;
+      _.to = t5;
+    },
+    StylesheetParser__memberList_closure: function StylesheetParser__memberList_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.variables = t1;
+      this.identifiers = t2;
+    },
+    StylesheetParser__includeRule_closure: function StylesheetParser__includeRule_closure(t0) {
+      this._box_0 = t0;
+    },
+    StylesheetParser_mediaRule_closure: function StylesheetParser_mediaRule_closure(t0) {
+      this.query = t0;
+    },
+    StylesheetParser__mixinRule_closure: function StylesheetParser__mixinRule_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.name = t1;
+      _.$arguments = t2;
+      _.precedingComment = t3;
+    },
+    StylesheetParser_mozDocumentRule_closure: function StylesheetParser_mozDocumentRule_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.name = t2;
+      _.value = t3;
+    },
+    StylesheetParser_supportsRule_closure: function StylesheetParser_supportsRule_closure(t0) {
+      this.condition = t0;
+    },
+    StylesheetParser__whileRule_closure: function StylesheetParser__whileRule_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.wasInControlDirective = t1;
+      this.condition = t2;
+    },
+    StylesheetParser_unknownAtRule_closure: function StylesheetParser_unknownAtRule_closure(t0, t1) {
+      this._box_0 = t0;
+      this.name = t1;
+    },
+    StylesheetParser_expression_resetState: function StylesheetParser_expression_resetState(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.start = t2;
+    },
+    StylesheetParser_expression_resolveOneOperation: function StylesheetParser_expression_resolveOneOperation(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    StylesheetParser_expression_resolveOperations: function StylesheetParser_expression_resolveOperations(t0, t1) {
+      this._box_0 = t0;
+      this.resolveOneOperation = t1;
+    },
+    StylesheetParser_expression_addSingleExpression: function StylesheetParser_expression_addSingleExpression(t0, t1, t2, t3) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.resetState = t2;
+      _.resolveOperations = t3;
+    },
+    StylesheetParser_expression_addOperator: function StylesheetParser_expression_addOperator(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.resolveOneOperation = t2;
+    },
+    StylesheetParser_expression_resolveSpaceExpressions: function StylesheetParser_expression_resolveSpaceExpressions(t0, t1) {
+      this._box_0 = t0;
+      this.resolveOperations = t1;
+    },
+    StylesheetParser__expressionUntilComma_closure: function StylesheetParser__expressionUntilComma_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser__unicodeRange_closure: function StylesheetParser__unicodeRange_closure() {
+    },
+    StylesheetParser__unicodeRange_closure0: function StylesheetParser__unicodeRange_closure0() {
+    },
+    StylesheetParser_identifierLike_closure: function StylesheetParser_identifierLike_closure(t0, t1) {
+      this.$this = t0;
+      this.start = t1;
+    },
+    StylesheetParser__expressionUntilComparison_closure: function StylesheetParser__expressionUntilComparison_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser__publicIdentifier_closure: function StylesheetParser__publicIdentifier_closure(t0, t1) {
+      this.$this = t0;
+      this.start = t1;
+    },
+    cloneCssStylesheet: function(stylesheet, extender) {
+      var result = extender.clone$0();
+      return new S.Tuple2(new V._CloneCssVisitor(result.item2)._visitChildren$2(V.ModifiableCssStylesheet$(stylesheet.get$span()), stylesheet), result.item1, type$.Tuple2_of_legacy_ModifiableCssStylesheet_and_legacy_Extender);
+    },
+    _CloneCssVisitor: function _CloneCssVisitor(t0) {
+      this._oldToNewSelectors = t0;
+    },
+    SourceLocation$: function(offset, column, line, sourceUrl) {
+      var t1 = line == null,
+        t2 = t1 ? 0 : line;
+      if (offset < 0)
+        H.throwExpression(P.RangeError$("Offset may not be negative, was " + offset + "."));
+      else if (!t1 && line < 0)
+        H.throwExpression(P.RangeError$("Line may not be negative, was " + H.S(line) + "."));
+      else if (column < 0)
+        H.throwExpression(P.RangeError$("Column may not be negative, was " + column + "."));
+      return new V.SourceLocation(sourceUrl, offset, t2, column);
+    },
+    SourceLocation: function SourceLocation(t0, t1, t2, t3) {
+      var _ = this;
+      _.sourceUrl = t0;
+      _.offset = t1;
+      _.line = t2;
+      _.column = t3;
+    },
+    SourceSpanBase: function SourceSpanBase() {
+    },
+    AtRootQueryParser$0: function(contents, logger, url) {
+      var t1 = S.SpanScanner$(contents, url);
+      return new V.AtRootQueryParser0(t1, logger);
+    },
+    AtRootQueryParser0: function AtRootQueryParser0(t0, t1) {
+      this.scanner = t0;
+      this.logger = t1;
+    },
+    AtRootQueryParser_parse_closure0: function AtRootQueryParser_parse_closure0(t0) {
+      this.$this = t0;
+    },
+    AtRootQuery0: function AtRootQuery0(t0, t1, t2, t3) {
+      var _ = this;
+      _.include = t0;
+      _.names = t1;
+      _._at_root_query0$_all = t2;
+      _._at_root_query0$_rule = t3;
+    },
+    AtRootRule$0: function(children, span, query) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new V.AtRootRule0(query, span, t1, t2);
+    },
+    AtRootRule0: function AtRootRule0(t0, t1, t2, t3) {
+      var _ = this;
+      _.query = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    BinaryOperationExpression0: function BinaryOperationExpression0(t0, t1, t2, t3) {
+      var _ = this;
+      _.operator = t0;
+      _.left = t1;
+      _.right = t2;
+      _.allowsSlash = t3;
+    },
+    BinaryOperator0: function BinaryOperator0(t0, t1, t2) {
+      this.name = t0;
+      this.operator = t1;
+      this.precedence = t2;
+    },
+    cloneCssStylesheet0: function(stylesheet, extender) {
+      var result = extender.clone$0();
+      return new S.Tuple2(new V._CloneCssVisitor0(result.item2)._clone_css$_visitChildren$2(V.ModifiableCssStylesheet$0(stylesheet.get$span()), stylesheet), result.item1, type$.Tuple2_of_legacy_ModifiableCssStylesheet_and_legacy_Extender_2);
+    },
+    _CloneCssVisitor0: function _CloneCssVisitor0(t0) {
+      this._clone_css$_oldToNewSelectors = t0;
+    },
+    EachRule$0: function(variables, list, children, span) {
+      var t1 = P.List_List$unmodifiable(variables, type$.legacy_String),
+        t2 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t3 = C.JSArray_methods.any$1(t2, new M.ParentStatement_closure0());
+      return new V.EachRule0(t1, list, span, t2, t3);
+    },
+    EachRule0: function EachRule0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.variables = t0;
+      _.list = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    EachRule_toString_closure0: function EachRule_toString_closure0() {
+    },
+    IfClause$0: function(expression, children) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2);
+      return new V.IfClause0(expression, t1, C.JSArray_methods.any$1(t1, new V.IfClause$__closure0()));
+    },
+    IfClause$last0: function(children) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2);
+      return new V.IfClause0(null, t1, C.JSArray_methods.any$1(t1, new V.IfClause$__closure0()));
+    },
+    IfRule0: function IfRule0(t0, t1, t2) {
+      this.clauses = t0;
+      this.lastClause = t1;
+      this.span = t2;
+    },
+    IfRule_toString_closure0: function IfRule_toString_closure0(t0) {
+      this._box_0 = t0;
+    },
+    IfClause0: function IfClause0(t0, t1, t2) {
+      this.expression = t0;
+      this.children = t1;
+      this.hasDeclarations = t2;
+    },
+    IfClause$__closure0: function IfClause$__closure0() {
+    },
+    IfClause$___closure0: function IfClause$___closure0() {
+    },
+    CssStylesheet0: function CssStylesheet0(t0, t1) {
+      this.children = t0;
+      this.span = t1;
+    },
+    ModifiableCssStylesheet$0: function(span) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode_2);
+      return new V.ModifiableCssStylesheet0(span, new P.UnmodifiableListView(t1, type$.UnmodifiableListView_legacy_ModifiableCssNode_2), t1);
+    },
+    ModifiableCssStylesheet0: function ModifiableCssStylesheet0(t0, t1, t2) {
+      var _ = this;
+      _.span = t0;
+      _.children = t1;
+      _._node2$_children = t2;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    StylesheetParser0: function StylesheetParser0() {
+    },
+    StylesheetParser_parse_closure0: function StylesheetParser_parse_closure0(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser_parse__closure1: function StylesheetParser_parse__closure1(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser_parse__closure2: function StylesheetParser_parse__closure2() {
+    },
+    StylesheetParser_parseArgumentDeclaration_closure0: function StylesheetParser_parseArgumentDeclaration_closure0(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser__parseSingleProduction_closure0: function StylesheetParser__parseSingleProduction_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.production = t1;
+      this.T = t2;
+    },
+    StylesheetParser_parseSignature_closure: function StylesheetParser_parseSignature_closure(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser__statement_closure0: function StylesheetParser__statement_closure0(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser_variableDeclarationWithoutNamespace_closure1: function StylesheetParser_variableDeclarationWithoutNamespace_closure1(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    StylesheetParser_variableDeclarationWithoutNamespace_closure2: function StylesheetParser_variableDeclarationWithoutNamespace_closure2(t0) {
+      this.declaration = t0;
+    },
+    StylesheetParser__declarationOrBuffer_closure1: function StylesheetParser__declarationOrBuffer_closure1(t0) {
+      this.name = t0;
+    },
+    StylesheetParser__declarationOrBuffer_closure2: function StylesheetParser__declarationOrBuffer_closure2(t0, t1) {
+      this._box_0 = t0;
+      this.name = t1;
+    },
+    StylesheetParser__styleRule_closure0: function StylesheetParser__styleRule_closure0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.wasInStyleRule = t2;
+    },
+    StylesheetParser__propertyOrVariableDeclaration_closure1: function StylesheetParser__propertyOrVariableDeclaration_closure1(t0) {
+      this._box_0 = t0;
+    },
+    StylesheetParser__propertyOrVariableDeclaration_closure2: function StylesheetParser__propertyOrVariableDeclaration_closure2(t0, t1) {
+      this._box_0 = t0;
+      this.value = t1;
+    },
+    StylesheetParser__atRootRule_closure1: function StylesheetParser__atRootRule_closure1(t0) {
+      this.query = t0;
+    },
+    StylesheetParser__atRootRule_closure2: function StylesheetParser__atRootRule_closure2() {
+    },
+    StylesheetParser__eachRule_closure0: function StylesheetParser__eachRule_closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.wasInControlDirective = t1;
+      _.variables = t2;
+      _.list = t3;
+    },
+    StylesheetParser__functionRule_closure0: function StylesheetParser__functionRule_closure0(t0, t1, t2) {
+      this.name = t0;
+      this.$arguments = t1;
+      this.precedingComment = t2;
+    },
+    StylesheetParser__forRule_closure1: function StylesheetParser__forRule_closure1(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    StylesheetParser__forRule_closure2: function StylesheetParser__forRule_closure2(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.wasInControlDirective = t2;
+      _.variable = t3;
+      _.from = t4;
+      _.to = t5;
+    },
+    StylesheetParser__memberList_closure0: function StylesheetParser__memberList_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.variables = t1;
+      this.identifiers = t2;
+    },
+    StylesheetParser__includeRule_closure0: function StylesheetParser__includeRule_closure0(t0) {
+      this._box_0 = t0;
+    },
+    StylesheetParser_mediaRule_closure0: function StylesheetParser_mediaRule_closure0(t0) {
+      this.query = t0;
+    },
+    StylesheetParser__mixinRule_closure0: function StylesheetParser__mixinRule_closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.name = t1;
+      _.$arguments = t2;
+      _.precedingComment = t3;
+    },
+    StylesheetParser_mozDocumentRule_closure0: function StylesheetParser_mozDocumentRule_closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.name = t2;
+      _.value = t3;
+    },
+    StylesheetParser_supportsRule_closure0: function StylesheetParser_supportsRule_closure0(t0) {
+      this.condition = t0;
+    },
+    StylesheetParser__whileRule_closure0: function StylesheetParser__whileRule_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.wasInControlDirective = t1;
+      this.condition = t2;
+    },
+    StylesheetParser_unknownAtRule_closure0: function StylesheetParser_unknownAtRule_closure0(t0, t1) {
+      this._box_0 = t0;
+      this.name = t1;
+    },
+    StylesheetParser_expression_resetState0: function StylesheetParser_expression_resetState0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.start = t2;
+    },
+    StylesheetParser_expression_resolveOneOperation0: function StylesheetParser_expression_resolveOneOperation0(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    StylesheetParser_expression_resolveOperations0: function StylesheetParser_expression_resolveOperations0(t0, t1) {
+      this._box_0 = t0;
+      this.resolveOneOperation = t1;
+    },
+    StylesheetParser_expression_addSingleExpression0: function StylesheetParser_expression_addSingleExpression0(t0, t1, t2, t3) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.resetState = t2;
+      _.resolveOperations = t3;
+    },
+    StylesheetParser_expression_addOperator0: function StylesheetParser_expression_addOperator0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.resolveOneOperation = t2;
+    },
+    StylesheetParser_expression_resolveSpaceExpressions0: function StylesheetParser_expression_resolveSpaceExpressions0(t0, t1) {
+      this._box_0 = t0;
+      this.resolveOperations = t1;
+    },
+    StylesheetParser__expressionUntilComma_closure0: function StylesheetParser__expressionUntilComma_closure0(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser__unicodeRange_closure1: function StylesheetParser__unicodeRange_closure1() {
+    },
+    StylesheetParser__unicodeRange_closure2: function StylesheetParser__unicodeRange_closure2() {
+    },
+    StylesheetParser_identifierLike_closure0: function StylesheetParser_identifierLike_closure0(t0, t1) {
+      this.$this = t0;
+      this.start = t1;
+    },
+    StylesheetParser__expressionUntilComparison_closure0: function StylesheetParser__expressionUntilComparison_closure0(t0) {
+      this.$this = t0;
+    },
+    StylesheetParser__publicIdentifier_closure0: function StylesheetParser__publicIdentifier_closure0(t0, t1) {
+      this.$this = t0;
+      this.start = t1;
+    },
+    Stylesheet$0: function(children, span, plainCss) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_UseRule_2),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ForwardRule_2),
+        t3 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t4 = C.JSArray_methods.any$1(t3, new M.ParentStatement_closure0());
+      t1 = new V.Stylesheet0(span, plainCss, t1, t2, t3, t4);
+      t1.Stylesheet$3$plainCss0(children, span, plainCss);
+      return t1;
+    },
+    Stylesheet_Stylesheet$parse0: function(contents, syntax, logger, url) {
+      var t1, t2;
+      switch (syntax) {
+        case C.Syntax_Sass0:
+          t1 = S.SpanScanner$(contents, url);
+          t2 = logger == null ? C.C_StderrLogger : logger;
+          return new U.SassParser0(P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_VariableDeclaration_2), t1, t2).parse$0();
+        case C.Syntax_SCSS0:
+          return L.ScssParser$0(contents, logger, url).parse$0();
+        case C.Syntax_CSS0:
+          t1 = S.SpanScanner$(contents, url);
+          t2 = logger == null ? C.C_StderrLogger : logger;
+          return new Q.CssParser0(P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_VariableDeclaration_2), t1, t2).parse$0();
+        default:
+          throw H.wrapException(P.ArgumentError$("Unknown syntax " + syntax.toString$0(0) + "."));
+      }
+    },
+    Stylesheet0: function Stylesheet0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.span = t0;
+      _.plainCss = t1;
+      _._stylesheet1$_uses = t2;
+      _._stylesheet1$_forwards = t3;
+      _.children = t4;
+      _.hasDeclarations = t5;
+    }
+  },
+  G = {Option: function Option(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) {
+      var _ = this;
+      _.name = t0;
+      _.abbr = t1;
+      _.help = t2;
+      _.valueHelp = t3;
+      _.allowed = t4;
+      _.allowedHelp = t5;
+      _.defaultsTo = t6;
+      _.negatable = t7;
+      _.callback = t8;
+      _.type = t9;
+      _.splitCommas = t10;
+      _.hide = t11;
+    }, OptionType: function OptionType(t0) {
+      this.name = t0;
+    },
+    Parser$: function(commandName, grammar, args, $parent, rest) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      if (rest != null)
+        C.JSArray_methods.addAll$1(t1, rest);
+      return new G.Parser0(commandName, $parent, grammar, args, t1, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.dynamic));
+    },
+    _isLetterOrDigit: function(codeUnit) {
+      var t1;
+      if (!(codeUnit >= 65 && codeUnit <= 90))
+        if (!(codeUnit >= 97 && codeUnit <= 122))
+          t1 = codeUnit >= 48 && codeUnit <= 57;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    Parser0: function Parser0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.commandName = t0;
+      _.parent = t1;
+      _.grammar = t2;
+      _.args = t3;
+      _.rest = t4;
+      _.results = t5;
+    },
+    Parser_parse_closure: function Parser_parse_closure(t0) {
+      this.$this = t0;
+    },
+    Parser_setOption_closure: function Parser_setOption_closure() {
+    },
+    Usage: function Usage(t0, t1) {
+      var _ = this;
+      _.optionsAndSeparators = t0;
+      _.buffer = null;
+      _.currentColumn = 0;
+      _.columnWidths = null;
+      _.newlinesNeeded = _.numHelpLines = 0;
+      _.lineLength = t1;
+    },
+    Usage_generate_closure: function Usage_generate_closure() {
+    },
+    Usage_buildAllowedList_closure: function Usage_buildAllowedList_closure(t0) {
+      this.option = t0;
+    },
+    StreamQueue: function StreamQueue(t0, t1, t2, t3) {
+      var _ = this;
+      _._stream_queue$_source = t0;
+      _._stream_queue$_subscription = null;
+      _._isDone = false;
+      _._eventsReceived = 0;
+      _._eventQueue = t1;
+      _._requestQueue = t2;
+      _.$ti = t3;
+    },
+    StreamQueue__ensureListening_closure: function StreamQueue__ensureListening_closure(t0) {
+      this.$this = t0;
+    },
+    StreamQueue__ensureListening_closure1: function StreamQueue__ensureListening_closure1(t0) {
+      this.$this = t0;
+    },
+    StreamQueue__ensureListening_closure0: function StreamQueue__ensureListening_closure0(t0) {
+      this.$this = t0;
+    },
+    _NextRequest: function _NextRequest(t0, t1) {
+      this._completer = t0;
+      this.$ti = t1;
+    },
+    ModifiableCssMediaRule$: function(queries, span) {
+      var t1 = P.List_List$unmodifiable(queries, type$.legacy_CssMediaQuery),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode);
+      if (J.get$isEmpty$asx(queries))
+        H.throwExpression(P.ArgumentError$value(queries, "queries", "may not be empty."));
+      return new G.ModifiableCssMediaRule(t1, span, new P.UnmodifiableListView(t2, type$.UnmodifiableListView_legacy_ModifiableCssNode), t2);
+    },
+    ModifiableCssMediaRule: function ModifiableCssMediaRule(t0, t1, t2, t3) {
+      var _ = this;
+      _.queries = t0;
+      _.span = t1;
+      _.children = t2;
+      _._children = t3;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    MediaRule$: function(query, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new G.MediaRule(query, span, t1, t2);
+    },
+    MediaRule: function MediaRule(t0, t1, t2, t3) {
+      var _ = this;
+      _.query = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    WhileRule$: function(condition, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new G.WhileRule(condition, span, t1, t2);
+    },
+    WhileRule: function WhileRule(t0, t1, t2, t3) {
+      var _ = this;
+      _.condition = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    Parser_isIdentifier: function(text) {
+      var t1, t2, exception, logger = null;
+      try {
+        t1 = logger;
+        t2 = S.SpanScanner$(text, null);
+        new G.Parser(t2, t1 == null ? C.StderrLogger_false : t1)._parseIdentifier$0();
+        return true;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof E.SassFormatException)
+          return false;
+        else
+          throw exception;
+      }
+    },
+    Parser: function Parser(t0, t1) {
+      this.scanner = t0;
+      this.logger = t1;
+    },
+    Parser__parseIdentifier_closure: function Parser__parseIdentifier_closure(t0) {
+      this.$this = t0;
+    },
+    Parser_scanIdentChar_matches: function Parser_scanIdentChar_matches(t0, t1) {
+      this.caseSensitive = t0;
+      this.char = t1;
+    },
+    FixedLengthListBuilder: function FixedLengthListBuilder(t0, t1) {
+      this._list = t0;
+      this._fixed_length_list_builder$_index = 0;
+      this.$ti = t1;
+    },
+    SourceSpanFormatException$: function(message, span, source) {
+      return new G.SourceSpanFormatException(source, message, span);
+    },
+    SourceSpanException: function SourceSpanException() {
+    },
+    SourceSpanFormatException: function SourceSpanFormatException(t0, t1, t2) {
+      this.source = t0;
+      this._span_exception$_message = t1;
+      this._span = t2;
+    },
+    FixedLengthListBuilder0: function FixedLengthListBuilder0(t0, t1) {
+      this._fixed_length_list_builder0$_list = t0;
+      this._fixed_length_list_builder0$_index = 0;
+      this.$ti = t1;
+    },
+    ModifiableCssMediaRule$0: function(queries, span) {
+      var t1 = P.List_List$unmodifiable(queries, type$.legacy_CssMediaQuery_2),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode_2);
+      if (J.get$isEmpty$asx(queries))
+        H.throwExpression(P.ArgumentError$value(queries, "queries", "may not be empty."));
+      return new G.ModifiableCssMediaRule0(t1, span, new P.UnmodifiableListView(t2, type$.UnmodifiableListView_legacy_ModifiableCssNode_2), t2);
+    },
+    ModifiableCssMediaRule0: function ModifiableCssMediaRule0(t0, t1, t2, t3) {
+      var _ = this;
+      _.queries = t0;
+      _.span = t1;
+      _.children = t2;
+      _._node2$_children = t3;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    MediaRule$0: function(query, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new G.MediaRule0(query, span, t1, t2);
+    },
+    MediaRule0: function MediaRule0(t0, t1, t2, t3) {
+      var _ = this;
+      _.query = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    Parser_isIdentifier0: function(text) {
+      var t1, t2, exception, logger = null;
+      try {
+        t1 = logger;
+        t2 = S.SpanScanner$(text, null);
+        new G.Parser1(t2, t1 == null ? C.C_StderrLogger : t1)._parser$_parseIdentifier$0();
+        return true;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof E.SassFormatException0)
+          return false;
+        else
+          throw exception;
+      }
+    },
+    Parser1: function Parser1(t0, t1) {
+      this.scanner = t0;
+      this.logger = t1;
+    },
+    Parser__parseIdentifier_closure0: function Parser__parseIdentifier_closure0(t0) {
+      this.$this = t0;
+    },
+    Parser_scanIdentChar_matches0: function Parser_scanIdentChar_matches0(t0, t1) {
+      this.caseSensitive = t0;
+      this.char = t1;
+    },
+    Types: function Types() {
+    },
+    WhileRule$0: function(condition, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new G.WhileRule0(condition, span, t1, t2);
+    },
+    WhileRule0: function WhileRule0(t0, t1, t2, t3) {
+      var _ = this;
+      _.condition = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    }
+  },
+  F = {ValueResult: function ValueResult(t0, t1) {
+      this.value = t0;
+      this.$ti = t1;
+    }, ConsoleModule: function ConsoleModule() {
+    }, Console: function Console() {
+    }, EventEmitter: function EventEmitter() {
+    }, UrlStyle: function UrlStyle(t0, t1, t2, t3) {
+      var _ = this;
+      _.separatorPattern = t0;
+      _.needsSeparatorPattern = t1;
+      _.rootPattern = t2;
+      _.relativeRootPattern = t3;
+    }, CssMediaQuery: function CssMediaQuery(t0, t1, t2) {
+      this.modifier = t0;
+      this.type = t1;
+      this.features = t2;
+    }, _SingletonCssMediaQueryMergeResult: function _SingletonCssMediaQueryMergeResult(t0) {
+      this._media_query$_name = t0;
+    }, MediaQuerySuccessfulMergeResult: function MediaQuerySuccessfulMergeResult(t0) {
+      this.query = t0;
+    },
+    ModifiableCssImport$: function(url, span, media, supports) {
+      return new F.ModifiableCssImport(url, supports, media == null ? null : P.List_List$unmodifiable(media, type$.legacy_CssMediaQuery), span);
+    },
+    ModifiableCssImport: function ModifiableCssImport(t0, t1, t2, t3) {
+      var _ = this;
+      _.url = t0;
+      _.supports = t1;
+      _.media = t2;
+      _.span = t3;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    ModifiableCssValue: function ModifiableCssValue(t0, t1, t2) {
+      this.value = t0;
+      this.span = t1;
+      this.$ti = t2;
+    },
+    CssValue: function CssValue(t0, t1, t2) {
+      this.value = t0;
+      this.span = t1;
+      this.$ti = t2;
+    },
+    FunctionExpression: function FunctionExpression(t0, t1, t2, t3) {
+      var _ = this;
+      _.namespace = t0;
+      _.name = t1;
+      _.$arguments = t2;
+      _.span = t3;
+    },
+    ValueExpression: function ValueExpression(t0, t1) {
+      this.value = t0;
+      this.span = t1;
+    },
+    SupportsFunction: function SupportsFunction(t0, t1, t2) {
+      this.name = t0;
+      this.$arguments = t1;
+      this.span = t2;
+    },
+    TypeSelector: function TypeSelector(t0) {
+      this.name = t0;
+    },
+    Extender__extendOrReplace: function(selector, source, targets, mode) {
+      var t2, t3, _i, complex, t4, t5, t6, _i0, extender, _null = null,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ComplexSelector, type$.legacy_Extension);
+      for (t2 = source.components, t3 = t2.length, _i = 0; _i < t3; ++_i) {
+        complex = t2[_i];
+        if (complex._maxSpecificity == null)
+          complex._computeSpecificity$0();
+        t4 = complex._maxSpecificity;
+        t1.$indexSet(0, complex, new S.Extension(complex, _null, t4, true, false, _null, _null, _null));
+      }
+      t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_CompoundSelector);
+      for (t3 = targets.components, t4 = t3.length, t5 = type$.legacy_CompoundSelector, _i = 0; _i < t4; ++_i) {
+        complex = t3[_i];
+        t6 = complex.components;
+        if (t6.length !== 1)
+          t2.push(H.throwExpression(E.SassScriptException$("Can't extend complex selector " + H.S(complex) + ".")));
+        else
+          t2.push(t5._as(C.JSArray_methods.get$first(t6)));
+      }
+      t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_SimpleSelector, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension);
+      for (t4 = t2.length, _i = 0; _i < t2.length; t2.length === t4 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        for (t5 = t2[_i].components, t6 = t5.length, _i0 = 0; _i0 < t6; ++_i0)
+          t3.$indexSet(0, t5[_i0], t1);
+      extender = F.Extender$_mode(mode);
+      if (!selector.get$isInvisible())
+        extender._originals.addAll$1(0, selector.components);
+      return extender._extendList$3(selector, t3, _null);
+    },
+    Extender$: function() {
+      var t1 = type$.legacy_SimpleSelector;
+      return new F.Extender(P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Set_legacy_ModifiableCssValue_legacy_SelectorList), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_List_legacy_Extension), P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList, type$.legacy_List_legacy_CssMediaQuery), P._LinkedIdentityHashMap__LinkedIdentityHashMap$es6(t1, type$.legacy_int), new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_ComplexSelector), C.ExtendMode_normal);
+    },
+    Extender$_mode: function(_mode) {
+      var t1 = type$.legacy_SimpleSelector;
+      return new F.Extender(P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Set_legacy_ModifiableCssValue_legacy_SelectorList), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_List_legacy_Extension), P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList, type$.legacy_List_legacy_CssMediaQuery), P._LinkedIdentityHashMap__LinkedIdentityHashMap$es6(t1, type$.legacy_int), new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_ComplexSelector), _mode);
+    },
+    Extender: function Extender(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._selectors = t0;
+      _._extensions = t1;
+      _._extensionsByExtender = t2;
+      _._mediaContexts = t3;
+      _._sourceSpecificity = t4;
+      _._originals = t5;
+      _._mode = t6;
+    },
+    Extender_extensionsWhereTarget_closure: function Extender_extensionsWhereTarget_closure() {
+    },
+    Extender__registerSelector_closure: function Extender__registerSelector_closure() {
+    },
+    Extender_addExtension_closure: function Extender_addExtension_closure() {
+    },
+    Extender_addExtension_closure0: function Extender_addExtension_closure0() {
+    },
+    Extender_addExtension_closure1: function Extender_addExtension_closure1(t0) {
+      this.complex = t0;
+    },
+    Extender__extendExistingExtensions_closure: function Extender__extendExistingExtensions_closure() {
+    },
+    Extender__extendExistingExtensions_closure0: function Extender__extendExistingExtensions_closure0() {
+    },
+    Extender_addExtensions_closure: function Extender_addExtensions_closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.extender = t2;
+    },
+    Extender_addExtensions__closure: function Extender_addExtensions__closure(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.existingSources = t1;
+      _.extensionsForTarget = t2;
+      _.selectorsForTarget = t3;
+      _.target = t4;
+    },
+    Extender_addExtensions___closure: function Extender_addExtensions___closure() {
+    },
+    Extender_addExtensions___closure0: function Extender_addExtensions___closure0(t0) {
+      this.extension = t0;
+    },
+    Extender__extendList_closure: function Extender__extendList_closure() {
+    },
+    Extender__extendComplex_closure: function Extender__extendComplex_closure(t0) {
+      this.complex = t0;
+    },
+    Extender__extendComplex_closure0: function Extender__extendComplex_closure0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.complex = t2;
+    },
+    Extender__extendComplex__closure: function Extender__extendComplex__closure() {
+    },
+    Extender__extendComplex__closure0: function Extender__extendComplex__closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.complex = t2;
+      _.path = t3;
+    },
+    Extender__extendComplex___closure: function Extender__extendComplex___closure() {
+    },
+    Extender__extendCompound_closure: function Extender__extendCompound_closure(t0) {
+      this.mediaQueryContext = t0;
+    },
+    Extender__extendCompound_closure0: function Extender__extendCompound_closure0(t0, t1) {
+      this._box_1 = t0;
+      this.mediaQueryContext = t1;
+    },
+    Extender__extendCompound__closure: function Extender__extendCompound__closure() {
+    },
+    Extender__extendCompound__closure0: function Extender__extendCompound__closure0(t0) {
+      this._box_0 = t0;
+    },
+    Extender__extendCompound_closure1: function Extender__extendCompound_closure1() {
+    },
+    Extender__extendCompound_closure2: function Extender__extendCompound_closure2(t0) {
+      this.original = t0;
+    },
+    Extender__extendCompound_closure3: function Extender__extendCompound_closure3() {
+    },
+    Extender__extendCompound_closure4: function Extender__extendCompound_closure4() {
+    },
+    Extender__extendSimple_withoutPseudo: function Extender__extendSimple_withoutPseudo(t0, t1, t2) {
+      this.$this = t0;
+      this.extensions = t1;
+      this.targetsUsed = t2;
+    },
+    Extender__extendSimple_closure: function Extender__extendSimple_closure(t0, t1) {
+      this.$this = t0;
+      this.withoutPseudo = t1;
+    },
+    Extender__extendPseudo_closure: function Extender__extendPseudo_closure() {
+    },
+    Extender__extendPseudo_closure0: function Extender__extendPseudo_closure0() {
+    },
+    Extender__extendPseudo_closure1: function Extender__extendPseudo_closure1() {
+    },
+    Extender__extendPseudo_closure2: function Extender__extendPseudo_closure2(t0) {
+      this.pseudo = t0;
+    },
+    Extender__extendPseudo_closure3: function Extender__extendPseudo_closure3(t0) {
+      this.pseudo = t0;
+    },
+    Extender__trim_closure: function Extender__trim_closure(t0, t1) {
+      this._box_0 = t0;
+      this.complex1 = t1;
+    },
+    Extender__trim_closure0: function Extender__trim_closure0(t0, t1) {
+      this._box_0 = t0;
+      this.complex1 = t1;
+    },
+    Extender_clone_closure: function Extender_clone_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.newSelectors = t1;
+      _.oldToNewSelectors = t2;
+      _.newMediaContexts = t3;
+    },
+    FilesystemImporter: function FilesystemImporter(t0) {
+      this._loadPath = t0;
+    },
+    _realCasePath: function(path) {
+      var prefix, t1;
+      if (!(J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin")))
+        return path;
+      if (J.$eq$(J.get$platform$x(self.process), "win32")) {
+        prefix = J.getInterceptor$s(path).substring$2(path, 0, $.$get$context().style.rootLength$1(path));
+        t1 = prefix.length;
+        if (t1 !== 0 && T.isAlphabetic0(C.JSString_methods._codeUnitAt$1(prefix, 0)))
+          path = prefix.toUpperCase() + C.JSString_methods.substring$1(path, t1);
+      }
+      return new F._realCasePath_helper().call$1(path);
+    },
+    _realCasePath_helper: function _realCasePath_helper() {
+    },
+    _realCasePath_helper_closure: function _realCasePath_helper_closure(t0, t1, t2) {
+      this.helper = t0;
+      this.dirname = t1;
+      this.path = t2;
+    },
+    _realCasePath_helper__closure: function _realCasePath_helper__closure(t0) {
+      this.basename = t0;
+    },
+    _QuietLogger: function _QuietLogger() {
+    },
+    JSFunction: function JSFunction() {
+    },
+    NodeImporterResult: function NodeImporterResult() {
+    },
+    MediaQueryParser$: function(contents, logger, url) {
+      var t1 = S.SpanScanner$(contents, url);
+      return new F.MediaQueryParser(t1, logger);
+    },
+    MediaQueryParser: function MediaQueryParser(t0, t1) {
+      this.scanner = t0;
+      this.logger = t1;
+    },
+    MediaQueryParser_parse_closure: function MediaQueryParser_parse_closure(t0) {
+      this.$this = t0;
+    },
+    PrefixedMapView: function PrefixedMapView(t0, t1, t2) {
+      this._prefixed_map_view$_map = t0;
+      this._prefix = t1;
+      this.$ti = t2;
+    },
+    _PrefixedKeys: function _PrefixedKeys(t0) {
+      this._view = t0;
+    },
+    _PrefixedKeys_iterator_closure: function _PrefixedKeys_iterator_closure(t0) {
+      this.$this = t0;
+    },
+    Value: function Value() {
+    },
+    SassFunction: function SassFunction(t0) {
+      this.callable = t0;
+    },
+    _FindDependenciesVisitor: function _FindDependenciesVisitor(t0, t1) {
+      this._usesAndForwards = t0;
+      this._imports = t1;
+    },
+    Extender__extendOrReplace0: function(selector, source, targets, mode) {
+      var t2, t3, _i, complex, t4, t5, t6, _i0, extender, _null = null,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ComplexSelector_2, type$.legacy_Extension_2);
+      for (t2 = source.components, t3 = t2.length, _i = 0; _i < t3; ++_i) {
+        complex = t2[_i];
+        if (complex._complex0$_maxSpecificity == null)
+          complex._complex0$_computeSpecificity$0();
+        t4 = complex._complex0$_maxSpecificity;
+        t1.$indexSet(0, complex, new S.Extension0(complex, _null, t4, true, false, _null, _null, _null));
+      }
+      t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_CompoundSelector_2);
+      for (t3 = targets.components, t4 = t3.length, t5 = type$.legacy_CompoundSelector_2, _i = 0; _i < t4; ++_i) {
+        complex = t3[_i];
+        t6 = complex.components;
+        if (t6.length !== 1)
+          t2.push(H.throwExpression(E.SassScriptException$0("Can't extend complex selector " + H.S(complex) + ".")));
+        else
+          t2.push(t5._as(C.JSArray_methods.get$first(t6)));
+      }
+      t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_SimpleSelector_2, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension_2);
+      for (t4 = t2.length, _i = 0; _i < t2.length; t2.length === t4 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        for (t5 = t2[_i].components, t6 = t5.length, _i0 = 0; _i0 < t6; ++_i0)
+          t3.$indexSet(0, t5[_i0], t1);
+      extender = F.Extender$_mode0(mode);
+      if (!selector.get$isInvisible())
+        extender._extender$_originals.addAll$1(0, selector.components);
+      return extender._extender$_extendList$3(selector, t3, _null);
+    },
+    Extender$0: function() {
+      var t1 = type$.legacy_SimpleSelector_2;
+      return new F.Extender0(P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Set_legacy_ModifiableCssValue_legacy_SelectorList_2), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension_2), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_List_legacy_Extension_2), P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList_2, type$.legacy_List_legacy_CssMediaQuery_2), P._LinkedIdentityHashMap__LinkedIdentityHashMap$es6(t1, type$.legacy_int), new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_ComplexSelector_2), C.ExtendMode_normal0);
+    },
+    Extender$_mode0: function(_mode) {
+      var t1 = type$.legacy_SimpleSelector_2;
+      return new F.Extender0(P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Set_legacy_ModifiableCssValue_legacy_SelectorList_2), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension_2), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_List_legacy_Extension_2), P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList_2, type$.legacy_List_legacy_CssMediaQuery_2), P._LinkedIdentityHashMap__LinkedIdentityHashMap$es6(t1, type$.legacy_int), new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_ComplexSelector_2), _mode);
+    },
+    Extender0: function Extender0(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._extender$_selectors = t0;
+      _._extender$_extensions = t1;
+      _._extender$_extensionsByExtender = t2;
+      _._extender$_mediaContexts = t3;
+      _._extender$_sourceSpecificity = t4;
+      _._extender$_originals = t5;
+      _._extender$_mode = t6;
+    },
+    Extender_extensionsWhereTarget_closure0: function Extender_extensionsWhereTarget_closure0() {
+    },
+    Extender__registerSelector_closure0: function Extender__registerSelector_closure0() {
+    },
+    Extender_addExtension_closure2: function Extender_addExtension_closure2() {
+    },
+    Extender_addExtension_closure3: function Extender_addExtension_closure3() {
+    },
+    Extender_addExtension_closure4: function Extender_addExtension_closure4(t0) {
+      this.complex = t0;
+    },
+    Extender__extendExistingExtensions_closure1: function Extender__extendExistingExtensions_closure1() {
+    },
+    Extender__extendExistingExtensions_closure2: function Extender__extendExistingExtensions_closure2() {
+    },
+    Extender_addExtensions_closure0: function Extender_addExtensions_closure0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.extender = t2;
+    },
+    Extender_addExtensions__closure0: function Extender_addExtensions__closure0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.existingSources = t1;
+      _.extensionsForTarget = t2;
+      _.selectorsForTarget = t3;
+      _.target = t4;
+    },
+    Extender_addExtensions___closure1: function Extender_addExtensions___closure1() {
+    },
+    Extender_addExtensions___closure2: function Extender_addExtensions___closure2(t0) {
+      this.extension = t0;
+    },
+    Extender__extendList_closure0: function Extender__extendList_closure0() {
+    },
+    Extender__extendComplex_closure1: function Extender__extendComplex_closure1(t0) {
+      this.complex = t0;
+    },
+    Extender__extendComplex_closure2: function Extender__extendComplex_closure2(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.complex = t2;
+    },
+    Extender__extendComplex__closure1: function Extender__extendComplex__closure1() {
+    },
+    Extender__extendComplex__closure2: function Extender__extendComplex__closure2(t0, t1, t2, t3) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.complex = t2;
+      _.path = t3;
+    },
+    Extender__extendComplex___closure0: function Extender__extendComplex___closure0() {
+    },
+    Extender__extendCompound_closure5: function Extender__extendCompound_closure5(t0) {
+      this.mediaQueryContext = t0;
+    },
+    Extender__extendCompound_closure6: function Extender__extendCompound_closure6(t0, t1) {
+      this._box_1 = t0;
+      this.mediaQueryContext = t1;
+    },
+    Extender__extendCompound__closure1: function Extender__extendCompound__closure1() {
+    },
+    Extender__extendCompound__closure2: function Extender__extendCompound__closure2(t0) {
+      this._box_0 = t0;
+    },
+    Extender__extendCompound_closure7: function Extender__extendCompound_closure7() {
+    },
+    Extender__extendCompound_closure8: function Extender__extendCompound_closure8(t0) {
+      this.original = t0;
+    },
+    Extender__extendCompound_closure9: function Extender__extendCompound_closure9() {
+    },
+    Extender__extendCompound_closure10: function Extender__extendCompound_closure10() {
+    },
+    Extender__extendSimple_withoutPseudo0: function Extender__extendSimple_withoutPseudo0(t0, t1, t2) {
+      this.$this = t0;
+      this.extensions = t1;
+      this.targetsUsed = t2;
+    },
+    Extender__extendSimple_closure0: function Extender__extendSimple_closure0(t0, t1) {
+      this.$this = t0;
+      this.withoutPseudo = t1;
+    },
+    Extender__extendPseudo_closure4: function Extender__extendPseudo_closure4() {
+    },
+    Extender__extendPseudo_closure5: function Extender__extendPseudo_closure5() {
+    },
+    Extender__extendPseudo_closure6: function Extender__extendPseudo_closure6() {
+    },
+    Extender__extendPseudo_closure7: function Extender__extendPseudo_closure7(t0) {
+      this.pseudo = t0;
+    },
+    Extender__extendPseudo_closure8: function Extender__extendPseudo_closure8(t0) {
+      this.pseudo = t0;
+    },
+    Extender__trim_closure1: function Extender__trim_closure1(t0, t1) {
+      this._box_0 = t0;
+      this.complex1 = t1;
+    },
+    Extender__trim_closure2: function Extender__trim_closure2(t0, t1) {
+      this._box_0 = t0;
+      this.complex1 = t1;
+    },
+    Extender_clone_closure0: function Extender_clone_closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.newSelectors = t1;
+      _.oldToNewSelectors = t2;
+      _.newMediaContexts = t3;
+    },
+    FilesystemImporter0: function FilesystemImporter0(t0) {
+      this._filesystem$_loadPath = t0;
+    },
+    FunctionExpression0: function FunctionExpression0(t0, t1, t2, t3) {
+      var _ = this;
+      _.namespace = t0;
+      _.name = t1;
+      _.$arguments = t2;
+      _.span = t3;
+    },
+    JSFunction0: function JSFunction0() {
+    },
+    SupportsFunction0: function SupportsFunction0(t0, t1, t2) {
+      this.name = t0;
+      this.$arguments = t1;
+      this.span = t2;
+    },
+    SassFunction0: function SassFunction0(t0) {
+      this.callable = t0;
+    },
+    NodeImporter__addSassPath: function($async$includePaths) {
+      return P._makeSyncStarIterable(function() {
+        var includePaths = $async$includePaths;
+        var $async$goto = 0, $async$handler = 2, $async$currentError, sassPath;
+        return function $async$NodeImporter__addSassPath($async$errorCode, $async$result) {
+          if ($async$errorCode === 1) {
+            $async$currentError = $async$result;
+            $async$goto = $async$handler;
+          }
+          while (true)
+            switch ($async$goto) {
+              case 0:
+                // Function start
+                $async$goto = 3;
+                return P._IterationMarker_yieldStar(includePaths);
+              case 3:
+                // after yield
+                sassPath = H._asStringS(J.get$env$x(self.process).SASS_PATH);
+                if (sassPath == null) {
+                  // goto return
+                  $async$goto = 1;
+                  break;
+                }
+                $async$goto = 4;
+                return P._IterationMarker_yieldStar(H.setRuntimeTypeInfo(sassPath.split(J.$eq$(J.get$platform$x(self.process), "win32") ? ";" : ":"), type$.JSArray_String));
+              case 4:
+                // after yield
+              case 1:
+                // return
+                return P._IterationMarker_endOfIteration();
+              case 2:
+                // rethrow
+                return P._IterationMarker_uncaughtError($async$currentError);
+            }
+        };
+      }, type$.legacy_String);
+    },
+    NodeImporter: function NodeImporter(t0, t1, t2) {
+      this._implementation$_context = t0;
+      this._includePaths = t1;
+      this._implementation$_importers = t2;
+    },
+    NodeImporter__tryPath_closure: function NodeImporter__tryPath_closure(t0) {
+      this.path = t0;
+    },
+    ModifiableCssImport$0: function(url, span, media, supports) {
+      return new F.ModifiableCssImport0(url, supports, media == null ? null : P.List_List$unmodifiable(media, type$.legacy_CssMediaQuery_2), span);
+    },
+    ModifiableCssImport0: function ModifiableCssImport0(t0, t1, t2, t3) {
+      var _ = this;
+      _.url = t0;
+      _.supports = t1;
+      _.media = t2;
+      _.span = t3;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    NodeImporterResult0: function NodeImporterResult0() {
+    },
+    _realCasePath0: function(path) {
+      var prefix, t1;
+      if (!(J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin")))
+        return path;
+      if (J.$eq$(J.get$platform$x(self.process), "win32")) {
+        prefix = J.getInterceptor$s(path).substring$2(path, 0, $.$get$context().style.rootLength$1(path));
+        t1 = prefix.length;
+        if (t1 !== 0 && T.isAlphabetic1(C.JSString_methods._codeUnitAt$1(prefix, 0)))
+          path = prefix.toUpperCase() + C.JSString_methods.substring$1(path, t1);
+      }
+      return new F._realCasePath_helper0().call$1(path);
+    },
+    _realCasePath_helper0: function _realCasePath_helper0() {
+    },
+    _realCasePath_helper_closure0: function _realCasePath_helper_closure0(t0, t1, t2) {
+      this.helper = t0;
+      this.dirname = t1;
+      this.path = t2;
+    },
+    _realCasePath_helper__closure0: function _realCasePath_helper__closure0(t0) {
+      this.basename = t0;
+    },
+    CssMediaQuery0: function CssMediaQuery0(t0, t1, t2) {
+      this.modifier = t0;
+      this.type = t1;
+      this.features = t2;
+    },
+    _SingletonCssMediaQueryMergeResult0: function _SingletonCssMediaQueryMergeResult0(t0) {
+      this._media_query1$_name = t0;
+    },
+    MediaQuerySuccessfulMergeResult0: function MediaQuerySuccessfulMergeResult0(t0) {
+      this.query = t0;
+    },
+    MediaQueryParser$0: function(contents, logger, url) {
+      var t1 = S.SpanScanner$(contents, url);
+      return new F.MediaQueryParser0(t1, logger);
+    },
+    MediaQueryParser0: function MediaQueryParser0(t0, t1) {
+      this.scanner = t0;
+      this.logger = t1;
+    },
+    MediaQueryParser_parse_closure0: function MediaQueryParser_parse_closure0(t0) {
+      this.$this = t0;
+    },
+    PrefixedMapView0: function PrefixedMapView0(t0, t1, t2) {
+      this._prefixed_map_view0$_map = t0;
+      this._prefixed_map_view0$_prefix = t1;
+      this.$ti = t2;
+    },
+    _PrefixedKeys0: function _PrefixedKeys0(t0) {
+      this._prefixed_map_view0$_view = t0;
+    },
+    _PrefixedKeys_iterator_closure0: function _PrefixedKeys_iterator_closure0(t0) {
+      this.$this = t0;
+    },
+    TypeSelector0: function TypeSelector0(t0) {
+      this.name = t0;
+    },
+    CssValue0: function CssValue0(t0, t1, t2) {
+      this.value = t0;
+      this.span = t1;
+      this.$ti = t2;
+    },
+    ValueExpression0: function ValueExpression0(t0, t1) {
+      this.value = t0;
+      this.span = t1;
+    },
+    ModifiableCssValue0: function ModifiableCssValue0(t0, t1, t2) {
+      this.value = t0;
+      this.span = t1;
+      this.$ti = t2;
+    },
+    Value0: function Value0() {
+    },
+    unwrapValue: function(object) {
+      var value, t1;
+      if (object != null) {
+        if (object instanceof F.Value0)
+          return object;
+        value = object.dartValue;
+        if (value != null && value instanceof F.Value0)
+          return value;
+        t1 = self.Error;
+        if (H._asBoolS($.$get$_jsInstanceOf().call$2(object, t1)))
+          throw H.wrapException(object);
+      }
+      throw H.wrapException(H.S(object) + " must be a Sass value type.");
+    },
+    wrapValue: function(value) {
+      if (value instanceof K.SassColor0)
+        return P.callConstructor($.$get$colorConstructor(), H.setRuntimeTypeInfo([null, null, null, null, value], type$.JSArray_legacy_Object));
+      if (value instanceof D.SassList0)
+        return P.callConstructor($.$get$listConstructor(), H.setRuntimeTypeInfo([null, null, value], type$.JSArray_legacy_Object));
+      if (value instanceof A.SassMap0)
+        return P.callConstructor($.$get$mapConstructor(), H.setRuntimeTypeInfo([null, value], type$.JSArray_legacy_Object));
+      if (value instanceof T.SassNumber0)
+        return P.callConstructor($.$get$numberConstructor(), H.setRuntimeTypeInfo([null, null, value], type$.JSArray_legacy_Object));
+      if (value instanceof D.SassString0)
+        return P.callConstructor($.$get$stringConstructor(), H.setRuntimeTypeInfo([null, value], type$.JSArray_legacy_Object));
+      return value;
+    }
+  },
+  Y = {StreamCompleter: function StreamCompleter(t0, t1) {
+      this._stream_completer$_stream = t0;
+      this.$ti = t1;
+    }, _CompleterStream: function _CompleterStream(t0) {
+      this._sourceStream = this._stream_completer$_controller = null;
+      this.$ti = t0;
+    }, Modules: function Modules() {
+    }, Module1: function Module1() {
+    }, Net: function Net() {
+    }, Socket: function Socket() {
+    }, NetAddress: function NetAddress() {
+    }, NetServer: function NetServer() {
+    },
+    ContentBlock$: function($arguments, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new Y.ContentBlock(null, $arguments, span, t1, t2);
+    },
+    ContentBlock: function ContentBlock(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.$arguments = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    WarnRule: function WarnRule(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    SupportsAnything: function SupportsAnything(t0, t1) {
+      this.contents = t0;
+      this.span = t1;
+    },
+    unifyComplex: function(complexes) {
+      var t2, unifiedBase, base, t3, t4, _i, complexesWithoutBases,
+        t1 = J.getInterceptor$asx(complexes);
+      if (t1.get$length(complexes) === 1)
+        return complexes;
+      for (t2 = t1.get$iterator(complexes), unifiedBase = null; t2.moveNext$0();) {
+        base = J.get$last$ax(t2.get$current(t2));
+        if (base instanceof X.CompoundSelector)
+          if (unifiedBase == null)
+            unifiedBase = base.components;
+          else
+            for (t3 = base.components, t4 = t3.length, _i = 0; _i < t4; ++_i) {
+              unifiedBase = t3[_i].unify$1(unifiedBase);
+              if (unifiedBase == null)
+                return null;
+            }
+        else
+          return null;
+      }
+      t1 = t1.map$1$1(complexes, new Y.unifyComplex_closure(), type$.legacy_List_legacy_ComplexSelectorComponent);
+      complexesWithoutBases = P.List_List$from(t1, true, t1.$ti._eval$1("ListIterable.E"));
+      J.add$1$ax(C.JSArray_methods.get$last(complexesWithoutBases), X.CompoundSelector$(unifiedBase));
+      return Y.weave(complexesWithoutBases);
+    },
+    unifyCompound: function(compound1, compound2) {
+      var t1, result, _i;
+      for (t1 = compound1.length, result = compound2, _i = 0; _i < t1; ++_i) {
+        result = compound1[_i].unify$1(result);
+        if (result == null)
+          return null;
+      }
+      return X.CompoundSelector$(result);
+    },
+    unifyUniversalAndElement: function(selector1, selector2) {
+      var namespace1, name1, t1, namespace2, name2, namespace, $name, _null = null,
+        _s45_ = string$.must_b;
+      if (selector1 instanceof N.UniversalSelector) {
+        namespace1 = selector1.namespace;
+        name1 = _null;
+      } else if (selector1 instanceof F.TypeSelector) {
+        t1 = selector1.name;
+        namespace1 = t1.namespace;
+        name1 = t1.name;
+      } else
+        throw H.wrapException(P.ArgumentError$value(selector1, "selector1", _s45_));
+      if (selector2 instanceof N.UniversalSelector) {
+        namespace2 = selector2.namespace;
+        name2 = _null;
+      } else if (selector2 instanceof F.TypeSelector) {
+        t1 = selector2.name;
+        namespace2 = t1.namespace;
+        name2 = t1.name;
+      } else
+        throw H.wrapException(P.ArgumentError$value(selector2, "selector2", _s45_));
+      if (namespace1 == namespace2 || namespace2 === "*")
+        namespace = namespace1;
+      else {
+        if (namespace1 !== "*")
+          return _null;
+        namespace = namespace2;
+      }
+      if (name1 == name2 || name2 == null)
+        $name = name1;
+      else {
+        if (!(name1 == null || name1 === "*"))
+          return _null;
+        $name = name2;
+      }
+      return $name == null ? new N.UniversalSelector(namespace) : new F.TypeSelector(new D.QualifiedName($name, namespace));
+    },
+    weave: function(complexes) {
+      var t2, cur, t3, target, _i, parents, newPrefixes, parentPrefixes, t4, t5,
+        t1 = type$.JSArray_legacy_List_legacy_ComplexSelectorComponent,
+        prefixes = H.setRuntimeTypeInfo([J.toList$0$ax(C.JSArray_methods.get$first(complexes))], t1);
+      for (t2 = H.SubListIterable$(complexes, 1, null, H._arrayInstanceType(complexes)._precomputed1), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t3 = J.getInterceptor$asx(cur);
+        if (t3.get$isEmpty(cur))
+          continue;
+        target = t3.get$last(cur);
+        if (t3.get$length(cur) === 1) {
+          for (t3 = prefixes.length, _i = 0; _i < prefixes.length; prefixes.length === t3 || (0, H.throwConcurrentModificationError)(prefixes), ++_i)
+            J.add$1$ax(prefixes[_i], target);
+          continue;
+        }
+        parents = t3.take$1(cur, t3.get$length(cur) - 1).toList$0(0);
+        newPrefixes = H.setRuntimeTypeInfo([], t1);
+        for (t3 = prefixes.length, _i = 0; _i < prefixes.length; prefixes.length === t3 || (0, H.throwConcurrentModificationError)(prefixes), ++_i) {
+          parentPrefixes = Y._weaveParents(prefixes[_i], parents);
+          if (parentPrefixes == null)
+            continue;
+          for (t4 = parentPrefixes.get$iterator(parentPrefixes); t4.moveNext$0();) {
+            t5 = t4.get$current(t4);
+            J.add$1$ax(t5, target);
+            newPrefixes.push(t5);
+          }
+        }
+        prefixes = newPrefixes;
+      }
+      return prefixes;
+    },
+    _weaveParents: function(parents1, parents2) {
+      var finalCombinators, root1, root2, root, groups1, groups2, lcs, t2, choices, t3, _i, group, t4, t5, _null = null,
+        t1 = type$.legacy_ComplexSelectorComponent,
+        queue1 = P.ListQueue_ListQueue$of(parents1, t1),
+        queue2 = P.ListQueue_ListQueue$of(parents2, t1),
+        initialCombinators = Y._mergeInitialCombinators(queue1, queue2);
+      if (initialCombinators == null)
+        return _null;
+      finalCombinators = Y._mergeFinalCombinators(queue1, queue2, _null);
+      if (finalCombinators == null)
+        return _null;
+      root1 = Y._firstIfRoot(queue1);
+      root2 = Y._firstIfRoot(queue2);
+      t1 = root1 != null;
+      if (t1 && root2 != null) {
+        root = Y.unifyCompound(root1.components, root2.components);
+        if (root == null)
+          return _null;
+        queue1.addFirst$1(root);
+        queue2.addFirst$1(root);
+      } else if (t1)
+        queue2.addFirst$1(root1);
+      else if (root2 != null)
+        queue1.addFirst$1(root2);
+      groups1 = Y._groupSelectors(queue1);
+      groups2 = Y._groupSelectors(queue2);
+      t1 = type$.legacy_List_legacy_ComplexSelectorComponent;
+      lcs = B.longestCommonSubsequence(groups2, groups1, new Y._weaveParents_closure(), t1);
+      t2 = type$.JSArray_legacy_Iterable_legacy_ComplexSelectorComponent;
+      choices = H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([initialCombinators], t2)], type$.JSArray_legacy_List_legacy_Iterable_legacy_ComplexSelectorComponent);
+      for (t3 = lcs.length, _i = 0; _i < lcs.length; lcs.length === t3 || (0, H.throwConcurrentModificationError)(lcs), ++_i) {
+        group = lcs[_i];
+        t4 = Y._chunks(groups1, groups2, new Y._weaveParents_closure0(group), t1);
+        t5 = H._arrayInstanceType(t4)._eval$1("MappedListIterable<1,Iterable<ComplexSelectorComponent*>*>");
+        choices.push(P.List_List$from(new H.MappedListIterable(t4, new Y._weaveParents_closure1(), t5), true, t5._eval$1("ListIterable.E")));
+        choices.push(H.setRuntimeTypeInfo([group], t2));
+        groups1.removeFirst$0();
+        groups2.removeFirst$0();
+      }
+      t2 = Y._chunks(groups1, groups2, new Y._weaveParents_closure2(), t1);
+      t3 = H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Iterable<ComplexSelectorComponent*>*>");
+      choices.push(P.List_List$from(new H.MappedListIterable(t2, new Y._weaveParents_closure3(), t3), true, t3._eval$1("ListIterable.E")));
+      C.JSArray_methods.addAll$1(choices, finalCombinators);
+      return J.map$1$1$ax(Y.paths(new H.WhereIterable(choices, new Y._weaveParents_closure4(), type$.WhereIterable_legacy_List_legacy_Iterable_legacy_ComplexSelectorComponent), type$.legacy_Iterable_legacy_ComplexSelectorComponent), new Y._weaveParents_closure5(), t1);
+    },
+    _firstIfRoot: function(queue) {
+      var first;
+      if (queue._collection$_head === queue._collection$_tail)
+        return null;
+      first = queue.get$first(queue);
+      if (first instanceof X.CompoundSelector) {
+        if (!Y._hasRoot(first))
+          return null;
+        queue.removeFirst$0();
+        return first;
+      } else
+        return null;
+    },
+    _mergeInitialCombinators: function(components1, components2) {
+      var t3, combinators2, lcs,
+        t1 = type$.JSArray_legacy_Combinator,
+        combinators1 = H.setRuntimeTypeInfo([], t1),
+        t2 = type$.legacy_Combinator;
+      while (true) {
+        if (!components1.get$isEmpty(components1)) {
+          t3 = components1._collection$_head;
+          if (t3 === components1._collection$_tail)
+            H.throwExpression(H.IterableElementError_noElement());
+          t3 = components1._collection$_table[t3] instanceof S.Combinator;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        combinators1.push(t2._as(components1.removeFirst$0()));
+      }
+      combinators2 = H.setRuntimeTypeInfo([], t1);
+      while (true) {
+        if (!components2.get$isEmpty(components2)) {
+          t1 = components2._collection$_head;
+          if (t1 === components2._collection$_tail)
+            H.throwExpression(H.IterableElementError_noElement());
+          t1 = components2._collection$_table[t1] instanceof S.Combinator;
+        } else
+          t1 = false;
+        if (!t1)
+          break;
+        combinators2.push(t2._as(components2.removeFirst$0()));
+      }
+      lcs = B.longestCommonSubsequence(combinators1, combinators2, null, t2);
+      if (C.C_ListEquality.equals$2(0, lcs, combinators1))
+        return combinators2;
+      if (C.C_ListEquality.equals$2(0, lcs, combinators2))
+        return combinators1;
+      return null;
+    },
+    _mergeFinalCombinators: function(components1, components2, result) {
+      var t1, combinators1, t2, combinators2, lcs, combinator1, combinator2, compound1, compound2, choices, unified, followingSiblingSelector, nextSiblingSelector, _null = null;
+      if (result == null)
+        result = Q.QueueList$(_null, type$.legacy_List_legacy_List_legacy_ComplexSelectorComponent);
+      if (components1._collection$_head === components1._collection$_tail || !(components1.get$last(components1) instanceof S.Combinator))
+        t1 = components2._collection$_head === components2._collection$_tail || !(components2.get$last(components2) instanceof S.Combinator);
+      else
+        t1 = false;
+      if (t1)
+        return result;
+      t1 = type$.JSArray_legacy_Combinator;
+      combinators1 = H.setRuntimeTypeInfo([], t1);
+      t2 = type$.legacy_Combinator;
+      while (true) {
+        if (!(!components1.get$isEmpty(components1) && components1.get$last(components1) instanceof S.Combinator))
+          break;
+        combinators1.push(t2._as(components1.removeLast$0(0)));
+      }
+      combinators2 = H.setRuntimeTypeInfo([], t1);
+      while (true) {
+        if (!(!components2.get$isEmpty(components2) && components2.get$last(components2) instanceof S.Combinator))
+          break;
+        combinators2.push(t2._as(components2.removeLast$0(0)));
+      }
+      t1 = combinators1.length;
+      if (t1 > 1 || combinators2.length > 1) {
+        lcs = B.longestCommonSubsequence(combinators1, combinators2, _null, t2);
+        if (C.C_ListEquality.equals$2(0, lcs, combinators1))
+          result.addFirst$1(H.setRuntimeTypeInfo([P.List_List$from(new H.ReversedListIterable(combinators2, type$.ReversedListIterable_legacy_Combinator), true, type$.legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+        else if (C.C_ListEquality.equals$2(0, lcs, combinators2))
+          result.addFirst$1(H.setRuntimeTypeInfo([P.List_List$from(new H.ReversedListIterable(combinators1, type$.ReversedListIterable_legacy_Combinator), true, type$.legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+        else
+          return _null;
+        return result;
+      }
+      combinator1 = t1 === 0 ? _null : C.JSArray_methods.get$first(combinators1);
+      combinator2 = combinators2.length === 0 ? _null : C.JSArray_methods.get$first(combinators2);
+      t1 = combinator1 != null;
+      if (t1 && combinator2 != null) {
+        t1 = type$.legacy_CompoundSelector;
+        compound1 = t1._as(components1.removeLast$0(0));
+        compound2 = t1._as(components2.removeLast$0(0));
+        t1 = combinator1 === C.Combinator_CzM;
+        if (t1 && combinator2 === C.Combinator_CzM) {
+          compound1.toString;
+          if (Y.compoundIsSuperselector(compound1, compound2, _null))
+            result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound2, C.Combinator_CzM], type$.JSArray_legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+          else {
+            compound2.toString;
+            t1 = type$.JSArray_legacy_ComplexSelectorComponent;
+            t2 = type$.JSArray_legacy_List_legacy_ComplexSelectorComponent;
+            if (Y.compoundIsSuperselector(compound2, compound1, _null))
+              result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound1, C.Combinator_CzM], t1)], t2));
+            else {
+              choices = H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound1, C.Combinator_CzM, compound2, C.Combinator_CzM], t1), H.setRuntimeTypeInfo([compound2, C.Combinator_CzM, compound1, C.Combinator_CzM], t1)], t2);
+              unified = Y.unifyCompound(compound1.components, compound2.components);
+              if (unified != null)
+                choices.push(H.setRuntimeTypeInfo([unified, C.Combinator_CzM], t1));
+              result.addFirst$1(choices);
+            }
+          }
+        } else {
+          if (!(t1 && combinator2 === C.Combinator_uzg))
+            t2 = combinator1 === C.Combinator_uzg && combinator2 === C.Combinator_CzM;
+          else
+            t2 = true;
+          if (t2) {
+            followingSiblingSelector = t1 ? compound1 : compound2;
+            nextSiblingSelector = t1 ? compound2 : compound1;
+            followingSiblingSelector.toString;
+            t1 = type$.JSArray_legacy_ComplexSelectorComponent;
+            t2 = type$.JSArray_legacy_List_legacy_ComplexSelectorComponent;
+            if (Y.compoundIsSuperselector(followingSiblingSelector, nextSiblingSelector, _null))
+              result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([nextSiblingSelector, C.Combinator_uzg], t1)], t2));
+            else {
+              unified = Y.unifyCompound(compound1.components, compound2.components);
+              t2 = H.setRuntimeTypeInfo([], t2);
+              t2.push(H.setRuntimeTypeInfo([followingSiblingSelector, C.Combinator_CzM, nextSiblingSelector, C.Combinator_uzg], t1));
+              if (unified != null)
+                t2.push(H.setRuntimeTypeInfo([unified, C.Combinator_uzg], t1));
+              result.addFirst$1(t2);
+            }
+          } else {
+            if (combinator1 === C.Combinator_sgq)
+              t2 = combinator2 === C.Combinator_uzg || combinator2 === C.Combinator_CzM;
+            else
+              t2 = false;
+            if (t2) {
+              result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound2, combinator2], type$.JSArray_legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+              components1._add$1(compound1);
+              components1._add$1(C.Combinator_sgq);
+            } else {
+              if (combinator2 === C.Combinator_sgq)
+                t1 = combinator1 === C.Combinator_uzg || t1;
+              else
+                t1 = false;
+              if (t1) {
+                result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound1, combinator1], type$.JSArray_legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+                components2._add$1(compound2);
+                components2._add$1(C.Combinator_sgq);
+              } else if (combinator1 === combinator2) {
+                unified = Y.unifyCompound(compound1.components, compound2.components);
+                if (unified == null)
+                  return _null;
+                result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([unified, combinator1], type$.JSArray_legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+              } else
+                return _null;
+            }
+          }
+        }
+        return Y._mergeFinalCombinators(components1, components2, result);
+      } else if (t1) {
+        if (combinator1 === C.Combinator_sgq)
+          if (!components2.get$isEmpty(components2)) {
+            t1 = type$.legacy_CompoundSelector;
+            t2 = t1._as(components2.get$last(components2));
+            t1 = t1._as(components1.get$last(components1));
+            t2.toString;
+            t1 = Y.compoundIsSuperselector(t2, t1, _null);
+          } else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          components2.removeLast$0(0);
+        result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([components1.removeLast$0(0), combinator1], type$.JSArray_legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+        return Y._mergeFinalCombinators(components1, components2, result);
+      } else {
+        if (combinator2 === C.Combinator_sgq)
+          if (!components1.get$isEmpty(components1)) {
+            t1 = type$.legacy_CompoundSelector;
+            t2 = t1._as(components1.get$last(components1));
+            t1 = t1._as(components2.get$last(components2));
+            t2.toString;
+            t1 = Y.compoundIsSuperselector(t2, t1, _null);
+          } else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          components1.removeLast$0(0);
+        result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([components2.removeLast$0(0), combinator2], type$.JSArray_legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+        return Y._mergeFinalCombinators(components1, components2, result);
+      }
+    },
+    _mustUnify: function(complex1, complex2) {
+      var t2, t3, t4,
+        t1 = P.LinkedHashSet_LinkedHashSet(type$.legacy_SimpleSelector);
+      for (t2 = J.get$iterator$ax(complex1); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        if (t3 instanceof X.CompoundSelector)
+          for (t3 = C.JSArray_methods.get$iterator(t3.components), t4 = new H.WhereIterator(t3, Y.functions___isUnique$closure()); t4.moveNext$0();)
+            t1.add$1(0, t3.get$current(t3));
+      }
+      if (t1._collection$_length === 0)
+        return false;
+      return J.any$1$ax(complex2, new Y._mustUnify_closure(t1));
+    },
+    _isUnique: function(simple) {
+      var t1;
+      if (!(simple instanceof N.IDSelector))
+        t1 = simple instanceof D.PseudoSelector && !simple.isClass;
+      else
+        t1 = true;
+      return t1;
+    },
+    _chunks: function(queue1, queue2, done, $T) {
+      var chunk2, t2, t3, _i,
+        t1 = $T._eval$1("JSArray<0*>"),
+        chunk1 = H.setRuntimeTypeInfo([], t1);
+      for (; !done.call$1(queue1);)
+        chunk1.push(queue1.removeFirst$0());
+      chunk2 = H.setRuntimeTypeInfo([], t1);
+      for (; !done.call$1(queue2);)
+        chunk2.push(queue2.removeFirst$0());
+      t2 = chunk1.length === 0;
+      if (t2 && chunk2.length === 0)
+        return H.setRuntimeTypeInfo([], $T._eval$1("JSArray<List<0*>*>"));
+      if (t2)
+        return H.setRuntimeTypeInfo([chunk2], $T._eval$1("JSArray<List<0*>*>"));
+      if (chunk2.length === 0)
+        return H.setRuntimeTypeInfo([chunk1], $T._eval$1("JSArray<List<0*>*>"));
+      t2 = H.setRuntimeTypeInfo([], t1);
+      for (t3 = chunk1.length, _i = 0; _i < chunk1.length; chunk1.length === t3 || (0, H.throwConcurrentModificationError)(chunk1), ++_i)
+        t2.push(chunk1[_i]);
+      for (t3 = chunk2.length, _i = 0; _i < chunk2.length; chunk2.length === t3 || (0, H.throwConcurrentModificationError)(chunk2), ++_i)
+        t2.push(chunk2[_i]);
+      t1 = H.setRuntimeTypeInfo([], t1);
+      for (t3 = chunk2.length, _i = 0; _i < chunk2.length; chunk2.length === t3 || (0, H.throwConcurrentModificationError)(chunk2), ++_i)
+        t1.push(chunk2[_i]);
+      for (t3 = chunk1.length, _i = 0; _i < chunk1.length; chunk1.length === t3 || (0, H.throwConcurrentModificationError)(chunk1), ++_i)
+        t1.push(chunk1[_i]);
+      return H.setRuntimeTypeInfo([t2, t1], $T._eval$1("JSArray<List<0*>*>"));
+    },
+    paths: function(choices, $T) {
+      return J.fold$2$ax(choices, H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([], $T._eval$1("JSArray<0*>"))], $T._eval$1("JSArray<List<0*>*>")), new Y.paths_closure($T));
+    },
+    _groupSelectors: function(complex) {
+      var t1, group, cur, t2,
+        groups = Q.QueueList$(null, type$.legacy_List_legacy_ComplexSelectorComponent),
+        iterator = P._ListQueueIterator$(complex);
+      if (!iterator.moveNext$0())
+        return groups;
+      t1 = type$.JSArray_legacy_ComplexSelectorComponent;
+      group = H.setRuntimeTypeInfo([iterator.get$current(iterator)], t1);
+      groups._queue_list$_add$1(group);
+      for (; iterator.moveNext$0();) {
+        if (!(C.JSArray_methods.get$last(group) instanceof S.Combinator)) {
+          cur = iterator._collection$_current;
+          t2 = cur instanceof S.Combinator;
+        } else
+          t2 = true;
+        cur = iterator._collection$_current;
+        if (t2)
+          group.push(cur);
+        else {
+          group = H.setRuntimeTypeInfo([cur], t1);
+          groups._queue_list$_add$1(group);
+        }
+      }
+      return groups;
+    },
+    _hasRoot: function(compound) {
+      return C.JSArray_methods.any$1(compound.components, new Y._hasRoot_closure());
+    },
+    listIsSuperselector: function(list1, list2) {
+      return C.JSArray_methods.every$1(list2, new Y.listIsSuperselector_closure(list1));
+    },
+    complexIsParentSuperselector: function(complex1, complex2) {
+      var t2, base, t3, t4,
+        t1 = J.getInterceptor$ax(complex1);
+      if (t1.get$first(complex1) instanceof S.Combinator)
+        return false;
+      t2 = J.getInterceptor$ax(complex2);
+      if (t2.get$first(complex2) instanceof S.Combinator)
+        return false;
+      if (t1.get$length(complex1) > t2.get$length(complex2))
+        return false;
+      base = X.CompoundSelector$(H.setRuntimeTypeInfo([new N.PlaceholderSelector("<temp>")], type$.JSArray_legacy_SimpleSelector));
+      t3 = type$.JSArray_legacy_ComplexSelectorComponent;
+      t4 = H.setRuntimeTypeInfo([], t3);
+      for (t1 = t1.get$iterator(complex1); t1.moveNext$0();)
+        t4.push(t1.get$current(t1));
+      t4.push(base);
+      t1 = H.setRuntimeTypeInfo([], t3);
+      for (t2 = t2.get$iterator(complex2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      t1.push(base);
+      return Y.complexIsSuperselector(t4, t1);
+    },
+    complexIsSuperselector: function(complex1, complex2) {
+      var t1, t2, t3, i1, i2, remaining1, remaining2, t4, t5, t6, t7, afterSuperselector, afterSuperselector0, compound2, i10, combinator1, combinator2;
+      if (C.JSArray_methods.get$last(complex1) instanceof S.Combinator)
+        return false;
+      if (C.JSArray_methods.get$last(complex2) instanceof S.Combinator)
+        return false;
+      for (t1 = H._arrayInstanceType(complex2), t2 = t1._precomputed1, t1 = t1._eval$1("SubListIterable<1>"), t3 = type$.legacy_CompoundSelector, i1 = 0, i2 = 0; true;) {
+        remaining1 = complex1.length - i1;
+        remaining2 = complex2.length - i2;
+        if (remaining1 === 0 || remaining2 === 0)
+          return false;
+        if (remaining1 > remaining2)
+          return false;
+        t4 = complex1[i1];
+        if (t4 instanceof S.Combinator)
+          return false;
+        if (complex2[i2] instanceof S.Combinator)
+          return false;
+        t3._as(t4);
+        if (remaining1 === 1) {
+          t5 = t3._as(C.JSArray_methods.get$last(complex2));
+          t6 = complex2.length - 1;
+          t7 = new H.SubListIterable(complex2, 0, t6, t1);
+          t7.SubListIterable$3(complex2, 0, t6, t2);
+          return Y.compoundIsSuperselector(t4, t5, t7.skip$1(0, i2));
+        }
+        afterSuperselector = i2 + 1;
+        for (afterSuperselector0 = afterSuperselector; afterSuperselector0 < complex2.length; ++afterSuperselector0) {
+          t5 = afterSuperselector0 - 1;
+          compound2 = complex2[t5];
+          if (compound2 instanceof X.CompoundSelector) {
+            t6 = new H.SubListIterable(complex2, 0, t5, t1);
+            t6.SubListIterable$3(complex2, 0, t5, t2);
+            if (Y.compoundIsSuperselector(t4, compound2, t6.skip$1(0, afterSuperselector)))
+              break;
+          }
+        }
+        if (afterSuperselector0 === complex2.length)
+          return false;
+        i10 = i1 + 1;
+        combinator1 = complex1[i10];
+        combinator2 = complex2[afterSuperselector0];
+        if (combinator1 instanceof S.Combinator) {
+          if (!(combinator2 instanceof S.Combinator))
+            return false;
+          if (combinator1 === C.Combinator_CzM) {
+            if (combinator2 === C.Combinator_sgq)
+              return false;
+          } else if (combinator2 !== combinator1)
+            return false;
+          if (remaining1 === 3 && remaining2 > 3)
+            return false;
+          i1 += 2;
+          i2 = afterSuperselector0 + 1;
+        } else {
+          if (combinator2 instanceof S.Combinator) {
+            if (combinator2 !== C.Combinator_sgq)
+              return false;
+            i2 = afterSuperselector0 + 1;
+          } else
+            i2 = afterSuperselector0;
+          i1 = i10;
+        }
+      }
+    },
+    compoundIsSuperselector: function(compound1, compound2, parents) {
+      var t1, t2, _i, simple1, simple2;
+      for (t1 = compound1.components, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        simple1 = t1[_i];
+        if (simple1 instanceof D.PseudoSelector && simple1.selector != null) {
+          if (!Y._selectorPseudoIsSuperselector(simple1, compound2, parents))
+            return false;
+        } else if (!Y._simpleIsSuperselectorOfCompound(simple1, compound2))
+          return false;
+      }
+      for (t1 = compound2.components, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        simple2 = t1[_i];
+        if (simple2 instanceof D.PseudoSelector && !simple2.isClass && simple2.selector == null && !Y._simpleIsSuperselectorOfCompound(simple2, compound1))
+          return false;
+      }
+      return true;
+    },
+    _simpleIsSuperselectorOfCompound: function(simple, compound) {
+      return C.JSArray_methods.any$1(compound.components, new Y._simpleIsSuperselectorOfCompound_closure(simple));
+    },
+    _selectorPseudoIsSuperselector: function(pseudo1, compound2, parents) {
+      switch (pseudo1.normalizedName) {
+        case "matches":
+        case "any":
+          return Y._selectorPseudosNamed(compound2, pseudo1.name, true).any$1(0, new Y._selectorPseudoIsSuperselector_closure(pseudo1)) || C.JSArray_methods.any$1(pseudo1.selector.components, new Y._selectorPseudoIsSuperselector_closure0(parents, compound2));
+        case "has":
+        case "host":
+        case "host-context":
+          return Y._selectorPseudosNamed(compound2, pseudo1.name, true).any$1(0, new Y._selectorPseudoIsSuperselector_closure1(pseudo1));
+        case "slotted":
+          return Y._selectorPseudosNamed(compound2, pseudo1.name, false).any$1(0, new Y._selectorPseudoIsSuperselector_closure2(pseudo1));
+        case "not":
+          return C.JSArray_methods.every$1(pseudo1.selector.components, new Y._selectorPseudoIsSuperselector_closure3(compound2, pseudo1));
+        case "current":
+          return Y._selectorPseudosNamed(compound2, pseudo1.name, true).any$1(0, new Y._selectorPseudoIsSuperselector_closure4(pseudo1));
+        case "nth-child":
+        case "nth-last-child":
+          return C.JSArray_methods.any$1(compound2.components, new Y._selectorPseudoIsSuperselector_closure5(pseudo1));
+        default:
+          throw H.wrapException("unreachable");
+      }
+    },
+    _selectorPseudosNamed: function(compound, $name, isClass) {
+      var t1 = type$.WhereTypeIterable_legacy_PseudoSelector;
+      return new H.WhereIterable(new H.WhereTypeIterable(compound.components, t1), new Y._selectorPseudosNamed_closure(isClass, $name), t1._eval$1("WhereIterable<Iterable.E>"));
+    },
+    unifyComplex_closure: function unifyComplex_closure() {
+    },
+    _weaveParents_closure: function _weaveParents_closure() {
+    },
+    _weaveParents_closure0: function _weaveParents_closure0(t0) {
+      this.group = t0;
+    },
+    _weaveParents_closure1: function _weaveParents_closure1() {
+    },
+    _weaveParents__closure1: function _weaveParents__closure1() {
+    },
+    _weaveParents_closure2: function _weaveParents_closure2() {
+    },
+    _weaveParents_closure3: function _weaveParents_closure3() {
+    },
+    _weaveParents__closure0: function _weaveParents__closure0() {
+    },
+    _weaveParents_closure4: function _weaveParents_closure4() {
+    },
+    _weaveParents_closure5: function _weaveParents_closure5() {
+    },
+    _weaveParents__closure: function _weaveParents__closure() {
+    },
+    _mustUnify_closure: function _mustUnify_closure(t0) {
+      this.uniqueSelectors = t0;
+    },
+    _mustUnify__closure: function _mustUnify__closure(t0) {
+      this.uniqueSelectors = t0;
+    },
+    paths_closure: function paths_closure(t0) {
+      this.T = t0;
+    },
+    paths__closure: function paths__closure(t0, t1) {
+      this.paths = t0;
+      this.T = t1;
+    },
+    paths___closure: function paths___closure(t0, t1) {
+      this.option = t0;
+      this.T = t1;
+    },
+    _hasRoot_closure: function _hasRoot_closure() {
+    },
+    listIsSuperselector_closure: function listIsSuperselector_closure(t0) {
+      this.list1 = t0;
+    },
+    listIsSuperselector__closure: function listIsSuperselector__closure(t0) {
+      this.complex1 = t0;
+    },
+    _simpleIsSuperselectorOfCompound_closure: function _simpleIsSuperselectorOfCompound_closure(t0) {
+      this.simple = t0;
+    },
+    _simpleIsSuperselectorOfCompound__closure: function _simpleIsSuperselectorOfCompound__closure(t0) {
+      this.simple = t0;
+    },
+    _selectorPseudoIsSuperselector_closure: function _selectorPseudoIsSuperselector_closure(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure0: function _selectorPseudoIsSuperselector_closure0(t0, t1) {
+      this.parents = t0;
+      this.compound2 = t1;
+    },
+    _selectorPseudoIsSuperselector_closure1: function _selectorPseudoIsSuperselector_closure1(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure2: function _selectorPseudoIsSuperselector_closure2(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure3: function _selectorPseudoIsSuperselector_closure3(t0, t1) {
+      this.compound2 = t0;
+      this.pseudo1 = t1;
+    },
+    _selectorPseudoIsSuperselector__closure: function _selectorPseudoIsSuperselector__closure(t0, t1) {
+      this.complex = t0;
+      this.pseudo1 = t1;
+    },
+    _selectorPseudoIsSuperselector___closure: function _selectorPseudoIsSuperselector___closure(t0) {
+      this.simple2 = t0;
+    },
+    _selectorPseudoIsSuperselector___closure0: function _selectorPseudoIsSuperselector___closure0(t0) {
+      this.simple2 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure4: function _selectorPseudoIsSuperselector_closure4(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure5: function _selectorPseudoIsSuperselector_closure5(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudosNamed_closure: function _selectorPseudosNamed_closure(t0, t1) {
+      this.isClass = t0;
+      this.name = t1;
+    },
+    closure: function closure() {
+    },
+    Chokidar: function Chokidar() {
+    },
+    ChokidarOptions: function ChokidarOptions() {
+    },
+    ChokidarWatcher: function ChokidarWatcher() {
+    },
+    SourceFile$fromString: function(text, url) {
+      var t1, t2, t3;
+      text.toString;
+      t1 = new H.CodeUnits(text);
+      t2 = H.setRuntimeTypeInfo([0], type$.JSArray_legacy_int);
+      t3 = typeof url == "string" ? P.Uri_parse(url) : type$.legacy_Uri._as(url);
+      t2 = new Y.SourceFile(t3, t2, new Uint32Array(H._ensureNativeList(t1.toList$0(t1))));
+      t2.SourceFile$decoded$2$url(t1, url);
+      return t2;
+    },
+    SourceFile$decoded: function(decodedChars, url) {
+      var t1 = H.setRuntimeTypeInfo([0], type$.JSArray_legacy_int),
+        t2 = typeof url == "string" ? P.Uri_parse(url) : type$.legacy_Uri._as(url);
+      t1 = new Y.SourceFile(t2, t1, new Uint32Array(H._ensureNativeList(J.toList$0$ax(decodedChars))));
+      t1.SourceFile$decoded$2$url(decodedChars, url);
+      return t1;
+    },
+    FileLocation$_: function(file, offset) {
+      if (offset < 0)
+        H.throwExpression(P.RangeError$("Offset may not be negative, was " + offset + "."));
+      else if (offset > file._decodedChars.length)
+        H.throwExpression(P.RangeError$("Offset " + offset + string$.x20must_ + file.get$length(file) + "."));
+      return new Y.FileLocation(file, offset);
+    },
+    _FileSpan$: function(file, _start, _end) {
+      if (_end < _start)
+        H.throwExpression(P.ArgumentError$("End " + _end + " must come after start " + _start + "."));
+      else if (_end > file._decodedChars.length)
+        H.throwExpression(P.RangeError$("End " + _end + string$.x20must_ + file.get$length(file) + "."));
+      else if (_start < 0)
+        H.throwExpression(P.RangeError$("Start may not be negative, was " + _start + "."));
+      return new Y._FileSpan(file, _start, _end);
+    },
+    SourceFile: function SourceFile(t0, t1, t2) {
+      var _ = this;
+      _.url = t0;
+      _._lineStarts = t1;
+      _._decodedChars = t2;
+      _._cachedLine = null;
+    },
+    FileLocation: function FileLocation(t0, t1) {
+      this.file = t0;
+      this.offset = t1;
+    },
+    _FileSpan: function _FileSpan(t0, t1, t2) {
+      this.file = t0;
+      this._file$_start = t1;
+      this._end = t2;
+    },
+    SourceSpanMixin: function SourceSpanMixin() {
+    },
+    Trace_Trace$from: function(trace) {
+      if (trace == null)
+        throw H.wrapException(P.ArgumentError$("Cannot create a Trace from null."));
+      if (type$.legacy_Trace._is(trace))
+        return trace;
+      if (trace instanceof U.Chain)
+        return trace.toTrace$0();
+      return new T.LazyTrace(new Y.Trace_Trace$from_closure(trace));
+    },
+    Trace_Trace$parse: function(trace) {
+      var error, t1, exception;
+      try {
+        if (trace.length === 0) {
+          t1 = P.List_List$unmodifiable(H.setRuntimeTypeInfo([], type$.JSArray_legacy_Frame), type$.legacy_Frame);
+          return new Y.Trace(t1, new P._StringStackTrace(null));
+        }
+        if (C.JSString_methods.contains$1(trace, $.$get$_v8Trace())) {
+          t1 = Y.Trace$parseV8(trace);
+          return t1;
+        }
+        if (C.JSString_methods.contains$1(trace, "\tat ")) {
+          t1 = Y.Trace$parseJSCore(trace);
+          return t1;
+        }
+        if (C.JSString_methods.contains$1(trace, $.$get$_firefoxSafariTrace()) || C.JSString_methods.contains$1(trace, $.$get$_firefoxEvalTrace())) {
+          t1 = Y.Trace$parseFirefox(trace);
+          return t1;
+        }
+        if (C.JSString_methods.contains$1(trace, string$.x3d_____)) {
+          t1 = U.Chain_Chain$parse(trace).toTrace$0();
+          return t1;
+        }
+        if (C.JSString_methods.contains$1(trace, $.$get$_friendlyTrace())) {
+          t1 = Y.Trace$parseFriendly(trace);
+          return t1;
+        }
+        t1 = P.List_List$unmodifiable(Y.Trace__parseVM(trace), type$.legacy_Frame);
+        return new Y.Trace(t1, new P._StringStackTrace(trace));
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_FormatException._is(t1)) {
+          error = t1;
+          throw H.wrapException(P.FormatException$(H.S(J.get$message$x(error)) + "\nStack trace:\n" + H.S(trace), null, null));
+        } else
+          throw exception;
+      }
+    },
+    Trace__parseVM: function(trace) {
+      var $frames,
+        t1 = J.trim$0$s(trace),
+        t2 = $.$get$vmChainGap(),
+        t3 = type$.WhereIterable_String,
+        lines = new H.WhereIterable(H.setRuntimeTypeInfo(H.stringReplaceAllUnchecked(t1, t2, "").split("\n"), type$.JSArray_String), new Y.Trace__parseVM_closure(), t3);
+      if (!lines.get$iterator(lines).moveNext$0())
+        return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Frame);
+      t1 = H.TakeIterable_TakeIterable(lines, lines.get$length(lines) - 1, t3._eval$1("Iterable.E"));
+      t1 = H.MappedIterable_MappedIterable(t1, new Y.Trace__parseVM_closure0(), H._instanceType(t1)._eval$1("Iterable.E"), type$.legacy_Frame);
+      $frames = P.List_List$from(t1, true, H._instanceType(t1)._eval$1("Iterable.E"));
+      if (!J.endsWith$1$s(lines.get$last(lines), ".da"))
+        C.JSArray_methods.add$1($frames, A.Frame_Frame$parseVM(lines.get$last(lines)));
+      return $frames;
+    },
+    Trace$parseV8: function(trace) {
+      var t1 = H.SubListIterable$(H.setRuntimeTypeInfo(trace.split("\n"), type$.JSArray_String), 1, null, type$.String).super$Iterable$skipWhile(0, new Y.Trace$parseV8_closure()),
+        t2 = type$.legacy_Frame;
+      return new Y.Trace(P.List_List$unmodifiable(H.MappedIterable_MappedIterable(t1, new Y.Trace$parseV8_closure0(), t1.$ti._eval$1("Iterable.E"), t2), t2), new P._StringStackTrace(trace));
+    },
+    Trace$parseJSCore: function(trace) {
+      return new Y.Trace(P.List_List$unmodifiable(new H.MappedIterable(new H.WhereIterable(H.setRuntimeTypeInfo(trace.split("\n"), type$.JSArray_String), new Y.Trace$parseJSCore_closure(), type$.WhereIterable_String), new Y.Trace$parseJSCore_closure0(), type$.MappedIterable_of_String_and_legacy_Frame), type$.legacy_Frame), new P._StringStackTrace(trace));
+    },
+    Trace$parseFirefox: function(trace) {
+      return new Y.Trace(P.List_List$unmodifiable(new H.MappedIterable(new H.WhereIterable(H.setRuntimeTypeInfo(C.JSString_methods.trim$0(trace).split("\n"), type$.JSArray_String), new Y.Trace$parseFirefox_closure(), type$.WhereIterable_String), new Y.Trace$parseFirefox_closure0(), type$.MappedIterable_of_String_and_legacy_Frame), type$.legacy_Frame), new P._StringStackTrace(trace));
+    },
+    Trace$parseFriendly: function(trace) {
+      var t1 = trace.length === 0 ? H.setRuntimeTypeInfo([], type$.JSArray_legacy_Frame) : new H.MappedIterable(new H.WhereIterable(H.setRuntimeTypeInfo(C.JSString_methods.trim$0(trace).split("\n"), type$.JSArray_String), new Y.Trace$parseFriendly_closure(), type$.WhereIterable_String), new Y.Trace$parseFriendly_closure0(), type$.MappedIterable_of_String_and_legacy_Frame);
+      return new Y.Trace(P.List_List$unmodifiable(t1, type$.legacy_Frame), new P._StringStackTrace(trace));
+    },
+    Trace: function Trace(t0, t1) {
+      this.frames = t0;
+      this.original = t1;
+    },
+    Trace_Trace$from_closure: function Trace_Trace$from_closure(t0) {
+      this.trace = t0;
+    },
+    Trace__parseVM_closure: function Trace__parseVM_closure() {
+    },
+    Trace__parseVM_closure0: function Trace__parseVM_closure0() {
+    },
+    Trace$parseV8_closure: function Trace$parseV8_closure() {
+    },
+    Trace$parseV8_closure0: function Trace$parseV8_closure0() {
+    },
+    Trace$parseJSCore_closure: function Trace$parseJSCore_closure() {
+    },
+    Trace$parseJSCore_closure0: function Trace$parseJSCore_closure0() {
+    },
+    Trace$parseFirefox_closure: function Trace$parseFirefox_closure() {
+    },
+    Trace$parseFirefox_closure0: function Trace$parseFirefox_closure0() {
+    },
+    Trace$parseFriendly_closure: function Trace$parseFriendly_closure() {
+    },
+    Trace$parseFriendly_closure0: function Trace$parseFriendly_closure0() {
+    },
+    Trace_terse_closure: function Trace_terse_closure() {
+    },
+    Trace_foldFrames_closure: function Trace_foldFrames_closure(t0) {
+      this.oldPredicate = t0;
+    },
+    Trace_foldFrames_closure0: function Trace_foldFrames_closure0(t0) {
+      this._box_0 = t0;
+    },
+    Trace_toString_closure0: function Trace_toString_closure0() {
+    },
+    Trace_toString_closure: function Trace_toString_closure(t0) {
+      this.longest = t0;
+    },
+    SupportsAnything0: function SupportsAnything0(t0, t1) {
+      this.contents = t0;
+      this.span = t1;
+    },
+    Chokidar0: function Chokidar0() {
+    },
+    ChokidarOptions0: function ChokidarOptions0() {
+    },
+    ChokidarWatcher0: function ChokidarWatcher0() {
+    },
+    ContentBlock$0: function($arguments, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new Y.ContentBlock0(null, $arguments, span, t1, t2);
+    },
+    ContentBlock0: function ContentBlock0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.$arguments = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    unifyComplex0: function(complexes) {
+      var t2, unifiedBase, base, t3, t4, _i, complexesWithoutBases,
+        t1 = J.getInterceptor$asx(complexes);
+      if (t1.get$length(complexes) === 1)
+        return complexes;
+      for (t2 = t1.get$iterator(complexes), unifiedBase = null; t2.moveNext$0();) {
+        base = J.get$last$ax(t2.get$current(t2));
+        if (base instanceof X.CompoundSelector0)
+          if (unifiedBase == null)
+            unifiedBase = base.components;
+          else
+            for (t3 = base.components, t4 = t3.length, _i = 0; _i < t4; ++_i) {
+              unifiedBase = t3[_i].unify$1(unifiedBase);
+              if (unifiedBase == null)
+                return null;
+            }
+        else
+          return null;
+      }
+      t1 = t1.map$1$1(complexes, new Y.unifyComplex_closure0(), type$.legacy_List_legacy_ComplexSelectorComponent_2);
+      complexesWithoutBases = P.List_List$from(t1, true, t1.$ti._eval$1("ListIterable.E"));
+      J.add$1$ax(C.JSArray_methods.get$last(complexesWithoutBases), X.CompoundSelector$0(unifiedBase));
+      return Y.weave0(complexesWithoutBases);
+    },
+    unifyCompound0: function(compound1, compound2) {
+      var t1, result, _i;
+      for (t1 = compound1.length, result = compound2, _i = 0; _i < t1; ++_i) {
+        result = compound1[_i].unify$1(result);
+        if (result == null)
+          return null;
+      }
+      return X.CompoundSelector$0(result);
+    },
+    unifyUniversalAndElement0: function(selector1, selector2) {
+      var namespace1, name1, t1, namespace2, name2, namespace, $name, _null = null,
+        _s45_ = string$.must_b;
+      if (selector1 instanceof N.UniversalSelector0) {
+        namespace1 = selector1.namespace;
+        name1 = _null;
+      } else if (selector1 instanceof F.TypeSelector0) {
+        t1 = selector1.name;
+        namespace1 = t1.namespace;
+        name1 = t1.name;
+      } else
+        throw H.wrapException(P.ArgumentError$value(selector1, "selector1", _s45_));
+      if (selector2 instanceof N.UniversalSelector0) {
+        namespace2 = selector2.namespace;
+        name2 = _null;
+      } else if (selector2 instanceof F.TypeSelector0) {
+        t1 = selector2.name;
+        namespace2 = t1.namespace;
+        name2 = t1.name;
+      } else
+        throw H.wrapException(P.ArgumentError$value(selector2, "selector2", _s45_));
+      if (namespace1 == namespace2 || namespace2 === "*")
+        namespace = namespace1;
+      else {
+        if (namespace1 !== "*")
+          return _null;
+        namespace = namespace2;
+      }
+      if (name1 == name2 || name2 == null)
+        $name = name1;
+      else {
+        if (!(name1 == null || name1 === "*"))
+          return _null;
+        $name = name2;
+      }
+      return $name == null ? new N.UniversalSelector0(namespace) : new F.TypeSelector0(new D.QualifiedName0($name, namespace));
+    },
+    weave0: function(complexes) {
+      var t2, cur, t3, target, _i, parents, newPrefixes, parentPrefixes, t4, t5,
+        t1 = type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2,
+        prefixes = H.setRuntimeTypeInfo([J.toList$0$ax(C.JSArray_methods.get$first(complexes))], t1);
+      for (t2 = H.SubListIterable$(complexes, 1, null, H._arrayInstanceType(complexes)._precomputed1), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t3 = J.getInterceptor$asx(cur);
+        if (t3.get$isEmpty(cur))
+          continue;
+        target = t3.get$last(cur);
+        if (t3.get$length(cur) === 1) {
+          for (t3 = prefixes.length, _i = 0; _i < prefixes.length; prefixes.length === t3 || (0, H.throwConcurrentModificationError)(prefixes), ++_i)
+            J.add$1$ax(prefixes[_i], target);
+          continue;
+        }
+        parents = t3.take$1(cur, t3.get$length(cur) - 1).toList$0(0);
+        newPrefixes = H.setRuntimeTypeInfo([], t1);
+        for (t3 = prefixes.length, _i = 0; _i < prefixes.length; prefixes.length === t3 || (0, H.throwConcurrentModificationError)(prefixes), ++_i) {
+          parentPrefixes = Y._weaveParents0(prefixes[_i], parents);
+          if (parentPrefixes == null)
+            continue;
+          for (t4 = parentPrefixes.get$iterator(parentPrefixes); t4.moveNext$0();) {
+            t5 = t4.get$current(t4);
+            J.add$1$ax(t5, target);
+            newPrefixes.push(t5);
+          }
+        }
+        prefixes = newPrefixes;
+      }
+      return prefixes;
+    },
+    _weaveParents0: function(parents1, parents2) {
+      var finalCombinators, root1, root2, root, groups1, groups2, lcs, t2, choices, t3, _i, group, t4, t5, _null = null,
+        t1 = type$.legacy_ComplexSelectorComponent_2,
+        queue1 = P.ListQueue_ListQueue$of(parents1, t1),
+        queue2 = P.ListQueue_ListQueue$of(parents2, t1),
+        initialCombinators = Y._mergeInitialCombinators0(queue1, queue2);
+      if (initialCombinators == null)
+        return _null;
+      finalCombinators = Y._mergeFinalCombinators0(queue1, queue2, _null);
+      if (finalCombinators == null)
+        return _null;
+      root1 = Y._firstIfRoot0(queue1);
+      root2 = Y._firstIfRoot0(queue2);
+      t1 = root1 != null;
+      if (t1 && root2 != null) {
+        root = Y.unifyCompound0(root1.components, root2.components);
+        if (root == null)
+          return _null;
+        queue1.addFirst$1(root);
+        queue2.addFirst$1(root);
+      } else if (t1)
+        queue2.addFirst$1(root1);
+      else if (root2 != null)
+        queue1.addFirst$1(root2);
+      groups1 = Y._groupSelectors0(queue1);
+      groups2 = Y._groupSelectors0(queue2);
+      t1 = type$.legacy_List_legacy_ComplexSelectorComponent_2;
+      lcs = B.longestCommonSubsequence0(groups2, groups1, new Y._weaveParents_closure6(), t1);
+      t2 = type$.JSArray_legacy_Iterable_legacy_ComplexSelectorComponent_2;
+      choices = H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([initialCombinators], t2)], type$.JSArray_legacy_List_legacy_Iterable_legacy_ComplexSelectorComponent_2);
+      for (t3 = lcs.length, _i = 0; _i < lcs.length; lcs.length === t3 || (0, H.throwConcurrentModificationError)(lcs), ++_i) {
+        group = lcs[_i];
+        t4 = Y._chunks0(groups1, groups2, new Y._weaveParents_closure7(group), t1);
+        t5 = H._arrayInstanceType(t4)._eval$1("MappedListIterable<1,Iterable<ComplexSelectorComponent0*>*>");
+        choices.push(P.List_List$from(new H.MappedListIterable(t4, new Y._weaveParents_closure8(), t5), true, t5._eval$1("ListIterable.E")));
+        choices.push(H.setRuntimeTypeInfo([group], t2));
+        groups1.removeFirst$0();
+        groups2.removeFirst$0();
+      }
+      t2 = Y._chunks0(groups1, groups2, new Y._weaveParents_closure9(), t1);
+      t3 = H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Iterable<ComplexSelectorComponent0*>*>");
+      choices.push(P.List_List$from(new H.MappedListIterable(t2, new Y._weaveParents_closure10(), t3), true, t3._eval$1("ListIterable.E")));
+      C.JSArray_methods.addAll$1(choices, finalCombinators);
+      return J.map$1$1$ax(Y.paths0(new H.WhereIterable(choices, new Y._weaveParents_closure11(), type$.WhereIterable_legacy_List_legacy_Iterable_legacy_ComplexSelectorComponent_2), type$.legacy_Iterable_legacy_ComplexSelectorComponent_2), new Y._weaveParents_closure12(), t1);
+    },
+    _firstIfRoot0: function(queue) {
+      var first;
+      if (queue._collection$_head === queue._collection$_tail)
+        return null;
+      first = queue.get$first(queue);
+      if (first instanceof X.CompoundSelector0) {
+        if (!Y._hasRoot0(first))
+          return null;
+        queue.removeFirst$0();
+        return first;
+      } else
+        return null;
+    },
+    _mergeInitialCombinators0: function(components1, components2) {
+      var t3, combinators2, lcs,
+        t1 = type$.JSArray_legacy_Combinator_2,
+        combinators1 = H.setRuntimeTypeInfo([], t1),
+        t2 = type$.legacy_Combinator_2;
+      while (true) {
+        if (!components1.get$isEmpty(components1)) {
+          t3 = components1._collection$_head;
+          if (t3 === components1._collection$_tail)
+            H.throwExpression(H.IterableElementError_noElement());
+          t3 = components1._collection$_table[t3] instanceof S.Combinator0;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        combinators1.push(t2._as(components1.removeFirst$0()));
+      }
+      combinators2 = H.setRuntimeTypeInfo([], t1);
+      while (true) {
+        if (!components2.get$isEmpty(components2)) {
+          t1 = components2._collection$_head;
+          if (t1 === components2._collection$_tail)
+            H.throwExpression(H.IterableElementError_noElement());
+          t1 = components2._collection$_table[t1] instanceof S.Combinator0;
+        } else
+          t1 = false;
+        if (!t1)
+          break;
+        combinators2.push(t2._as(components2.removeFirst$0()));
+      }
+      lcs = B.longestCommonSubsequence0(combinators1, combinators2, null, t2);
+      if (C.C_ListEquality.equals$2(0, lcs, combinators1))
+        return combinators2;
+      if (C.C_ListEquality.equals$2(0, lcs, combinators2))
+        return combinators1;
+      return null;
+    },
+    _mergeFinalCombinators0: function(components1, components2, result) {
+      var t1, combinators1, t2, combinators2, lcs, combinator1, combinator2, compound1, compound2, choices, unified, followingSiblingSelector, nextSiblingSelector, _null = null;
+      if (result == null)
+        result = Q.QueueList$(_null, type$.legacy_List_legacy_List_legacy_ComplexSelectorComponent_2);
+      if (components1._collection$_head === components1._collection$_tail || !(components1.get$last(components1) instanceof S.Combinator0))
+        t1 = components2._collection$_head === components2._collection$_tail || !(components2.get$last(components2) instanceof S.Combinator0);
+      else
+        t1 = false;
+      if (t1)
+        return result;
+      t1 = type$.JSArray_legacy_Combinator_2;
+      combinators1 = H.setRuntimeTypeInfo([], t1);
+      t2 = type$.legacy_Combinator_2;
+      while (true) {
+        if (!(!components1.get$isEmpty(components1) && components1.get$last(components1) instanceof S.Combinator0))
+          break;
+        combinators1.push(t2._as(components1.removeLast$0(0)));
+      }
+      combinators2 = H.setRuntimeTypeInfo([], t1);
+      while (true) {
+        if (!(!components2.get$isEmpty(components2) && components2.get$last(components2) instanceof S.Combinator0))
+          break;
+        combinators2.push(t2._as(components2.removeLast$0(0)));
+      }
+      t1 = combinators1.length;
+      if (t1 > 1 || combinators2.length > 1) {
+        lcs = B.longestCommonSubsequence0(combinators1, combinators2, _null, t2);
+        if (C.C_ListEquality.equals$2(0, lcs, combinators1))
+          result.addFirst$1(H.setRuntimeTypeInfo([P.List_List$from(new H.ReversedListIterable(combinators2, type$.ReversedListIterable_legacy_Combinator_2), true, type$.legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+        else if (C.C_ListEquality.equals$2(0, lcs, combinators2))
+          result.addFirst$1(H.setRuntimeTypeInfo([P.List_List$from(new H.ReversedListIterable(combinators1, type$.ReversedListIterable_legacy_Combinator_2), true, type$.legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+        else
+          return _null;
+        return result;
+      }
+      combinator1 = t1 === 0 ? _null : C.JSArray_methods.get$first(combinators1);
+      combinator2 = combinators2.length === 0 ? _null : C.JSArray_methods.get$first(combinators2);
+      t1 = combinator1 != null;
+      if (t1 && combinator2 != null) {
+        t1 = type$.legacy_CompoundSelector_2;
+        compound1 = t1._as(components1.removeLast$0(0));
+        compound2 = t1._as(components2.removeLast$0(0));
+        t1 = combinator1 === C.Combinator_CzM0;
+        if (t1 && combinator2 === C.Combinator_CzM0) {
+          compound1.toString;
+          if (Y.compoundIsSuperselector0(compound1, compound2, _null))
+            result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound2, C.Combinator_CzM0], type$.JSArray_legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+          else {
+            compound2.toString;
+            t1 = type$.JSArray_legacy_ComplexSelectorComponent_2;
+            t2 = type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2;
+            if (Y.compoundIsSuperselector0(compound2, compound1, _null))
+              result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound1, C.Combinator_CzM0], t1)], t2));
+            else {
+              choices = H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound1, C.Combinator_CzM0, compound2, C.Combinator_CzM0], t1), H.setRuntimeTypeInfo([compound2, C.Combinator_CzM0, compound1, C.Combinator_CzM0], t1)], t2);
+              unified = Y.unifyCompound0(compound1.components, compound2.components);
+              if (unified != null)
+                choices.push(H.setRuntimeTypeInfo([unified, C.Combinator_CzM0], t1));
+              result.addFirst$1(choices);
+            }
+          }
+        } else {
+          if (!(t1 && combinator2 === C.Combinator_uzg0))
+            t2 = combinator1 === C.Combinator_uzg0 && combinator2 === C.Combinator_CzM0;
+          else
+            t2 = true;
+          if (t2) {
+            followingSiblingSelector = t1 ? compound1 : compound2;
+            nextSiblingSelector = t1 ? compound2 : compound1;
+            followingSiblingSelector.toString;
+            t1 = type$.JSArray_legacy_ComplexSelectorComponent_2;
+            t2 = type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2;
+            if (Y.compoundIsSuperselector0(followingSiblingSelector, nextSiblingSelector, _null))
+              result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([nextSiblingSelector, C.Combinator_uzg0], t1)], t2));
+            else {
+              unified = Y.unifyCompound0(compound1.components, compound2.components);
+              t2 = H.setRuntimeTypeInfo([], t2);
+              t2.push(H.setRuntimeTypeInfo([followingSiblingSelector, C.Combinator_CzM0, nextSiblingSelector, C.Combinator_uzg0], t1));
+              if (unified != null)
+                t2.push(H.setRuntimeTypeInfo([unified, C.Combinator_uzg0], t1));
+              result.addFirst$1(t2);
+            }
+          } else {
+            if (combinator1 === C.Combinator_sgq0)
+              t2 = combinator2 === C.Combinator_uzg0 || combinator2 === C.Combinator_CzM0;
+            else
+              t2 = false;
+            if (t2) {
+              result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound2, combinator2], type$.JSArray_legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+              components1._add$1(compound1);
+              components1._add$1(C.Combinator_sgq0);
+            } else {
+              if (combinator2 === C.Combinator_sgq0)
+                t1 = combinator1 === C.Combinator_uzg0 || t1;
+              else
+                t1 = false;
+              if (t1) {
+                result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([compound1, combinator1], type$.JSArray_legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+                components2._add$1(compound2);
+                components2._add$1(C.Combinator_sgq0);
+              } else if (combinator1 === combinator2) {
+                unified = Y.unifyCompound0(compound1.components, compound2.components);
+                if (unified == null)
+                  return _null;
+                result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([unified, combinator1], type$.JSArray_legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+              } else
+                return _null;
+            }
+          }
+        }
+        return Y._mergeFinalCombinators0(components1, components2, result);
+      } else if (t1) {
+        if (combinator1 === C.Combinator_sgq0)
+          if (!components2.get$isEmpty(components2)) {
+            t1 = type$.legacy_CompoundSelector_2;
+            t2 = t1._as(components2.get$last(components2));
+            t1 = t1._as(components1.get$last(components1));
+            t2.toString;
+            t1 = Y.compoundIsSuperselector0(t2, t1, _null);
+          } else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          components2.removeLast$0(0);
+        result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([components1.removeLast$0(0), combinator1], type$.JSArray_legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+        return Y._mergeFinalCombinators0(components1, components2, result);
+      } else {
+        if (combinator2 === C.Combinator_sgq0)
+          if (!components1.get$isEmpty(components1)) {
+            t1 = type$.legacy_CompoundSelector_2;
+            t2 = t1._as(components1.get$last(components1));
+            t1 = t1._as(components2.get$last(components2));
+            t2.toString;
+            t1 = Y.compoundIsSuperselector0(t2, t1, _null);
+          } else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          components1.removeLast$0(0);
+        result.addFirst$1(H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([components2.removeLast$0(0), combinator2], type$.JSArray_legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+        return Y._mergeFinalCombinators0(components1, components2, result);
+      }
+    },
+    _mustUnify0: function(complex1, complex2) {
+      var t2, t3, t4,
+        t1 = P.LinkedHashSet_LinkedHashSet(type$.legacy_SimpleSelector_2);
+      for (t2 = J.get$iterator$ax(complex1); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        if (t3 instanceof X.CompoundSelector0)
+          for (t3 = C.JSArray_methods.get$iterator(t3.components), t4 = new H.WhereIterator(t3, Y.functions0___isUnique$closure()); t4.moveNext$0();)
+            t1.add$1(0, t3.get$current(t3));
+      }
+      if (t1._collection$_length === 0)
+        return false;
+      return J.any$1$ax(complex2, new Y._mustUnify_closure0(t1));
+    },
+    _isUnique0: function(simple) {
+      var t1;
+      if (!(simple instanceof N.IDSelector0))
+        t1 = simple instanceof D.PseudoSelector0 && !simple.isClass;
+      else
+        t1 = true;
+      return t1;
+    },
+    _chunks0: function(queue1, queue2, done, $T) {
+      var chunk2, t2, t3, _i,
+        t1 = $T._eval$1("JSArray<0*>"),
+        chunk1 = H.setRuntimeTypeInfo([], t1);
+      for (; !done.call$1(queue1);)
+        chunk1.push(queue1.removeFirst$0());
+      chunk2 = H.setRuntimeTypeInfo([], t1);
+      for (; !done.call$1(queue2);)
+        chunk2.push(queue2.removeFirst$0());
+      t2 = chunk1.length === 0;
+      if (t2 && chunk2.length === 0)
+        return H.setRuntimeTypeInfo([], $T._eval$1("JSArray<List<0*>*>"));
+      if (t2)
+        return H.setRuntimeTypeInfo([chunk2], $T._eval$1("JSArray<List<0*>*>"));
+      if (chunk2.length === 0)
+        return H.setRuntimeTypeInfo([chunk1], $T._eval$1("JSArray<List<0*>*>"));
+      t2 = H.setRuntimeTypeInfo([], t1);
+      for (t3 = chunk1.length, _i = 0; _i < chunk1.length; chunk1.length === t3 || (0, H.throwConcurrentModificationError)(chunk1), ++_i)
+        t2.push(chunk1[_i]);
+      for (t3 = chunk2.length, _i = 0; _i < chunk2.length; chunk2.length === t3 || (0, H.throwConcurrentModificationError)(chunk2), ++_i)
+        t2.push(chunk2[_i]);
+      t1 = H.setRuntimeTypeInfo([], t1);
+      for (t3 = chunk2.length, _i = 0; _i < chunk2.length; chunk2.length === t3 || (0, H.throwConcurrentModificationError)(chunk2), ++_i)
+        t1.push(chunk2[_i]);
+      for (t3 = chunk1.length, _i = 0; _i < chunk1.length; chunk1.length === t3 || (0, H.throwConcurrentModificationError)(chunk1), ++_i)
+        t1.push(chunk1[_i]);
+      return H.setRuntimeTypeInfo([t2, t1], $T._eval$1("JSArray<List<0*>*>"));
+    },
+    paths0: function(choices, $T) {
+      return J.fold$2$ax(choices, H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([], $T._eval$1("JSArray<0*>"))], $T._eval$1("JSArray<List<0*>*>")), new Y.paths_closure0($T));
+    },
+    _groupSelectors0: function(complex) {
+      var t1, group, cur, t2,
+        groups = Q.QueueList$(null, type$.legacy_List_legacy_ComplexSelectorComponent_2),
+        iterator = P._ListQueueIterator$(complex);
+      if (!iterator.moveNext$0())
+        return groups;
+      t1 = type$.JSArray_legacy_ComplexSelectorComponent_2;
+      group = H.setRuntimeTypeInfo([iterator.get$current(iterator)], t1);
+      groups._queue_list$_add$1(group);
+      for (; iterator.moveNext$0();) {
+        if (!(C.JSArray_methods.get$last(group) instanceof S.Combinator0)) {
+          cur = iterator._collection$_current;
+          t2 = cur instanceof S.Combinator0;
+        } else
+          t2 = true;
+        cur = iterator._collection$_current;
+        if (t2)
+          group.push(cur);
+        else {
+          group = H.setRuntimeTypeInfo([cur], t1);
+          groups._queue_list$_add$1(group);
+        }
+      }
+      return groups;
+    },
+    _hasRoot0: function(compound) {
+      return C.JSArray_methods.any$1(compound.components, new Y._hasRoot_closure0());
+    },
+    listIsSuperselector0: function(list1, list2) {
+      return C.JSArray_methods.every$1(list2, new Y.listIsSuperselector_closure0(list1));
+    },
+    complexIsParentSuperselector0: function(complex1, complex2) {
+      var t2, base, t3, t4,
+        t1 = J.getInterceptor$ax(complex1);
+      if (t1.get$first(complex1) instanceof S.Combinator0)
+        return false;
+      t2 = J.getInterceptor$ax(complex2);
+      if (t2.get$first(complex2) instanceof S.Combinator0)
+        return false;
+      if (t1.get$length(complex1) > t2.get$length(complex2))
+        return false;
+      base = X.CompoundSelector$0(H.setRuntimeTypeInfo([new N.PlaceholderSelector0("<temp>")], type$.JSArray_legacy_SimpleSelector_2));
+      t3 = type$.JSArray_legacy_ComplexSelectorComponent_2;
+      t4 = H.setRuntimeTypeInfo([], t3);
+      for (t1 = t1.get$iterator(complex1); t1.moveNext$0();)
+        t4.push(t1.get$current(t1));
+      t4.push(base);
+      t1 = H.setRuntimeTypeInfo([], t3);
+      for (t2 = t2.get$iterator(complex2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      t1.push(base);
+      return Y.complexIsSuperselector0(t4, t1);
+    },
+    complexIsSuperselector0: function(complex1, complex2) {
+      var t1, t2, t3, i1, i2, remaining1, remaining2, t4, t5, t6, t7, afterSuperselector, afterSuperselector0, compound2, i10, combinator1, combinator2;
+      if (C.JSArray_methods.get$last(complex1) instanceof S.Combinator0)
+        return false;
+      if (C.JSArray_methods.get$last(complex2) instanceof S.Combinator0)
+        return false;
+      for (t1 = H._arrayInstanceType(complex2), t2 = t1._precomputed1, t1 = t1._eval$1("SubListIterable<1>"), t3 = type$.legacy_CompoundSelector_2, i1 = 0, i2 = 0; true;) {
+        remaining1 = complex1.length - i1;
+        remaining2 = complex2.length - i2;
+        if (remaining1 === 0 || remaining2 === 0)
+          return false;
+        if (remaining1 > remaining2)
+          return false;
+        t4 = complex1[i1];
+        if (t4 instanceof S.Combinator0)
+          return false;
+        if (complex2[i2] instanceof S.Combinator0)
+          return false;
+        t3._as(t4);
+        if (remaining1 === 1) {
+          t5 = t3._as(C.JSArray_methods.get$last(complex2));
+          t6 = complex2.length - 1;
+          t7 = new H.SubListIterable(complex2, 0, t6, t1);
+          t7.SubListIterable$3(complex2, 0, t6, t2);
+          return Y.compoundIsSuperselector0(t4, t5, t7.skip$1(0, i2));
+        }
+        afterSuperselector = i2 + 1;
+        for (afterSuperselector0 = afterSuperselector; afterSuperselector0 < complex2.length; ++afterSuperselector0) {
+          t5 = afterSuperselector0 - 1;
+          compound2 = complex2[t5];
+          if (compound2 instanceof X.CompoundSelector0) {
+            t6 = new H.SubListIterable(complex2, 0, t5, t1);
+            t6.SubListIterable$3(complex2, 0, t5, t2);
+            if (Y.compoundIsSuperselector0(t4, compound2, t6.skip$1(0, afterSuperselector)))
+              break;
+          }
+        }
+        if (afterSuperselector0 === complex2.length)
+          return false;
+        i10 = i1 + 1;
+        combinator1 = complex1[i10];
+        combinator2 = complex2[afterSuperselector0];
+        if (combinator1 instanceof S.Combinator0) {
+          if (!(combinator2 instanceof S.Combinator0))
+            return false;
+          if (combinator1 === C.Combinator_CzM0) {
+            if (combinator2 === C.Combinator_sgq0)
+              return false;
+          } else if (combinator2 !== combinator1)
+            return false;
+          if (remaining1 === 3 && remaining2 > 3)
+            return false;
+          i1 += 2;
+          i2 = afterSuperselector0 + 1;
+        } else {
+          if (combinator2 instanceof S.Combinator0) {
+            if (combinator2 !== C.Combinator_sgq0)
+              return false;
+            i2 = afterSuperselector0 + 1;
+          } else
+            i2 = afterSuperselector0;
+          i1 = i10;
+        }
+      }
+    },
+    compoundIsSuperselector0: function(compound1, compound2, parents) {
+      var t1, t2, _i, simple1, simple2;
+      for (t1 = compound1.components, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        simple1 = t1[_i];
+        if (simple1 instanceof D.PseudoSelector0 && simple1.selector != null) {
+          if (!Y._selectorPseudoIsSuperselector0(simple1, compound2, parents))
+            return false;
+        } else if (!Y._simpleIsSuperselectorOfCompound0(simple1, compound2))
+          return false;
+      }
+      for (t1 = compound2.components, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        simple2 = t1[_i];
+        if (simple2 instanceof D.PseudoSelector0 && !simple2.isClass && simple2.selector == null && !Y._simpleIsSuperselectorOfCompound0(simple2, compound1))
+          return false;
+      }
+      return true;
+    },
+    _simpleIsSuperselectorOfCompound0: function(simple, compound) {
+      return C.JSArray_methods.any$1(compound.components, new Y._simpleIsSuperselectorOfCompound_closure0(simple));
+    },
+    _selectorPseudoIsSuperselector0: function(pseudo1, compound2, parents) {
+      switch (pseudo1.normalizedName) {
+        case "matches":
+        case "any":
+          return Y._selectorPseudosNamed0(compound2, pseudo1.name, true).any$1(0, new Y._selectorPseudoIsSuperselector_closure6(pseudo1)) || C.JSArray_methods.any$1(pseudo1.selector.components, new Y._selectorPseudoIsSuperselector_closure7(parents, compound2));
+        case "has":
+        case "host":
+        case "host-context":
+          return Y._selectorPseudosNamed0(compound2, pseudo1.name, true).any$1(0, new Y._selectorPseudoIsSuperselector_closure8(pseudo1));
+        case "slotted":
+          return Y._selectorPseudosNamed0(compound2, pseudo1.name, false).any$1(0, new Y._selectorPseudoIsSuperselector_closure9(pseudo1));
+        case "not":
+          return C.JSArray_methods.every$1(pseudo1.selector.components, new Y._selectorPseudoIsSuperselector_closure10(compound2, pseudo1));
+        case "current":
+          return Y._selectorPseudosNamed0(compound2, pseudo1.name, true).any$1(0, new Y._selectorPseudoIsSuperselector_closure11(pseudo1));
+        case "nth-child":
+        case "nth-last-child":
+          return C.JSArray_methods.any$1(compound2.components, new Y._selectorPseudoIsSuperselector_closure12(pseudo1));
+        default:
+          throw H.wrapException("unreachable");
+      }
+    },
+    _selectorPseudosNamed0: function(compound, $name, isClass) {
+      var t1 = type$.WhereTypeIterable_legacy_PseudoSelector_2;
+      return new H.WhereIterable(new H.WhereTypeIterable(compound.components, t1), new Y._selectorPseudosNamed_closure0(isClass, $name), t1._eval$1("WhereIterable<Iterable.E>"));
+    },
+    unifyComplex_closure0: function unifyComplex_closure0() {
+    },
+    _weaveParents_closure6: function _weaveParents_closure6() {
+    },
+    _weaveParents_closure7: function _weaveParents_closure7(t0) {
+      this.group = t0;
+    },
+    _weaveParents_closure8: function _weaveParents_closure8() {
+    },
+    _weaveParents__closure4: function _weaveParents__closure4() {
+    },
+    _weaveParents_closure9: function _weaveParents_closure9() {
+    },
+    _weaveParents_closure10: function _weaveParents_closure10() {
+    },
+    _weaveParents__closure3: function _weaveParents__closure3() {
+    },
+    _weaveParents_closure11: function _weaveParents_closure11() {
+    },
+    _weaveParents_closure12: function _weaveParents_closure12() {
+    },
+    _weaveParents__closure2: function _weaveParents__closure2() {
+    },
+    _mustUnify_closure0: function _mustUnify_closure0(t0) {
+      this.uniqueSelectors = t0;
+    },
+    _mustUnify__closure0: function _mustUnify__closure0(t0) {
+      this.uniqueSelectors = t0;
+    },
+    paths_closure0: function paths_closure0(t0) {
+      this.T = t0;
+    },
+    paths__closure0: function paths__closure0(t0, t1) {
+      this.paths = t0;
+      this.T = t1;
+    },
+    paths___closure0: function paths___closure0(t0, t1) {
+      this.option = t0;
+      this.T = t1;
+    },
+    _hasRoot_closure0: function _hasRoot_closure0() {
+    },
+    listIsSuperselector_closure0: function listIsSuperselector_closure0(t0) {
+      this.list1 = t0;
+    },
+    listIsSuperselector__closure0: function listIsSuperselector__closure0(t0) {
+      this.complex1 = t0;
+    },
+    _simpleIsSuperselectorOfCompound_closure0: function _simpleIsSuperselectorOfCompound_closure0(t0) {
+      this.simple = t0;
+    },
+    _simpleIsSuperselectorOfCompound__closure0: function _simpleIsSuperselectorOfCompound__closure0(t0) {
+      this.simple = t0;
+    },
+    _selectorPseudoIsSuperselector_closure6: function _selectorPseudoIsSuperselector_closure6(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure7: function _selectorPseudoIsSuperselector_closure7(t0, t1) {
+      this.parents = t0;
+      this.compound2 = t1;
+    },
+    _selectorPseudoIsSuperselector_closure8: function _selectorPseudoIsSuperselector_closure8(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure9: function _selectorPseudoIsSuperselector_closure9(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure10: function _selectorPseudoIsSuperselector_closure10(t0, t1) {
+      this.compound2 = t0;
+      this.pseudo1 = t1;
+    },
+    _selectorPseudoIsSuperselector__closure0: function _selectorPseudoIsSuperselector__closure0(t0, t1) {
+      this.complex = t0;
+      this.pseudo1 = t1;
+    },
+    _selectorPseudoIsSuperselector___closure1: function _selectorPseudoIsSuperselector___closure1(t0) {
+      this.simple2 = t0;
+    },
+    _selectorPseudoIsSuperselector___closure2: function _selectorPseudoIsSuperselector___closure2(t0) {
+      this.simple2 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure11: function _selectorPseudoIsSuperselector_closure11(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudoIsSuperselector_closure12: function _selectorPseudoIsSuperselector_closure12(t0) {
+      this.pseudo1 = t0;
+    },
+    _selectorPseudosNamed_closure0: function _selectorPseudosNamed_closure0(t0, t1) {
+      this.isClass = t0;
+      this.name = t1;
+    },
+    closure114: function closure114() {
+    },
+    WarnRule0: function WarnRule0(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    mergeMaps: function(map1, map2, $K, $V) {
+      var result = P.LinkedHashMap_LinkedHashMap$from(map1, $K._eval$1("0*"), $V._eval$1("0*"));
+      result.addAll$1(0, map2);
+      return result;
+    },
+    groupBy: function(values, key, $S, $T) {
+      var t1, t2, _i, element, t3, t4,
+        map = P.LinkedHashMap_LinkedHashMap$_empty($T._eval$1("0*"), $S._eval$1("List<0*>*"));
+      for (t1 = values.length, t2 = $S._eval$1("JSArray<0*>"), _i = 0; _i < values.length; values.length === t1 || (0, H.throwConcurrentModificationError)(values), ++_i) {
+        element = values[_i];
+        t3 = key.call$1(element);
+        t4 = map.$index(0, t3);
+        if (t4 == null) {
+          t4 = H.setRuntimeTypeInfo([], t2);
+          map.$indexSet(0, t3, t4);
+          t3 = t4;
+        } else
+          t3 = t4;
+        t3.push(element);
+      }
+      return map;
+    },
+    minBy: function(values, orderBy, $S, $T) {
+      var t1, minValue, minOrderBy, cur, elementOrderBy,
+        compare = B.defaultCompare($T._eval$1("0*"));
+      for (t1 = new H.MappedIterator(J.get$iterator$ax(values.__internal$_iterable), values._f), minValue = null, minOrderBy = null; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        elementOrderBy = orderBy.call$1(cur);
+        if (minOrderBy == null || compare.call$2(elementOrderBy, minOrderBy) < 0) {
+          minOrderBy = elementOrderBy;
+          minValue = cur;
+        }
+      }
+      return minValue;
+    },
+    repl: function(options) {
+      return Y.repl$body(options);
+    },
+    repl$body: function(options) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$handler = 1, $async$currentError, $async$next = [], repl, logger, evaluator, line, declaration, error, stackTrace, t4, t5, t6, t7, t8, line0, toZone, exception, t1, t2, t3, repl0;
+      var $async$repl = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+              t2 = C.JSString_methods.$mul(" ", 3);
+              t3 = $.$get$alwaysValid();
+              repl0 = new Q.Repl(">> ", t2, t3, t1);
+              repl0._adapter = new B.ReplAdapter(repl0);
+              repl = repl0;
+              t1 = options._options;
+              logger = new T.TrackingLogger(H._asBoolS(t1.$index(0, "quiet")) ? $.$get$Logger_quiet() : new S.StderrLogger(options.get$color()));
+              t2 = D.absolute(".");
+              evaluator = new R.Evaluator(R._EvaluateVisitor$(null, R.ImportCache$(C.List_empty10, type$.legacy_List_legacy_String._as(t1.$index(0, "load-path")), logger), logger, null, false), new F.FilesystemImporter(t2));
+              t2 = repl._adapter.runAsync$0();
+              t1 = new P._StreamIterator(t2);
+              P.ArgumentError_checkNotNull(t2, "stream");
+              $async$handler = 2;
+              t2 = type$.legacy_Expression, t3 = type$.legacy_String, t4 = type$.legacy_VariableDeclaration;
+            case 5:
+              // for condition
+              $async$goto = 7;
+              return P._asyncAwait(t1.moveNext$0(), $async$repl);
+            case 7:
+              // returning from await.
+              if (!$async$result) {
+                // goto after for
+                $async$goto = 6;
+                break;
+              }
+              line = t1.get$current(t1);
+              if (J.trim$0$s(line).length === 0) {
+                // goto for condition
+                $async$goto = 5;
+                break;
+              }
+              try {
+                if (J.startsWith$1$s(line, "@")) {
+                  t5 = evaluator;
+                  t6 = logger;
+                  t7 = S.SpanScanner$(line, null);
+                  if (t6 == null)
+                    t6 = C.StderrLogger_false;
+                  t6 = new L.ScssParser(P.LinkedHashMap_LinkedHashMap$_empty(t3, t4), t7, t6).parseUseRule$0();
+                  t5._visitor.runStatement$2(t5._importer, t6);
+                  // goto for condition
+                  $async$goto = 5;
+                  break;
+                }
+                t5 = S.SpanScanner$(line, null);
+                if (new G.Parser(t5, C.StderrLogger_false)._isVariableDeclarationLike$0()) {
+                  t5 = logger;
+                  t6 = S.SpanScanner$(line, null);
+                  if (t5 == null)
+                    t5 = C.StderrLogger_false;
+                  declaration = new L.ScssParser(P.LinkedHashMap_LinkedHashMap$_empty(t3, t4), t6, t5).parseVariableDeclaration$0();
+                  t5 = evaluator;
+                  t5._visitor.runStatement$2(t5._importer, declaration);
+                  t5 = evaluator;
+                  t6 = declaration.name;
+                  t7 = declaration.span;
+                  t8 = declaration.namespace;
+                  line0 = J.toString$0$(t5._visitor.runExpression$2(t5._importer, new S.VariableExpression(t8, t6, t7)));
+                  toZone = $.printToZone;
+                  if (toZone == null)
+                    H.printString(line0);
+                  else
+                    toZone.call$1(line0);
+                } else {
+                  t5 = evaluator;
+                  t6 = logger;
+                  t7 = S.SpanScanner$(line, null);
+                  if (t6 == null)
+                    t6 = C.StderrLogger_false;
+                  t6 = new L.ScssParser(P.LinkedHashMap_LinkedHashMap$_empty(t3, t4), t7, t6);
+                  t6 = t6._parseSingleProduction$1$1(t6.get$expression(), t2);
+                  line0 = J.toString$0$(t5._visitor.runExpression$2(t5._importer, t6));
+                  toZone = $.printToZone;
+                  if (toZone == null)
+                    H.printString(line0);
+                  else
+                    toZone.call$1(line0);
+                }
+              } catch (exception) {
+                t5 = H.unwrapException(exception);
+                if (t5 instanceof E.SassException) {
+                  error = t5;
+                  stackTrace = H.getTraceFromException(exception);
+                  Y._logError(error, stackTrace, line, repl, options, logger);
+                } else
+                  throw exception;
+              }
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 6:
+              // after for
+              $async$next.push(4);
+              // goto finally
+              $async$goto = 3;
+              break;
+            case 2:
+              // uncaught
+              $async$next = [1];
+            case 3:
+              // finally
+              $async$handler = 1;
+              $async$goto = 8;
+              return P._asyncAwait(t1.cancel$0(), $async$repl);
+            case 8:
+              // returning from await.
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 4:
+              // after finally
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+            case 1:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$repl, $async$completer);
+    },
+    _logError: function(error, stackTrace, line, repl, options, logger) {
+      var t1, t2, spacesBeforeError;
+      if (G.SourceSpanException.prototype.get$span.call(error).file.url == null)
+        if (!H._asBoolS(options._options.$index(0, "quiet")))
+          t1 = logger._emittedDebug || logger._emittedWarning;
+        else
+          t1 = false;
+      else
+        t1 = true;
+      if (t1) {
+        P.print(error.toString$1$color(0, options.get$color()));
+        return;
+      }
+      t1 = options.get$color() ? "\x1b[31m" : "";
+      t2 = G.SourceSpanException.prototype.get$span.call(error);
+      t2 = Y.FileLocation$_(t2.file, t2._file$_start);
+      spacesBeforeError = repl.prompt.length + t2.file.getColumn$1(t2.offset);
+      if (options.get$color()) {
+        t2 = G.SourceSpanException.prototype.get$span.call(error);
+        t2 = Y.FileLocation$_(t2.file, t2._file$_start);
+        t2 = t2.file.getColumn$1(t2.offset) < line.length;
+      } else
+        t2 = false;
+      if (t2) {
+        t1 += "\x1b[1F\x1b[" + spacesBeforeError + "C";
+        t2 = G.SourceSpanException.prototype.get$span.call(error);
+        t2 = t1 + (P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t2.file._decodedChars, t2._file$_start, t2._end), 0, null) + "\n");
+        t1 = t2;
+      }
+      t1 += C.JSString_methods.$mul(" ", spacesBeforeError);
+      t2 = G.SourceSpanException.prototype.get$span.call(error);
+      t2 = t1 + (C.JSString_methods.$mul("^", Math.max(1, t2._end - t2._file$_start)) + "\n");
+      t1 = options.get$color() ? t2 + "\x1b[0m" : t2;
+      t1 += "Error: " + H.S(error._span_exception$_message) + "\n";
+      if (H._asBoolS(options._options.$index(0, "trace")))
+        t1 += Y.Trace_Trace$from(stackTrace).get$terse().toString$0(0);
+      P.print(C.JSString_methods.trimRight$0(t1.charCodeAt(0) == 0 ? t1 : t1));
+    }
+  },
+  L = {StreamGroup: function StreamGroup(t0, t1, t2) {
+      var _ = this;
+      _._controller = null;
+      _._closed = false;
+      _._stream_group$_state = t0;
+      _._subscriptions = t1;
+      _.$ti = t2;
+    }, StreamGroup_add_closure: function StreamGroup_add_closure() {
+    }, StreamGroup_add_closure0: function StreamGroup_add_closure0(t0, t1) {
+      this.$this = t0;
+      this.stream = t1;
+    }, StreamGroup__onListen_closure: function StreamGroup__onListen_closure(t0) {
+      this.$this = t0;
+    }, StreamGroup__onCancel_closure: function StreamGroup__onCancel_closure(t0) {
+      this.$this = t0;
+    }, StreamGroup__onCancel_closure0: function StreamGroup__onCancel_closure0() {
+    }, StreamGroup__listenToStream_closure: function StreamGroup__listenToStream_closure(t0, t1) {
+      this.$this = t0;
+      this.stream = t1;
+    }, _StreamGroupState: function _StreamGroupState(t0) {
+      this.name = t0;
+    },
+    UnmodifiableSetMixin__throw: function() {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable Set"));
+    },
+    UnmodifiableSetView: function UnmodifiableSetView(t0, t1) {
+      this._base = t0;
+      this.$ti = t1;
+    },
+    UnmodifiableSetMixin: function UnmodifiableSetMixin() {
+    },
+    _UnmodifiableSetView_DelegatingSet_UnmodifiableSetMixin: function _UnmodifiableSetView_DelegatingSet_UnmodifiableSetMixin() {
+    },
+    Immediate: function Immediate() {
+    },
+    Timeout: function Timeout() {
+    },
+    WindowsStyle: function WindowsStyle(t0, t1, t2, t3) {
+      var _ = this;
+      _.separatorPattern = t0;
+      _.needsSeparatorPattern = t1;
+      _.rootPattern = t2;
+      _.relativeRootPattern = t3;
+    },
+    WindowsStyle_absolutePathToUri_closure: function WindowsStyle_absolutePathToUri_closure() {
+    },
+    ModifiableCssDeclaration$: function($name, value, span, parsedAsCustomProperty, valueSpanForMap) {
+      var t2,
+        t1 = valueSpanForMap == null ? span : valueSpanForMap;
+      if (parsedAsCustomProperty)
+        if (!J.startsWith$1$s($name.get$value($name), "--"))
+          H.throwExpression(P.ArgumentError$(string$.parsed));
+        else {
+          t2 = value.value;
+          if (!(t2 instanceof D.SassString))
+            H.throwExpression(P.ArgumentError$(string$.If_par + value.toString$0(0) + "` of type " + J.get$runtimeType$u(t2).toString$0(0) + ")."));
+        }
+      return new L.ModifiableCssDeclaration($name, value, parsedAsCustomProperty, t1, span);
+    },
+    ModifiableCssDeclaration: function ModifiableCssDeclaration(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.value = t1;
+      _.parsedAsCustomProperty = t2;
+      _.valueSpanForMap = t3;
+      _.span = t4;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    IfExpression: function IfExpression(t0, t1) {
+      this.$arguments = t0;
+      this.span = t1;
+    },
+    Declaration$: function($name, span, children, value) {
+      var t1;
+      children = children == null ? null : P.List_List$unmodifiable(children, type$.legacy_Statement);
+      t1 = children == null ? null : C.JSArray_methods.any$1(children, new M.ParentStatement_closure());
+      if (C.JSString_methods.startsWith$1($name.get$initialPlain(), "--") && !(value instanceof D.StringExpression))
+        H.throwExpression(P.ArgumentError$(string$.Declarw + H.S(value) + "` of type " + J.get$runtimeType$u(value).toString$0(0) + ")."));
+      return new L.Declaration($name, value, span, children, t1 === true);
+    },
+    Declaration: function Declaration(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.value = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    ForwardRule: function ForwardRule(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _.url = t0;
+      _.shownMixinsAndFunctions = t1;
+      _.shownVariables = t2;
+      _.hiddenMixinsAndFunctions = t3;
+      _.hiddenVariables = t4;
+      _.prefix = t5;
+      _.configuration = t6;
+      _.span = t7;
+    },
+    LoudComment: function LoudComment(t0) {
+      this.text = t0;
+    },
+    SupportsDeclaration: function SupportsDeclaration(t0, t1, t2) {
+      this.name = t0;
+      this.value = t1;
+      this.span = t2;
+    },
+    PlainCssCallable: function PlainCssCallable(t0) {
+      this.name = t0;
+    },
+    ExtendMode: function ExtendMode(t0) {
+      this.name = t0;
+    },
+    ScssParser$: function(contents, logger, url) {
+      var t1 = S.SpanScanner$(contents, url),
+        t2 = logger == null ? C.StderrLogger_false : logger;
+      return new L.ScssParser(P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_VariableDeclaration), t1, t2);
+    },
+    ScssParser: function ScssParser(t0, t1, t2) {
+      var _ = this;
+      _._isUseAllowed = true;
+      _._stylesheet$_inMixin = false;
+      _._mixinHasContent = null;
+      _._inParentheses = _._inStyleRule = _._stylesheet$_inUnknownAtRule = _._inControlDirective = _._inContentBlock = false;
+      _._globalVariables = t0;
+      _.lastSilentComment = null;
+      _.scanner = t1;
+      _.logger = t2;
+    },
+    SingleUnitSassNumber: function SingleUnitSassNumber(t0, t1, t2) {
+      this._unit = t0;
+      this.value = t1;
+      this.asSlash = t2;
+    },
+    SingleUnitSassNumber_multiplyUnits_closure: function SingleUnitSassNumber_multiplyUnits_closure(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    SingleUnitSassNumber_multiplyUnits_closure0: function SingleUnitSassNumber_multiplyUnits_closure0(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    Entry: function Entry(t0, t1, t2) {
+      this.source = t0;
+      this.target = t1;
+      this.identifierName = t2;
+    },
+    _StreamTransformer__defaultHandleError: function(error, stackTrace, sink) {
+      sink.addError$2(error, stackTrace);
+    },
+    _StreamTransformer: function _StreamTransformer(t0, t1, t2, t3) {
+      var _ = this;
+      _._from_handlers$_handleData = t0;
+      _._from_handlers$_handleDone = t1;
+      _._from_handlers$_handleError = t2;
+      _.$ti = t3;
+    },
+    _StreamTransformer_bind_closure: function _StreamTransformer_bind_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _._box_1 = t0;
+      _.$this = t1;
+      _.values = t2;
+      _.controller = t3;
+    },
+    _StreamTransformer_bind__closure: function _StreamTransformer_bind__closure(t0, t1) {
+      this.$this = t0;
+      this.controller = t1;
+    },
+    _StreamTransformer_bind__closure1: function _StreamTransformer_bind__closure1(t0, t1) {
+      this.$this = t0;
+      this.controller = t1;
+    },
+    _StreamTransformer_bind__closure0: function _StreamTransformer_bind__closure0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.controller = t2;
+    },
+    _StreamTransformer_bind__closure2: function _StreamTransformer_bind__closure2(t0, t1) {
+      this._box_1 = t0;
+      this._box_0 = t1;
+    },
+    ModifiableCssDeclaration$0: function($name, value, span, parsedAsCustomProperty, valueSpanForMap) {
+      var t2,
+        t1 = valueSpanForMap == null ? span : valueSpanForMap;
+      if (parsedAsCustomProperty)
+        if (!J.startsWith$1$s($name.get$value($name), "--"))
+          H.throwExpression(P.ArgumentError$(string$.parsed));
+        else {
+          t2 = value.value;
+          if (!(t2 instanceof D.SassString0))
+            H.throwExpression(P.ArgumentError$(string$.If_par + value.toString$0(0) + "` of type " + J.get$runtimeType$u(t2).toString$0(0) + ")."));
+        }
+      return new L.ModifiableCssDeclaration0($name, value, parsedAsCustomProperty, t1, span);
+    },
+    ModifiableCssDeclaration0: function ModifiableCssDeclaration0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.value = t1;
+      _.parsedAsCustomProperty = t2;
+      _.valueSpanForMap = t3;
+      _.span = t4;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    Declaration$0: function($name, span, children, value) {
+      var t1;
+      children = children == null ? null : P.List_List$unmodifiable(children, type$.legacy_Statement_2);
+      t1 = children == null ? null : C.JSArray_methods.any$1(children, new M.ParentStatement_closure0());
+      if (C.JSString_methods.startsWith$1($name.get$initialPlain(), "--") && !(value instanceof D.StringExpression0))
+        H.throwExpression(P.ArgumentError$(string$.Declarw + H.S(value) + "` of type " + J.get$runtimeType$u(value).toString$0(0) + ")."));
+      return new L.Declaration0($name, value, span, children, t1 === true);
+    },
+    Declaration0: function Declaration0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.value = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    SupportsDeclaration0: function SupportsDeclaration0(t0, t1, t2) {
+      this.name = t0;
+      this.value = t1;
+      this.span = t2;
+    },
+    ForwardRule0: function ForwardRule0(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _.url = t0;
+      _.shownMixinsAndFunctions = t1;
+      _.shownVariables = t2;
+      _.hiddenMixinsAndFunctions = t3;
+      _.hiddenVariables = t4;
+      _.prefix = t5;
+      _.configuration = t6;
+      _.span = t7;
+    },
+    IfExpression0: function IfExpression0(t0, t1) {
+      this.$arguments = t0;
+      this.span = t1;
+    },
+    LoudComment0: function LoudComment0(t0) {
+      this.text = t0;
+    },
+    ExtendMode0: function ExtendMode0(t0) {
+      this.name = t0;
+    },
+    PlainCssCallable0: function PlainCssCallable0(t0) {
+      this.name = t0;
+    },
+    RenderContextOptions: function RenderContextOptions() {
+    },
+    ScssParser$0: function(contents, logger, url) {
+      var t1 = S.SpanScanner$(contents, url),
+        t2 = logger == null ? C.C_StderrLogger : logger;
+      return new L.ScssParser0(P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_VariableDeclaration_2), t1, t2);
+    },
+    ScssParser0: function ScssParser0(t0, t1, t2) {
+      var _ = this;
+      _._stylesheet0$_isUseAllowed = true;
+      _._stylesheet0$_inMixin = false;
+      _._stylesheet0$_mixinHasContent = null;
+      _._stylesheet0$_inParentheses = _._stylesheet0$_inStyleRule = _._stylesheet0$_inUnknownAtRule = _._stylesheet0$_inControlDirective = _._stylesheet0$_inContentBlock = false;
+      _._stylesheet0$_globalVariables = t0;
+      _.lastSilentComment = null;
+      _.scanner = t1;
+      _.logger = t2;
+    },
+    SingleUnitSassNumber0: function SingleUnitSassNumber0(t0, t1, t2) {
+      this._single_unit$_unit = t0;
+      this.value = t1;
+      this.asSlash = t2;
+    },
+    SingleUnitSassNumber_multiplyUnits_closure1: function SingleUnitSassNumber_multiplyUnits_closure1(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    SingleUnitSassNumber_multiplyUnits_closure2: function SingleUnitSassNumber_multiplyUnits_closure2(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    encodeVlq: function(value) {
+      var res, signBit, digit, t1;
+      if (value < $.$get$MIN_INT32() || value > $.$get$MAX_INT32())
+        throw H.wrapException(P.ArgumentError$("expected 32 bit int, got: " + value));
+      res = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      if (value < 0) {
+        value = -value;
+        signBit = 1;
+      } else
+        signBit = 0;
+      value = value << 1 | signBit;
+      do {
+        digit = value & 31;
+        value = value >>> 5;
+        t1 = value > 0;
+        res.push(string$.ABCDEF[t1 ? digit | 32 : digit]);
+      } while (t1);
+      return res;
+    }
+  },
+  Q = {Repl: function Repl(t0, t1, t2, t3) {
+      var _ = this;
+      _.prompt = t0;
+      _.continuation = t1;
+      _.validator = t2;
+      _._adapter = null;
+      _.history = t3;
+    }, closure113: function closure113() {
+    },
+    QueueList$: function(initialCapacity, $E) {
+      var t1 = new Q.QueueList(0, 0, $E._eval$1("QueueList<0>"));
+      t1.QueueList$1(initialCapacity, $E);
+      return t1;
+    },
+    QueueList_QueueList$from: function(source, $E) {
+      var $length, queue,
+        t1 = $E._eval$1("0*");
+      if (type$.legacy_List_dynamic._is(source)) {
+        $length = J.get$length$asx(source);
+        queue = Q.QueueList$($length + 1, t1);
+        J.setRange$4$ax(queue._table, 0, $length, source, 0);
+        queue._tail = $length;
+        return queue;
+      } else {
+        t1 = Q.QueueList$(null, t1);
+        t1.addAll$1(0, source);
+        return t1;
+      }
+    },
+    QueueList__nextPowerOf2: function(number) {
+      var nextNumber;
+      number = (number << 1 >>> 0) - 1;
+      for (; true; number = nextNumber) {
+        nextNumber = (number & number - 1) >>> 0;
+        if (nextNumber === 0)
+          return number;
+      }
+    },
+    QueueList: function QueueList(t0, t1, t2) {
+      var _ = this;
+      _._table = null;
+      _._head = t0;
+      _._tail = t1;
+      _.$ti = t2;
+    },
+    _CastQueueList: function _CastQueueList(t0, t1, t2, t3) {
+      var _ = this;
+      _._queue_list$_delegate = t0;
+      _._table = null;
+      _._head = t1;
+      _._tail = t2;
+      _.$ti = t3;
+    },
+    _QueueList_Object_ListMixin: function _QueueList_Object_ListMixin() {
+    },
+    StaticImport: function StaticImport(t0, t1, t2, t3) {
+      var _ = this;
+      _.url = t0;
+      _.supports = t1;
+      _.media = t2;
+      _.span = t3;
+    },
+    ContentRule: function ContentRule(t0, t1) {
+      this.span = t0;
+      this.$arguments = t1;
+    },
+    DebugRule: function DebugRule(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    AsyncEnvironment$: function(sourceMap) {
+      var _null = null,
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_Module_legacy_AsyncCallable,
+        t3 = type$.legacy_AstNode,
+        t4 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_AsyncCallable),
+        t5 = H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Value)], type$.JSArray_legacy_Map_of_legacy_String_and_legacy_Value),
+        t6 = sourceMap ? H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t3)], type$.JSArray_legacy_Map_of_legacy_String_and_legacy_AstNode) : _null,
+        t7 = type$.legacy_int,
+        t8 = type$.legacy_AsyncCallable,
+        t9 = type$.JSArray_legacy_Map_of_legacy_String_and_legacy_AsyncCallable;
+      return new Q.AsyncEnvironment(P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), P.LinkedHashMap_LinkedHashMap$_empty(t1, t3), P.LinkedHashSet_LinkedHashSet$_empty(t2), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), _null, _null, _null, t4, t5, t6, P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t8)], t9), P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t8)], t9), P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), _null);
+    },
+    AsyncEnvironment$_: function(_modules, _namespaceNodes, _globalModules, _globalModuleNodes, _forwardedModules, _forwardedModuleNodes, _nestedForwardedModules, _allModules, _variables, _variableNodes, _functions, _mixins, _content) {
+      var t1 = type$.legacy_String,
+        t2 = type$.legacy_int;
+      return new Q.AsyncEnvironment(_modules, _namespaceNodes, _globalModules, _globalModuleNodes, _forwardedModules, _forwardedModuleNodes, _nestedForwardedModules, _allModules, _variables, _variableNodes, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _functions, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _mixins, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _content);
+    },
+    _EnvironmentModule__EnvironmentModule0: function(environment, css, extender, forwarded) {
+      var t1, t2, t3, t4, t5, t6;
+      if (forwarded == null)
+        forwarded = C.Set_empty0;
+      t1 = Q._EnvironmentModule__makeModulesByVariable0(forwarded);
+      t2 = H._instanceType(forwarded);
+      t3 = Q._EnvironmentModule__memberMap0(C.JSArray_methods.get$first(environment._async_environment$_variables), new H.EfficientLengthMappedIterable(forwarded, new Q._EnvironmentModule__EnvironmentModule_closure5(), t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,Value*>*>")), type$.legacy_Value);
+      t4 = environment._async_environment$_variableNodes;
+      t4 = t4 == null ? null : Q._EnvironmentModule__memberMap0(C.JSArray_methods.get$first(t4), new H.EfficientLengthMappedIterable(forwarded, new Q._EnvironmentModule__EnvironmentModule_closure6(), t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,AstNode*>*>")), type$.legacy_AstNode);
+      t2 = t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,AsyncCallable*>*>");
+      t5 = type$.legacy_AsyncCallable;
+      t6 = Q._EnvironmentModule__memberMap0(C.JSArray_methods.get$first(environment._async_environment$_functions), new H.EfficientLengthMappedIterable(forwarded, new Q._EnvironmentModule__EnvironmentModule_closure7(), t2), t5);
+      t5 = Q._EnvironmentModule__memberMap0(C.JSArray_methods.get$first(environment._async_environment$_mixins), new H.EfficientLengthMappedIterable(forwarded, new Q._EnvironmentModule__EnvironmentModule_closure8(), t2), t5);
+      t2 = J.get$isNotEmpty$asx(css.get$children(css)) || C.JSArray_methods.any$1(environment._async_environment$_allModules, new Q._EnvironmentModule__EnvironmentModule_closure9());
+      return Q._EnvironmentModule$_0(environment, css, extender, t1, t3, t4, t6, t5, t2, !extender.get$isEmpty(extender) || C.JSArray_methods.any$1(environment._async_environment$_allModules, new Q._EnvironmentModule__EnvironmentModule_closure10()));
+    },
+    _EnvironmentModule__makeModulesByVariable0: function(forwarded) {
+      var modulesByVariable, t1, t2, t3, t4, t5;
+      if (forwarded.get$isEmpty(forwarded))
+        return C.Map_empty4;
+      modulesByVariable = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Module_legacy_AsyncCallable);
+      for (t1 = forwarded.get$iterator(forwarded); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        if (t2 instanceof Q._EnvironmentModule0) {
+          for (t3 = t2._async_environment$_modulesByVariable, t3 = t3.get$values(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+            t4 = t3.get$current(t3);
+            t5 = t4.get$variables();
+            B.setAll(modulesByVariable, t5.get$keys(t5), t4);
+          }
+          B.setAll(modulesByVariable, J.get$keys$z(C.JSArray_methods.get$first(t2._async_environment$_environment._async_environment$_variables)), t2);
+        } else {
+          t3 = t2.get$variables();
+          B.setAll(modulesByVariable, t3.get$keys(t3), t2);
+        }
+      }
+      return modulesByVariable;
+    },
+    _EnvironmentModule__memberMap0: function(localMap, otherMaps, $V) {
+      var t1, t2, t3, cur;
+      localMap = new U.PublicMemberMapView(localMap, $V._eval$1("PublicMemberMapView<0*>"));
+      t1 = otherMaps.__internal$_iterable;
+      t2 = J.getInterceptor$asx(t1);
+      if (t2.get$isEmpty(t1))
+        return localMap;
+      t3 = H.setRuntimeTypeInfo([], $V._eval$1("JSArray<Map<String*,0*>*>"));
+      for (t1 = new H.MappedIterator(t2.get$iterator(t1), otherMaps._f); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur.get$isNotEmpty(cur))
+          t3.push(cur);
+      }
+      t3.push(localMap);
+      if (t3.length === 1)
+        return localMap;
+      return Z.MergedMapView$(t3, type$.legacy_String, $V._eval$1("0*"));
+    },
+    _EnvironmentModule$_0: function(_environment, css, extender, _modulesByVariable, variables, variableNodes, functions, mixins, transitivelyContainsCss, transitivelyContainsExtensions) {
+      return new Q._EnvironmentModule0(_environment._async_environment$_allModules, variables, variableNodes, functions, mixins, extender, css, transitivelyContainsCss, transitivelyContainsExtensions, _environment, _modulesByVariable);
+    },
+    AsyncEnvironment: function AsyncEnvironment(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15) {
+      var _ = this;
+      _._async_environment$_modules = t0;
+      _._async_environment$_namespaceNodes = t1;
+      _._async_environment$_globalModules = t2;
+      _._async_environment$_globalModuleNodes = t3;
+      _._async_environment$_forwardedModules = t4;
+      _._async_environment$_forwardedModuleNodes = t5;
+      _._async_environment$_nestedForwardedModules = t6;
+      _._async_environment$_allModules = t7;
+      _._async_environment$_variables = t8;
+      _._async_environment$_variableNodes = t9;
+      _._async_environment$_variableIndices = t10;
+      _._async_environment$_functions = t11;
+      _._async_environment$_functionIndices = t12;
+      _._async_environment$_mixins = t13;
+      _._async_environment$_mixinIndices = t14;
+      _._async_environment$_content = t15;
+      _._async_environment$_inMixin = false;
+      _._async_environment$_inSemiGlobalScope = true;
+      _._async_environment$_lastVariableIndex = _._async_environment$_lastVariableName = null;
+    },
+    AsyncEnvironment_importForwards_closure: function AsyncEnvironment_importForwards_closure() {
+    },
+    AsyncEnvironment_importForwards_closure0: function AsyncEnvironment_importForwards_closure0() {
+    },
+    AsyncEnvironment_importForwards_closure1: function AsyncEnvironment_importForwards_closure1() {
+    },
+    AsyncEnvironment_importForwards_closure2: function AsyncEnvironment_importForwards_closure2() {
+    },
+    AsyncEnvironment__getVariableFromGlobalModule_closure: function AsyncEnvironment__getVariableFromGlobalModule_closure(t0) {
+      this.name = t0;
+    },
+    AsyncEnvironment_setVariable_closure: function AsyncEnvironment_setVariable_closure(t0, t1) {
+      this.$this = t0;
+      this.name = t1;
+    },
+    AsyncEnvironment_setVariable_closure0: function AsyncEnvironment_setVariable_closure0(t0) {
+      this.name = t0;
+    },
+    AsyncEnvironment_setVariable_closure1: function AsyncEnvironment_setVariable_closure1(t0, t1) {
+      this.$this = t0;
+      this.name = t1;
+    },
+    AsyncEnvironment__getFunctionFromGlobalModule_closure: function AsyncEnvironment__getFunctionFromGlobalModule_closure(t0) {
+      this.name = t0;
+    },
+    AsyncEnvironment__getMixinFromGlobalModule_closure: function AsyncEnvironment__getMixinFromGlobalModule_closure(t0) {
+      this.name = t0;
+    },
+    _EnvironmentModule0: function _EnvironmentModule0(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) {
+      var _ = this;
+      _.upstream = t0;
+      _.variables = t1;
+      _.variableNodes = t2;
+      _.functions = t3;
+      _.mixins = t4;
+      _.extender = t5;
+      _.css = t6;
+      _.transitivelyContainsCss = t7;
+      _.transitivelyContainsExtensions = t8;
+      _._async_environment$_environment = t9;
+      _._async_environment$_modulesByVariable = t10;
+    },
+    _EnvironmentModule__EnvironmentModule_closure5: function _EnvironmentModule__EnvironmentModule_closure5() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure6: function _EnvironmentModule__EnvironmentModule_closure6() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure7: function _EnvironmentModule__EnvironmentModule_closure7() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure8: function _EnvironmentModule__EnvironmentModule_closure8() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure9: function _EnvironmentModule__EnvironmentModule_closure9() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure10: function _EnvironmentModule__EnvironmentModule_closure10() {
+    },
+    BuiltInCallable$function: function($name, $arguments, callback, url) {
+      return new Q.BuiltInCallable($name, H.setRuntimeTypeInfo([new S.Tuple2(L.ScssParser$("@function " + $name + "(" + $arguments + ") {", null, url).parseArgumentDeclaration$0(), callback, type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value)], type$.JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value));
+    },
+    BuiltInCallable$mixin: function($name, $arguments, callback, url) {
+      return new Q.BuiltInCallable($name, H.setRuntimeTypeInfo([new S.Tuple2(L.ScssParser$("@mixin " + $name + "(" + $arguments + ") {", null, url).parseArgumentDeclaration$0(), new Q.BuiltInCallable$mixin_closure(callback), type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value)], type$.JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value));
+    },
+    BuiltInCallable$overloadedFunction: function($name, overloads) {
+      var t2, t3, t4, t5, t6, t7,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value);
+      for (t2 = overloads.get$entries(overloads), t2 = t2.get$iterator(t2), t3 = type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value, t4 = type$.legacy_String, t5 = type$.legacy_VariableDeclaration; t2.moveNext$0();) {
+        t6 = t2.get$current(t2);
+        t7 = S.SpanScanner$("@function " + $name + "(" + H.S(t6.key) + ") {", null);
+        t1.push(new S.Tuple2(new L.ScssParser(P.LinkedHashMap_LinkedHashMap$_empty(t4, t5), t7, C.StderrLogger_false).parseArgumentDeclaration$0(), t6.value, t3));
+      }
+      return new Q.BuiltInCallable($name, t1);
+    },
+    BuiltInCallable: function BuiltInCallable(t0, t1) {
+      this.name = t0;
+      this._overloads = t1;
+    },
+    BuiltInCallable$mixin_closure: function BuiltInCallable$mixin_closure(t0) {
+      this.callback = t0;
+    },
+    _function5: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function($name, $arguments, callback, "sass:meta");
+    },
+    closure108: function closure108() {
+    },
+    closure109: function closure109() {
+    },
+    closure110: function closure110() {
+    },
+    closure111: function closure111() {
+    },
+    BuiltInModule$: function($name, functions, mixins, variables, $T) {
+      var t4,
+        t1 = P._Uri__Uri(null, $name, null, "sass"),
+        t2 = $T._eval$1("0*"),
+        t3 = Q.BuiltInModule__callableMap(functions, t2);
+      t2 = Q.BuiltInModule__callableMap(mixins, t2);
+      t4 = variables == null ? C.Map_empty2 : new P.UnmodifiableMapView(variables, type$.UnmodifiableMapView_of_legacy_String_and_legacy_Value);
+      return new Q.BuiltInModule(t1, t3, t2, t4, $T._eval$1("BuiltInModule<0>"));
+    },
+    BuiltInModule__callableMap: function(callables, $T) {
+      var t3, _i, callable,
+        t1 = type$.legacy_String,
+        t2 = $T._eval$1("0*");
+      if (callables == null)
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
+      else {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
+        for (t3 = callables.length, _i = 0; _i < callables.length; callables.length === t3 || (0, H.throwConcurrentModificationError)(callables), ++_i) {
+          callable = callables[_i];
+          t1.$indexSet(0, callable.get$name(callable), callable);
+        }
+        t1 = new P.UnmodifiableMapView(t1, type$.$env_1_1_legacy_String._bind$1(t2)._eval$1("UnmodifiableMapView<1,2>"));
+      }
+      return new P.UnmodifiableMapView(t1, type$.$env_1_1_legacy_String._bind$1(t2)._eval$1("UnmodifiableMapView<1,2>"));
+    },
+    BuiltInModule: function BuiltInModule(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.url = t0;
+      _.functions = t1;
+      _.mixins = t2;
+      _.variables = t3;
+      _.$ti = t4;
+    },
+    closure112: function closure112() {
+    },
+    CssParser: function CssParser(t0, t1, t2) {
+      var _ = this;
+      _._isUseAllowed = true;
+      _._stylesheet$_inMixin = false;
+      _._mixinHasContent = null;
+      _._inParentheses = _._inStyleRule = _._stylesheet$_inUnknownAtRule = _._inControlDirective = _._inContentBlock = false;
+      _._globalVariables = t0;
+      _.lastSilentComment = null;
+      _.scanner = t1;
+      _.logger = t2;
+    },
+    AsyncEnvironment$0: function(sourceMap) {
+      var _null = null,
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_Module_legacy_AsyncCallable_2,
+        t3 = type$.legacy_AstNode_2,
+        t4 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_AsyncCallable_2),
+        t5 = H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Value_2)], type$.JSArray_legacy_Map_of_legacy_String_and_legacy_Value_2),
+        t6 = sourceMap ? H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t3)], type$.JSArray_legacy_Map_of_legacy_String_and_legacy_AstNode_2) : _null,
+        t7 = type$.legacy_int,
+        t8 = type$.legacy_AsyncCallable_2,
+        t9 = type$.JSArray_legacy_Map_of_legacy_String_and_legacy_AsyncCallable_2;
+      return new Q.AsyncEnvironment0(P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), P.LinkedHashMap_LinkedHashMap$_empty(t1, t3), P.LinkedHashSet_LinkedHashSet$_empty(t2), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), _null, _null, _null, t4, t5, t6, P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t8)], t9), P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t8)], t9), P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), _null);
+    },
+    AsyncEnvironment$_0: function(_modules, _namespaceNodes, _globalModules, _globalModuleNodes, _forwardedModules, _forwardedModuleNodes, _nestedForwardedModules, _allModules, _variables, _variableNodes, _functions, _mixins, _content) {
+      var t1 = type$.legacy_String,
+        t2 = type$.legacy_int;
+      return new Q.AsyncEnvironment0(_modules, _namespaceNodes, _globalModules, _globalModuleNodes, _forwardedModules, _forwardedModuleNodes, _nestedForwardedModules, _allModules, _variables, _variableNodes, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _functions, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _mixins, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _content);
+    },
+    _EnvironmentModule__EnvironmentModule2: function(environment, css, extender, forwarded) {
+      var t1, t2, t3, t4, t5, t6;
+      if (forwarded == null)
+        forwarded = C.Set_empty3;
+      t1 = Q._EnvironmentModule__makeModulesByVariable2(forwarded);
+      t2 = H._instanceType(forwarded);
+      t3 = Q._EnvironmentModule__memberMap2(C.JSArray_methods.get$first(environment._async_environment0$_variables), new H.EfficientLengthMappedIterable(forwarded, new Q._EnvironmentModule__EnvironmentModule_closure17(), t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,Value0*>*>")), type$.legacy_Value_2);
+      t4 = environment._async_environment0$_variableNodes;
+      t4 = t4 == null ? null : Q._EnvironmentModule__memberMap2(C.JSArray_methods.get$first(t4), new H.EfficientLengthMappedIterable(forwarded, new Q._EnvironmentModule__EnvironmentModule_closure18(), t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,AstNode0*>*>")), type$.legacy_AstNode_2);
+      t2 = t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,AsyncCallable0*>*>");
+      t5 = type$.legacy_AsyncCallable_2;
+      t6 = Q._EnvironmentModule__memberMap2(C.JSArray_methods.get$first(environment._async_environment0$_functions), new H.EfficientLengthMappedIterable(forwarded, new Q._EnvironmentModule__EnvironmentModule_closure19(), t2), t5);
+      t5 = Q._EnvironmentModule__memberMap2(C.JSArray_methods.get$first(environment._async_environment0$_mixins), new H.EfficientLengthMappedIterable(forwarded, new Q._EnvironmentModule__EnvironmentModule_closure20(), t2), t5);
+      t2 = J.get$isNotEmpty$asx(css.get$children(css)) || C.JSArray_methods.any$1(environment._async_environment0$_allModules, new Q._EnvironmentModule__EnvironmentModule_closure21());
+      return Q._EnvironmentModule$_2(environment, css, extender, t1, t3, t4, t6, t5, t2, !extender.get$isEmpty(extender) || C.JSArray_methods.any$1(environment._async_environment0$_allModules, new Q._EnvironmentModule__EnvironmentModule_closure22()));
+    },
+    _EnvironmentModule__makeModulesByVariable2: function(forwarded) {
+      var modulesByVariable, t1, t2, t3, t4, t5;
+      if (forwarded.get$isEmpty(forwarded))
+        return C.Map_empty11;
+      modulesByVariable = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Module_legacy_AsyncCallable_2);
+      for (t1 = forwarded.get$iterator(forwarded); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        if (t2 instanceof Q._EnvironmentModule2) {
+          for (t3 = t2._async_environment0$_modulesByVariable, t3 = t3.get$values(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+            t4 = t3.get$current(t3);
+            t5 = t4.get$variables();
+            B.setAll0(modulesByVariable, t5.get$keys(t5), t4);
+          }
+          B.setAll0(modulesByVariable, J.get$keys$z(C.JSArray_methods.get$first(t2._async_environment0$_environment._async_environment0$_variables)), t2);
+        } else {
+          t3 = t2.get$variables();
+          B.setAll0(modulesByVariable, t3.get$keys(t3), t2);
+        }
+      }
+      return modulesByVariable;
+    },
+    _EnvironmentModule__memberMap2: function(localMap, otherMaps, $V) {
+      var t1, t2, t3, cur;
+      localMap = new U.PublicMemberMapView0(localMap, $V._eval$1("PublicMemberMapView0<0*>"));
+      t1 = otherMaps.__internal$_iterable;
+      t2 = J.getInterceptor$asx(t1);
+      if (t2.get$isEmpty(t1))
+        return localMap;
+      t3 = H.setRuntimeTypeInfo([], $V._eval$1("JSArray<Map<String*,0*>*>"));
+      for (t1 = new H.MappedIterator(t2.get$iterator(t1), otherMaps._f); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur.get$isNotEmpty(cur))
+          t3.push(cur);
+      }
+      t3.push(localMap);
+      if (t3.length === 1)
+        return localMap;
+      return Z.MergedMapView$0(t3, type$.legacy_String, $V._eval$1("0*"));
+    },
+    _EnvironmentModule$_2: function(_environment, css, extender, _modulesByVariable, variables, variableNodes, functions, mixins, transitivelyContainsCss, transitivelyContainsExtensions) {
+      return new Q._EnvironmentModule2(_environment._async_environment0$_allModules, variables, variableNodes, functions, mixins, extender, css, transitivelyContainsCss, transitivelyContainsExtensions, _environment, _modulesByVariable);
+    },
+    AsyncEnvironment0: function AsyncEnvironment0(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15) {
+      var _ = this;
+      _._async_environment0$_modules = t0;
+      _._async_environment0$_namespaceNodes = t1;
+      _._async_environment0$_globalModules = t2;
+      _._async_environment0$_globalModuleNodes = t3;
+      _._async_environment0$_forwardedModules = t4;
+      _._async_environment0$_forwardedModuleNodes = t5;
+      _._async_environment0$_nestedForwardedModules = t6;
+      _._async_environment0$_allModules = t7;
+      _._async_environment0$_variables = t8;
+      _._async_environment0$_variableNodes = t9;
+      _._async_environment0$_variableIndices = t10;
+      _._async_environment0$_functions = t11;
+      _._async_environment0$_functionIndices = t12;
+      _._async_environment0$_mixins = t13;
+      _._async_environment0$_mixinIndices = t14;
+      _._async_environment0$_content = t15;
+      _._async_environment0$_inMixin = false;
+      _._async_environment0$_inSemiGlobalScope = true;
+      _._async_environment0$_lastVariableIndex = _._async_environment0$_lastVariableName = null;
+    },
+    AsyncEnvironment_importForwards_closure3: function AsyncEnvironment_importForwards_closure3() {
+    },
+    AsyncEnvironment_importForwards_closure4: function AsyncEnvironment_importForwards_closure4() {
+    },
+    AsyncEnvironment_importForwards_closure5: function AsyncEnvironment_importForwards_closure5() {
+    },
+    AsyncEnvironment_importForwards_closure6: function AsyncEnvironment_importForwards_closure6() {
+    },
+    AsyncEnvironment__getVariableFromGlobalModule_closure0: function AsyncEnvironment__getVariableFromGlobalModule_closure0(t0) {
+      this.name = t0;
+    },
+    AsyncEnvironment_setVariable_closure2: function AsyncEnvironment_setVariable_closure2(t0, t1) {
+      this.$this = t0;
+      this.name = t1;
+    },
+    AsyncEnvironment_setVariable_closure3: function AsyncEnvironment_setVariable_closure3(t0) {
+      this.name = t0;
+    },
+    AsyncEnvironment_setVariable_closure4: function AsyncEnvironment_setVariable_closure4(t0, t1) {
+      this.$this = t0;
+      this.name = t1;
+    },
+    AsyncEnvironment__getFunctionFromGlobalModule_closure0: function AsyncEnvironment__getFunctionFromGlobalModule_closure0(t0) {
+      this.name = t0;
+    },
+    AsyncEnvironment__getMixinFromGlobalModule_closure0: function AsyncEnvironment__getMixinFromGlobalModule_closure0(t0) {
+      this.name = t0;
+    },
+    _EnvironmentModule2: function _EnvironmentModule2(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) {
+      var _ = this;
+      _.upstream = t0;
+      _.variables = t1;
+      _.variableNodes = t2;
+      _.functions = t3;
+      _.mixins = t4;
+      _.extender = t5;
+      _.css = t6;
+      _.transitivelyContainsCss = t7;
+      _.transitivelyContainsExtensions = t8;
+      _._async_environment0$_environment = t9;
+      _._async_environment0$_modulesByVariable = t10;
+    },
+    _EnvironmentModule__EnvironmentModule_closure17: function _EnvironmentModule__EnvironmentModule_closure17() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure18: function _EnvironmentModule__EnvironmentModule_closure18() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure19: function _EnvironmentModule__EnvironmentModule_closure19() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure20: function _EnvironmentModule__EnvironmentModule_closure20() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure21: function _EnvironmentModule__EnvironmentModule_closure21() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure22: function _EnvironmentModule__EnvironmentModule_closure22() {
+    },
+    BuiltInCallable$function0: function($name, $arguments, callback, url) {
+      return new Q.BuiltInCallable0($name, H.setRuntimeTypeInfo([new S.Tuple2(L.ScssParser$0("@function " + $name + "(" + $arguments + ") {", null, url).parseArgumentDeclaration$0(), callback, type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2)], type$.JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2));
+    },
+    BuiltInCallable$mixin0: function($name, $arguments, callback, url) {
+      return new Q.BuiltInCallable0($name, H.setRuntimeTypeInfo([new S.Tuple2(L.ScssParser$0("@mixin " + $name + "(" + $arguments + ") {", null, url).parseArgumentDeclaration$0(), new Q.BuiltInCallable$mixin_closure0(callback), type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2)], type$.JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2));
+    },
+    BuiltInCallable$parsed: function($name, $arguments, callback) {
+      return new Q.BuiltInCallable0($name, H.setRuntimeTypeInfo([new S.Tuple2($arguments, callback, type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2)], type$.JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2));
+    },
+    BuiltInCallable$overloadedFunction0: function($name, overloads) {
+      var t2, t3, t4, t5, t6, t7,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2);
+      for (t2 = overloads.get$entries(overloads), t2 = t2.get$iterator(t2), t3 = type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2, t4 = type$.legacy_String, t5 = type$.legacy_VariableDeclaration_2; t2.moveNext$0();) {
+        t6 = t2.get$current(t2);
+        t7 = S.SpanScanner$("@function " + $name + "(" + H.S(t6.key) + ") {", null);
+        t1.push(new S.Tuple2(new L.ScssParser0(P.LinkedHashMap_LinkedHashMap$_empty(t4, t5), t7, C.C_StderrLogger).parseArgumentDeclaration$0(), t6.value, t3));
+      }
+      return new Q.BuiltInCallable0($name, t1);
+    },
+    BuiltInCallable0: function BuiltInCallable0(t0, t1) {
+      this.name = t0;
+      this._built_in$_overloads = t1;
+    },
+    BuiltInCallable$mixin_closure0: function BuiltInCallable$mixin_closure0(t0) {
+      this.callback = t0;
+    },
+    BuiltInModule$0: function($name, functions, mixins, variables, $T) {
+      var t4,
+        t1 = P._Uri__Uri(null, $name, null, "sass"),
+        t2 = $T._eval$1("0*"),
+        t3 = Q.BuiltInModule__callableMap0(functions, t2);
+      t2 = Q.BuiltInModule__callableMap0(mixins, t2);
+      t4 = variables == null ? C.Map_empty8 : new P.UnmodifiableMapView(variables, type$.UnmodifiableMapView_of_legacy_String_and_legacy_Value_2);
+      return new Q.BuiltInModule0(t1, t3, t2, t4, $T._eval$1("BuiltInModule0<0>"));
+    },
+    BuiltInModule__callableMap0: function(callables, $T) {
+      var t3, _i, callable,
+        t1 = type$.legacy_String,
+        t2 = $T._eval$1("0*");
+      if (callables == null)
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
+      else {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
+        for (t3 = callables.length, _i = 0; _i < callables.length; callables.length === t3 || (0, H.throwConcurrentModificationError)(callables), ++_i) {
+          callable = callables[_i];
+          t1.$indexSet(0, callable.get$name(callable), callable);
+        }
+        t1 = new P.UnmodifiableMapView(t1, type$.$env_1_1_legacy_String._bind$1(t2)._eval$1("UnmodifiableMapView<1,2>"));
+      }
+      return new P.UnmodifiableMapView(t1, type$.$env_1_1_legacy_String._bind$1(t2)._eval$1("UnmodifiableMapView<1,2>"));
+    },
+    BuiltInModule0: function BuiltInModule0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.url = t0;
+      _.functions = t1;
+      _.mixins = t2;
+      _.variables = t3;
+      _.$ti = t4;
+    },
+    ContentRule0: function ContentRule0(t0, t1) {
+      this.span = t0;
+      this.$arguments = t1;
+    },
+    closure227: function closure227() {
+    },
+    CssParser0: function CssParser0(t0, t1, t2) {
+      var _ = this;
+      _._stylesheet0$_isUseAllowed = true;
+      _._stylesheet0$_inMixin = false;
+      _._stylesheet0$_mixinHasContent = null;
+      _._stylesheet0$_inParentheses = _._stylesheet0$_inStyleRule = _._stylesheet0$_inUnknownAtRule = _._stylesheet0$_inControlDirective = _._stylesheet0$_inContentBlock = false;
+      _._stylesheet0$_globalVariables = t0;
+      _.lastSilentComment = null;
+      _.scanner = t1;
+      _.logger = t2;
+    },
+    DebugRule0: function DebugRule0(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    _function12: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function0($name, $arguments, callback, "sass:meta");
+    },
+    closure223: function closure223() {
+    },
+    closure224: function closure224() {
+    },
+    closure225: function closure225() {
+    },
+    closure226: function closure226() {
+    },
+    StaticImport0: function StaticImport0(t0, t1, t2, t3) {
+      var _ = this;
+      _.url = t0;
+      _.supports = t1;
+      _.media = t2;
+      _.span = t3;
+    }
+  },
+  B = {ReplAdapter: function ReplAdapter(t0) {
+      this.repl = t0;
+      this.rl = null;
+    }, ReplAdapter_runAsync_closure: function ReplAdapter_runAsync_closure(t0) {
+      this.controller = t0;
+    }, Stdin: function Stdin() {
+    }, Stdout: function Stdout() {
+    }, ReadlineModule: function ReadlineModule() {
+    }, ReadlineOptions: function ReadlineOptions() {
+    }, ReadlineInterface: function ReadlineInterface() {
+    },
+    defaultCompare: function($T) {
+      return new B.defaultCompare_closure($T);
+    },
+    defaultCompare_closure: function defaultCompare_closure(t0) {
+      this.T = t0;
+    },
+    InternalStyle: function InternalStyle() {
+    },
+    ModifiableCssNode: function ModifiableCssNode() {
+    },
+    ModifiableCssParentNode: function ModifiableCssParentNode() {
+    },
+    ModifiableCssSupportsRule$: function(condition, span) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode);
+      return new B.ModifiableCssSupportsRule(condition, span, new P.UnmodifiableListView(t1, type$.UnmodifiableListView_legacy_ModifiableCssNode), t1);
+    },
+    ModifiableCssSupportsRule: function ModifiableCssSupportsRule(t0, t1, t2, t3) {
+      var _ = this;
+      _.condition = t0;
+      _.span = t1;
+      _.children = t2;
+      _._children = t3;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    CssNode: function CssNode() {
+    },
+    CssParentNode: function CssParentNode() {
+    },
+    AstNode: function AstNode() {
+    },
+    _FakeAstNode: function _FakeAstNode(t0) {
+      this._callback = t0;
+    },
+    ArgumentDeclaration_ArgumentDeclaration$parse: function(contents, url) {
+      return L.ScssParser$(contents, null, url).parseArgumentDeclaration$0();
+    },
+    ArgumentDeclaration: function ArgumentDeclaration(t0, t1, t2) {
+      this.$arguments = t0;
+      this.restArgument = t1;
+      this.span = t2;
+    },
+    ArgumentDeclaration_verify_closure: function ArgumentDeclaration_verify_closure() {
+    },
+    ArgumentDeclaration_verify_closure0: function ArgumentDeclaration_verify_closure0() {
+    },
+    DynamicImport: function DynamicImport(t0, t1) {
+      this.url = t0;
+      this.span = t1;
+    },
+    ForRule$: function(variable, from, to, children, span, exclusive) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new B.ForRule(variable, from, to, exclusive, span, t1, t2);
+    },
+    ForRule: function ForRule(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.variable = t0;
+      _.from = t1;
+      _.to = t2;
+      _.isExclusive = t3;
+      _.span = t4;
+      _.children = t5;
+      _.hasDeclarations = t6;
+    },
+    ImportRule: function ImportRule(t0, t1) {
+      this.imports = t0;
+      this.span = t1;
+    },
+    ReturnRule: function ReturnRule(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    SilentComment: function SilentComment(t0, t1) {
+      this.text = t0;
+      this.span = t1;
+    },
+    SupportsRule$: function(condition, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new B.SupportsRule(condition, span, t1, t2);
+    },
+    SupportsRule: function SupportsRule(t0, t1, t2, t3) {
+      var _ = this;
+      _.condition = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    ExecutableOptions__separator: function(text) {
+      var t1 = $.$get$ExecutableOptions__separatorBar(),
+        t2 = C.JSString_methods.$mul(t1, 3) + " ";
+      t2 = t2 + (B.hasTerminal() ? "\x1b[1m" : "") + text;
+      return t2 + (B.hasTerminal() ? "\x1b[0m" : "") + " " + C.JSString_methods.$mul(t1, 35 - text.length);
+    },
+    ExecutableOptions__fail: function(message) {
+      return H.throwExpression(B.UsageException$(message));
+    },
+    ExecutableOptions_ExecutableOptions$parse: function(args) {
+      var options, error, t1, exception;
+      try {
+        t1 = $.$get$ExecutableOptions__parser();
+        t1.toString;
+        t1 = G.Parser$(null, t1, P.ListQueue_ListQueue$of(args, type$.legacy_String), null, null).parse$0();
+        if (t1.wasParsed$1("poll") && !H._asBoolS(t1.$index(0, "watch")))
+          B.ExecutableOptions__fail("--poll may not be passed without --watch.");
+        options = new B.ExecutableOptions(t1);
+        if (H._asBoolS(options._options.$index(0, "help")))
+          B.ExecutableOptions__fail("Compile Sass to CSS.");
+        return options;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_FormatException._is(t1)) {
+          error = t1;
+          B.ExecutableOptions__fail(J.get$message$x(error));
+        } else
+          throw exception;
+      }
+    },
+    UsageException$: function(message) {
+      return new B.UsageException(message);
+    },
+    ExecutableOptions: function ExecutableOptions(t0) {
+      var _ = this;
+      _._options = t0;
+      _._sourceDirectoriesToDestinations = _._sourcesToDestinations = _._interactive = null;
+    },
+    ExecutableOptions_closure: function ExecutableOptions_closure() {
+    },
+    ExecutableOptions_emitErrorCss_closure: function ExecutableOptions_emitErrorCss_closure() {
+    },
+    UsageException: function UsageException(t0) {
+      this.message = t0;
+    },
+    AsyncImporter: function AsyncImporter() {
+    },
+    inImportRule: function(callback) {
+      var t1,
+        wasInImportRule = $._inImportRule;
+      $._inImportRule = true;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } finally {
+        $._inImportRule = wasInImportRule;
+      }
+    },
+    resolveImportPath: function(path) {
+      var t1,
+        extension = X.ParsedPath_ParsedPath$parse(path, $.$get$context().style)._splitExtension$1(1)[1];
+      if (extension === ".sass" || extension === ".scss" || extension === ".css") {
+        t1 = $._inImportRule ? new B.resolveImportPath_closure(path, extension).call$0() : null;
+        return t1 == null ? B._exactlyOne(B._tryPath(path)) : t1;
+      }
+      t1 = $._inImportRule ? new B.resolveImportPath_closure0(path).call$0() : null;
+      if (t1 == null)
+        t1 = B._exactlyOne(B._tryPathWithExtensions(path));
+      return t1 == null ? B._tryPathAsDirectory(path) : t1;
+    },
+    _tryPathWithExtensions: function(path) {
+      var result = B._tryPath(path + ".sass");
+      C.JSArray_methods.addAll$1(result, B._tryPath(path + ".scss"));
+      return result.length !== 0 ? result : B._tryPath(path + ".css");
+    },
+    _tryPath: function(path) {
+      var t1 = $.$get$context(),
+        partial = D.join(t1.dirname$1(path), "_" + H.S(X.ParsedPath_ParsedPath$parse(path, t1.style).get$basename()), null);
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      if (B.fileExists(partial))
+        t1.push(partial);
+      if (B.fileExists(path))
+        t1.push(path);
+      return t1;
+    },
+    _tryPathAsDirectory: function(path) {
+      var t1;
+      if (!B.dirExists(path))
+        return null;
+      t1 = $._inImportRule ? new B._tryPathAsDirectory_closure(path).call$0() : null;
+      return t1 == null ? B._exactlyOne(B._tryPathWithExtensions(D.join(path, "index", null))) : t1;
+    },
+    _exactlyOne: function(paths) {
+      var t1 = paths.length;
+      if (t1 === 0)
+        return null;
+      if (t1 === 1)
+        return C.JSArray_methods.get$first(paths);
+      throw H.wrapException(string$.It_s_n + C.JSArray_methods.map$1$1(paths, new B._exactlyOne_closure(), type$.legacy_String).join$1(0, "\n"));
+    },
+    resolveImportPath_closure: function resolveImportPath_closure(t0, t1) {
+      this.path = t0;
+      this.extension = t1;
+    },
+    resolveImportPath_closure0: function resolveImportPath_closure0(t0) {
+      this.path = t0;
+    },
+    _tryPathAsDirectory_closure: function _tryPathAsDirectory_closure(t0) {
+      this.path = t0;
+    },
+    _exactlyOne_closure: function _exactlyOne_closure() {
+    },
+    readFile: function(path) {
+      var sourceFile, t1, i,
+        contents = H._asStringS(B._readFile(path, "utf8"));
+      if (!J.getInterceptor$asx(contents).contains$1(contents, "\ufffd"))
+        return contents;
+      sourceFile = Y.SourceFile$fromString(contents, $.$get$context().toUri$1(path));
+      for (t1 = contents.length, i = 0; i < t1; ++i) {
+        if (C.JSString_methods._codeUnitAt$1(contents, i) !== 65533)
+          continue;
+        throw H.wrapException(E.SassException$("Invalid UTF-8.", Y.FileLocation$_(sourceFile, i).pointSpan$0()));
+      }
+      return contents;
+    },
+    _readFile: function(path, encoding) {
+      return B._systemErrorToFileSystemException(new B._readFile_closure(path, encoding));
+    },
+    writeFile: function(path, contents) {
+      return B._systemErrorToFileSystemException(new B.writeFile_closure(path, contents));
+    },
+    deleteFile: function(path) {
+      return B._systemErrorToFileSystemException(new B.deleteFile_closure(path));
+    },
+    readStdin: function() {
+      return B.readStdin$body();
+    },
+    readStdin$body: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, sink, t1, t2, completer;
+      var $async$readStdin = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              t2 = new P._Future($.Zone__current, type$._Future_legacy_String);
+              completer = new P._AsyncCompleter(t2, type$._AsyncCompleter_legacy_String);
+              t1.contents = null;
+              sink = C.Utf8Decoder_false.startChunkedConversion$1(new P._StringCallbackSink(new B.readStdin_closure(t1, completer), new P.StringBuffer("")));
+              J.on$2$x(J.get$stdin$x(self.process), "data", P.allowInterop(new B.readStdin_closure0(sink)));
+              J.on$2$x(J.get$stdin$x(self.process), "end", P.allowInterop(new B.readStdin_closure1(sink)));
+              J.on$2$x(J.get$stdin$x(self.process), "error", P.allowInterop(new B.readStdin_closure2(completer)));
+              $async$returnValue = t2;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$readStdin, $async$completer);
+    },
+    fileExists: function(path) {
+      return B._systemErrorToFileSystemException(new B.fileExists_closure(path));
+    },
+    dirExists: function(path) {
+      return B._systemErrorToFileSystemException(new B.dirExists_closure(path));
+    },
+    ensureDir: function(path) {
+      return B._systemErrorToFileSystemException(new B.ensureDir_closure(path));
+    },
+    listDir: function(path, recursive) {
+      return B._systemErrorToFileSystemException(new B.listDir_closure(recursive, path));
+    },
+    modificationTime: function(path) {
+      return B._systemErrorToFileSystemException(new B.modificationTime_closure(path));
+    },
+    _systemErrorToFileSystemException: function(callback) {
+      var error, systemError, t1, exception, t2;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        systemError = type$.legacy_JsSystemError._as(error);
+        t1 = systemError;
+        t2 = J.getInterceptor$x(t1);
+        throw H.wrapException(new B.FileSystemException(J.substring$2$s(t2.get$message(t1), (H.S(t2.get$code(t1)) + ": ").length, J.get$length$asx(t2.get$message(t1)) - (", " + H.S(t2.get$syscall(t1)) + " '" + H.S(t2.get$path(t1)) + "'").length), J.get$path$x(systemError)));
+      }
+    },
+    hasTerminal: function() {
+      var t1 = J.get$isTTY$x(J.get$stdout$x(self.process));
+      return t1 == null ? false : t1;
+    },
+    isWindows: function() {
+      return J.$eq$(J.get$platform$x(self.process), "win32");
+    },
+    watchDir: function(path, poll) {
+      var t2, t3, t1 = {},
+        watcher = J.watch$2$x(self.chokidar, path, {disableGlobbing: true, usePolling: poll});
+      t1.controller = null;
+      t2 = J.getInterceptor$x(watcher);
+      t2.on$2(watcher, "add", P.allowInterop(new B.watchDir_closure(t1)));
+      t2.on$2(watcher, "change", P.allowInterop(new B.watchDir_closure0(t1)));
+      t2.on$2(watcher, "unlink", P.allowInterop(new B.watchDir_closure1(t1)));
+      t2.on$2(watcher, "error", P.allowInterop(new B.watchDir_closure2(t1)));
+      t3 = new P._Future($.Zone__current, type$._Future_legacy_Stream_legacy_WatchEvent);
+      t2.on$2(watcher, "ready", P.allowInterop(new B.watchDir_closure3(t1, watcher, new P._AsyncCompleter(t3, type$._AsyncCompleter_legacy_Stream_legacy_WatchEvent))));
+      return t3;
+    },
+    FileSystemException: function FileSystemException(t0, t1) {
+      this.message = t0;
+      this.path = t1;
+    },
+    Stderr: function Stderr(t0) {
+      this._stderr = t0;
+    },
+    _readFile_closure: function _readFile_closure(t0, t1) {
+      this.path = t0;
+      this.encoding = t1;
+    },
+    writeFile_closure: function writeFile_closure(t0, t1) {
+      this.path = t0;
+      this.contents = t1;
+    },
+    deleteFile_closure: function deleteFile_closure(t0) {
+      this.path = t0;
+    },
+    readStdin_closure: function readStdin_closure(t0, t1) {
+      this._box_0 = t0;
+      this.completer = t1;
+    },
+    readStdin_closure0: function readStdin_closure0(t0) {
+      this.sink = t0;
+    },
+    readStdin_closure1: function readStdin_closure1(t0) {
+      this.sink = t0;
+    },
+    readStdin_closure2: function readStdin_closure2(t0) {
+      this.completer = t0;
+    },
+    fileExists_closure: function fileExists_closure(t0) {
+      this.path = t0;
+    },
+    dirExists_closure: function dirExists_closure(t0) {
+      this.path = t0;
+    },
+    ensureDir_closure: function ensureDir_closure(t0) {
+      this.path = t0;
+    },
+    listDir_closure: function listDir_closure(t0, t1) {
+      this.recursive = t0;
+      this.path = t1;
+    },
+    listDir__closure: function listDir__closure(t0) {
+      this.path = t0;
+    },
+    listDir__closure0: function listDir__closure0() {
+    },
+    listDir_closure_list: function listDir_closure_list() {
+    },
+    listDir__list_closure: function listDir__list_closure(t0, t1) {
+      this.parent = t0;
+      this.list = t1;
+    },
+    modificationTime_closure: function modificationTime_closure(t0) {
+      this.path = t0;
+    },
+    watchDir_closure: function watchDir_closure(t0) {
+      this._box_0 = t0;
+    },
+    watchDir_closure0: function watchDir_closure0(t0) {
+      this._box_0 = t0;
+    },
+    watchDir_closure1: function watchDir_closure1(t0) {
+      this._box_0 = t0;
+    },
+    watchDir_closure2: function watchDir_closure2(t0) {
+      this._box_0 = t0;
+    },
+    watchDir_closure3: function watchDir_closure3(t0, t1, t2) {
+      this._box_0 = t0;
+      this.watcher = t1;
+      this.completer = t2;
+    },
+    watchDir__closure: function watchDir__closure(t0) {
+      this.watcher = t0;
+    },
+    ShadowedModuleView_ifNecessary: function(inner, functions, mixins, variables, $T) {
+      var t1;
+      if (B.ShadowedModuleView__needsBlacklist(inner.get$variables(), variables) || B.ShadowedModuleView__needsBlacklist(inner.get$functions(inner), functions) || B.ShadowedModuleView__needsBlacklist(inner.get$mixins(), mixins)) {
+        t1 = $T._eval$1("0*");
+        t1 = new B.ShadowedModuleView(inner, B.ShadowedModuleView__shadowedMap(inner.get$variables(), variables, type$.legacy_Value), B.ShadowedModuleView__shadowedMap(inner.get$variableNodes(), variables, type$.legacy_AstNode), B.ShadowedModuleView__shadowedMap(inner.get$functions(inner), functions, t1), B.ShadowedModuleView__shadowedMap(inner.get$mixins(), mixins, t1), $T._eval$1("ShadowedModuleView<0*>"));
+      } else
+        t1 = null;
+      return t1;
+    },
+    ShadowedModuleView__shadowedMap: function(map, blocklist, $V) {
+      if (map == null || !B.ShadowedModuleView__needsBlacklist(map, blocklist))
+        return map;
+      return K.LimitedMapView$blocklist(map, blocklist, type$.legacy_String, $V._eval$1("0*"));
+    },
+    ShadowedModuleView__needsBlacklist: function(map, blocklist) {
+      var t1 = map.get$isNotEmpty(map) && blocklist.any$1(0, map.get$containsKey());
+      return t1;
+    },
+    ShadowedModuleView: function ShadowedModuleView(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._shadowed_view$_inner = t0;
+      _.variables = t1;
+      _.variableNodes = t2;
+      _.functions = t3;
+      _.mixins = t4;
+      _.$ti = t5;
+    },
+    _PropertyDescriptor: function _PropertyDescriptor() {
+    },
+    toSentence: function(iter, conjunction) {
+      var t1 = iter.__internal$_iterable,
+        t2 = J.getInterceptor$asx(t1);
+      if (t2.get$length(t1) === 1)
+        return J.toString$0$(iter._f.call$1(t2.get$first(t1)));
+      return H.TakeIterable_TakeIterable(iter, t2.get$length(t1) - 1, H._instanceType(iter)._eval$1("Iterable.E")).join$1(0, ", ") + (" " + conjunction + " " + H.S(iter._f.call$1(t2.get$last(t1))));
+    },
+    indent: function(string, indentation) {
+      return new H.MappedListIterable(H.setRuntimeTypeInfo(string.split("\n"), type$.JSArray_String), new B.indent_closure(indentation), type$.MappedListIterable_of_String_and_legacy_String).join$1(0, "\n");
+    },
+    pluralize: function($name, number, plural) {
+      if (number === 1)
+        return $name;
+      if (plural != null)
+        return plural;
+      return $name + "s";
+    },
+    trimAscii: function(string, excludeEscape) {
+      var start = B._firstNonWhitespace(string);
+      return start == null ? "" : J.substring$2$s(string, start, B._lastNonWhitespace(string, true) + 1);
+    },
+    trimAsciiRight: function(string, excludeEscape) {
+      var end = B._lastNonWhitespace(string, excludeEscape);
+      return end == null ? "" : J.substring$2$s(string, 0, end + 1);
+    },
+    _firstNonWhitespace: function(string) {
+      var t1, i, t2;
+      for (t1 = string.length, i = 0; i < t1; ++i) {
+        t2 = C.JSString_methods._codeUnitAt$1(string, i);
+        if (!(t2 === 32 || t2 === 9 || t2 === 10 || t2 === 13 || t2 === 12))
+          return i;
+      }
+      return null;
+    },
+    _lastNonWhitespace: function(string, excludeEscape) {
+      var t1, i, t2, codeUnit;
+      for (t1 = string.length, i = t1 - 1, t2 = J.getInterceptor$s(string); i >= 0; --i) {
+        codeUnit = t2.codeUnitAt$1(string, i);
+        if (!(codeUnit === 32 || codeUnit === 9 || codeUnit === 10 || codeUnit === 13 || codeUnit === 12))
+          if (excludeEscape && i !== 0 && i !== t1 && codeUnit === 92)
+            return i + 1;
+          else
+            return i;
+      }
+      return null;
+    },
+    isPublic: function(member) {
+      var start = J._codeUnitAt$1$s(member, 0);
+      return start !== 45 && start !== 95;
+    },
+    flattenVertically: function(iterable, $T) {
+      var result,
+        t1 = iterable.$ti._eval$1("@<ListIterable.E>")._bind$1($T._eval$1("QueueList<0*>*"))._eval$1("MappedListIterable<1,2>"),
+        queues = P.List_List$from(new H.MappedListIterable(iterable, new B.flattenVertically_closure($T), t1), true, t1._eval$1("ListIterable.E"));
+      if (queues.length === 1)
+        return C.JSArray_methods.get$first(queues);
+      result = H.setRuntimeTypeInfo([], $T._eval$1("JSArray<0*>"));
+      for (; queues.length !== 0;) {
+        if (!!queues.fixed$length)
+          H.throwExpression(P.UnsupportedError$("removeWhere"));
+        C.JSArray_methods._removeWhere$2(queues, new B.flattenVertically_closure0(result, $T), true);
+      }
+      return result;
+    },
+    firstOrNull: function(iterable) {
+      var iterator = J.get$iterator$ax(iterable);
+      return iterator.moveNext$0() ? iterator.get$current(iterator) : null;
+    },
+    codepointIndexToCodeUnitIndex: function(string, codepointIndex) {
+      var t1, codeUnitIndex, i, codeUnitIndex0, t2;
+      for (t1 = J.getInterceptor$s(string), codeUnitIndex = 0, i = 0; i < codepointIndex; ++i) {
+        codeUnitIndex0 = codeUnitIndex + 1;
+        t2 = t1._codeUnitAt$1(string, codeUnitIndex);
+        codeUnitIndex = t2 >= 55296 && t2 <= 56319 ? codeUnitIndex0 + 1 : codeUnitIndex0;
+      }
+      return codeUnitIndex;
+    },
+    codeUnitIndexToCodepointIndex: function(string, codeUnitIndex) {
+      var t1, codepointIndex, i, t2;
+      for (t1 = J.getInterceptor$s(string), codepointIndex = 0, i = 0; i < codeUnitIndex; i = (t2 >= 55296 && t2 <= 56319 ? i + 1 : i) + 1) {
+        ++codepointIndex;
+        t2 = t1._codeUnitAt$1(string, i);
+      }
+      return codepointIndex;
+    },
+    frameForSpan: function(span, member, url) {
+      var t2, t3, t4,
+        t1 = url == null ? span.file.url : url;
+      if (t1 == null)
+        t1 = $.$get$_noSourceUrl();
+      t2 = span.file;
+      t3 = span._file$_start;
+      t4 = Y.FileLocation$_(t2, t3);
+      t4 = t4.file.getLine$1(t4.offset);
+      t3 = Y.FileLocation$_(t2, t3);
+      return new A.Frame(t1, t4 + 1, t3.file.getColumn$1(t3.offset) + 1, member);
+    },
+    spanForList: function(nodes) {
+      var t1, left, right, _null = null;
+      if (nodes.length === 0)
+        return _null;
+      t1 = C.JSArray_methods.get$first(nodes);
+      left = t1 == null ? _null : t1.get$span();
+      if (left == null)
+        return _null;
+      t1 = C.JSArray_methods.get$last(nodes);
+      right = t1 == null ? _null : t1.get$span();
+      if (right == null)
+        return _null;
+      return left.expand$1(0, right);
+    },
+    declarationName: function(span) {
+      var text = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(span.file._decodedChars, span._file$_start, span._end), 0, null);
+      return B.trimAsciiRight(C.JSString_methods.substring$2(text, 0, C.JSString_methods.indexOf$1(text, ":")), false);
+    },
+    unvendor: function($name) {
+      var i,
+        t1 = $name.length;
+      if (t1 < 2)
+        return $name;
+      if (J.getInterceptor$s($name)._codeUnitAt$1($name, 0) !== 45)
+        return $name;
+      if (C.JSString_methods._codeUnitAt$1($name, 1) === 45)
+        return $name;
+      for (i = 2; i < t1; ++i)
+        if (C.JSString_methods._codeUnitAt$1($name, i) === 45)
+          return C.JSString_methods.substring$1($name, i + 1);
+      return $name;
+    },
+    equalsIgnoreCase: function(string1, string2) {
+      var t1, i;
+      if (string1 == string2)
+        return true;
+      if (string1 == null || string2 == null)
+        return false;
+      t1 = string1.length;
+      if (t1 !== string2.length)
+        return false;
+      for (i = 0; i < t1; ++i)
+        if (!T.characterEqualsIgnoreCase(C.JSString_methods._codeUnitAt$1(string1, i), C.JSString_methods._codeUnitAt$1(string2, i)))
+          return false;
+      return true;
+    },
+    startsWithIgnoreCase: function(string, prefix) {
+      var t2, i,
+        t1 = prefix.length;
+      if (string.length < t1)
+        return false;
+      for (t2 = J.getInterceptor$s(string), i = 0; i < t1; ++i)
+        if (!T.characterEqualsIgnoreCase(t2._codeUnitAt$1(string, i), C.JSString_methods._codeUnitAt$1(prefix, i)))
+          return false;
+      return true;
+    },
+    mapInPlace: function(list, $function) {
+      var i;
+      for (i = 0; i < list.length; ++i)
+        list[i] = $function.call$1(list[i]);
+    },
+    longestCommonSubsequence: function(list1, list2, select, $T) {
+      var t1, lengths, selections, t2, i, i0, j, selection, t3, j0, t4, t5;
+      if (select == null)
+        select = new B.longestCommonSubsequence_closure($T);
+      t1 = J.getInterceptor$asx(list1);
+      lengths = P.List_List$generate(t1.get$length(list1) + 1, new B.longestCommonSubsequence_closure0(list2), false, type$.legacy_List_legacy_int);
+      selections = P.List_List$generate(t1.get$length(list1), new B.longestCommonSubsequence_closure1(list2, $T), false, $T._eval$1("List<0*>*"));
+      for (t2 = J.getInterceptor$asx(list2), i = 0; i < t1.get$length(list1); i = i0)
+        for (i0 = i + 1, j = 0; j < t2.get$length(list2); j = j0) {
+          selection = select.call$2(t1.$index(list1, i), t2.$index(list2, j));
+          J.$indexSet$ax(selections[i], j, selection);
+          t3 = lengths[i0];
+          j0 = j + 1;
+          if (selection == null) {
+            t4 = J.$index$asx(t3, j);
+            t5 = J.$index$asx(lengths[i], j0);
+            t5 = Math.max(H.checkNum(t4), H.checkNum(t5));
+            t4 = t5;
+          } else
+            t4 = J.$index$asx(lengths[i], j) + 1;
+          J.$indexSet$ax(t3, j0, t4);
+        }
+      return new B.longestCommonSubsequence_backtrack(selections, lengths, $T).call$2(t1.get$length(list1) - 1, t2.get$length(list2) - 1);
+    },
+    removeFirstWhere: function(list, test, orElse) {
+      var toRemove, element,
+        t1 = list.length,
+        _i = 0;
+      while (true) {
+        if (!(_i < list.length)) {
+          toRemove = null;
+          break;
+        }
+        c$0: {
+          element = list[_i];
+          if (!test.call$1(element))
+            break c$0;
+          toRemove = element;
+          break;
+        }
+        list.length === t1 || (0, H.throwConcurrentModificationError)(list);
+        ++_i;
+      }
+      if (toRemove == null)
+        return orElse.call$0();
+      else {
+        C.JSArray_methods.remove$1(list, toRemove);
+        return toRemove;
+      }
+    },
+    mapAddAll2: function(destination, source, K1, K2, $V) {
+      source.forEach$1(0, new B.mapAddAll2_closure(destination, K1, K2, $V));
+    },
+    setAll: function(map, keys, value) {
+      var t1;
+      for (t1 = J.get$iterator$ax(keys); t1.moveNext$0();)
+        map.$indexSet(0, t1.get$current(t1), value);
+    },
+    rotateSlice: function(list, start, end) {
+      var i, next,
+        element = list.$index(0, end - 1);
+      for (i = start; i < end; ++i, element = next) {
+        next = list.$index(0, i);
+        list.$indexSet(0, i, element);
+      }
+    },
+    mapAsync: function(iterable, callback, $E, $F) {
+      return B.mapAsync$body(iterable, callback, $E, $F, $F._eval$1("Iterable<0*>*"));
+    },
+    mapAsync$body: function(iterable, callback, $E, $F, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, t2, _i, t1, $async$temp1;
+      var $async$mapAsync = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = H.setRuntimeTypeInfo([], $F._eval$1("JSArray<0*>"));
+              t2 = iterable.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$temp1 = t1;
+              $async$goto = 6;
+              return P._asyncAwait(callback.call$1(iterable[_i]), $async$mapAsync);
+            case 6:
+              // returning from await.
+              $async$temp1.push($async$result);
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = t1;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$mapAsync, $async$completer);
+    },
+    putIfAbsentAsync: function(map, key, ifAbsent, $K, $V) {
+      return B.putIfAbsentAsync$body(map, key, ifAbsent, $K, $V, $V._eval$1("0*"));
+    },
+    putIfAbsentAsync$body: function(map, key, ifAbsent, $K, $V, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, value;
+      var $async$putIfAbsentAsync = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (map.containsKey$1(key)) {
+                $async$returnValue = map.$index(0, key);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 3;
+              return P._asyncAwait(ifAbsent.call$0(), $async$putIfAbsentAsync);
+            case 3:
+              // returning from await.
+              value = $async$result;
+              map.$indexSet(0, key, value);
+              $async$returnValue = value;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$putIfAbsentAsync, $async$completer);
+    },
+    copyMapOfMap: function(map, K1, K2, $V) {
+      var t2, t3, t4, t5, t6, t7,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(K1._eval$1("0*"), K2._eval$1("@<0>")._bind$1($V)._eval$1("Map<1*,2*>*"));
+      for (t2 = map.get$entries(map), t2 = t2.get$iterator(t2), t3 = K2._eval$1("0*"), t4 = $V._eval$1("0*"); t2.moveNext$0();) {
+        t5 = t2.get$current(t2);
+        t6 = t5.key;
+        t5 = t5.value;
+        t7 = P.LinkedHashMap_LinkedHashMap(null, null, null, t3, t4);
+        t7.addAll$1(0, t5);
+        t1.$indexSet(0, t6, t7);
+      }
+      return t1;
+    },
+    copyMapOfList: function(map, $K, $E) {
+      var t2, t3,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty($K._eval$1("0*"), $E._eval$1("List<0*>*"));
+      for (t2 = map.get$entries(map), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t1.$indexSet(0, t3.key, J.toList$0$ax(t3.value));
+      }
+      return t1;
+    },
+    SpanExtensions_trim: function(_this) {
+      var t3, end, end0,
+        t1 = _this.file,
+        t2 = _this._file$_start,
+        text = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1._decodedChars, t2, _this._end), 0, null),
+        start = 0;
+      while (true) {
+        t3 = C.JSString_methods._codeUnitAt$1(text, start);
+        if (!(t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12))
+          break;
+        ++start;
+      }
+      end = text.length - 1;
+      end0 = end;
+      while (true) {
+        t3 = C.JSString_methods.codeUnitAt$1(text, end0);
+        if (!(t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12))
+          break;
+        --end0;
+      }
+      return start === 0 && end0 === end ? _this : t1.span$2(Y.FileLocation$_(t1, t2).offset + start, Y.FileLocation$_(t1, t2).offset + end0 + 1);
+    },
+    indent_closure: function indent_closure(t0) {
+      this.indentation = t0;
+    },
+    flattenVertically_closure: function flattenVertically_closure(t0) {
+      this.T = t0;
+    },
+    flattenVertically_closure0: function flattenVertically_closure0(t0, t1) {
+      this.result = t0;
+      this.T = t1;
+    },
+    longestCommonSubsequence_closure: function longestCommonSubsequence_closure(t0) {
+      this.T = t0;
+    },
+    longestCommonSubsequence_closure0: function longestCommonSubsequence_closure0(t0) {
+      this.list2 = t0;
+    },
+    longestCommonSubsequence_closure1: function longestCommonSubsequence_closure1(t0, t1) {
+      this.list2 = t0;
+      this.T = t1;
+    },
+    longestCommonSubsequence_backtrack: function longestCommonSubsequence_backtrack(t0, t1, t2) {
+      this.selections = t0;
+      this.lengths = t1;
+      this.T = t2;
+    },
+    mapAddAll2_closure: function mapAddAll2_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.destination = t0;
+      _.K1 = t1;
+      _.K2 = t2;
+      _.V = t3;
+    },
+    ArgumentDeclaration_ArgumentDeclaration$parse0: function(contents, url) {
+      return L.ScssParser$0(contents, null, url).parseArgumentDeclaration$0();
+    },
+    ArgumentDeclaration0: function ArgumentDeclaration0(t0, t1, t2) {
+      this.$arguments = t0;
+      this.restArgument = t1;
+      this.span = t2;
+    },
+    ArgumentDeclaration_verify_closure1: function ArgumentDeclaration_verify_closure1() {
+    },
+    ArgumentDeclaration_verify_closure2: function ArgumentDeclaration_verify_closure2() {
+    },
+    AsyncImporter0: function AsyncImporter0() {
+    },
+    DynamicImport0: function DynamicImport0(t0, t1) {
+      this.url = t0;
+      this.span = t1;
+    },
+    ForRule$0: function(variable, from, to, children, span, exclusive) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new B.ForRule0(variable, from, to, exclusive, span, t1, t2);
+    },
+    ForRule0: function ForRule0(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.variable = t0;
+      _.from = t1;
+      _.to = t2;
+      _.isExclusive = t3;
+      _.span = t4;
+      _.children = t5;
+      _.hasDeclarations = t6;
+    },
+    ImportRule0: function ImportRule0(t0, t1) {
+      this.imports = t0;
+      this.span = t1;
+    },
+    AstNode0: function AstNode0() {
+    },
+    _FakeAstNode0: function _FakeAstNode0(t0) {
+      this._node3$_callback = t0;
+    },
+    CssNode0: function CssNode0() {
+    },
+    CssParentNode0: function CssParentNode0() {
+    },
+    readFile0: function(path) {
+      var sourceFile, t1, i,
+        contents = H._asStringS(B._readFile0(path, "utf8"));
+      if (!J.getInterceptor$asx(contents).contains$1(contents, "\ufffd"))
+        return contents;
+      sourceFile = Y.SourceFile$fromString(contents, $.$get$context().toUri$1(path));
+      for (t1 = contents.length, i = 0; i < t1; ++i) {
+        if (C.JSString_methods._codeUnitAt$1(contents, i) !== 65533)
+          continue;
+        throw H.wrapException(E.SassException$0("Invalid UTF-8.", Y.FileLocation$_(sourceFile, i).pointSpan$0()));
+      }
+      return contents;
+    },
+    _readFile0: function(path, encoding) {
+      return B._systemErrorToFileSystemException0(new B._readFile_closure0(path, encoding));
+    },
+    fileExists0: function(path) {
+      return B._systemErrorToFileSystemException0(new B.fileExists_closure0(path));
+    },
+    dirExists0: function(path) {
+      return B._systemErrorToFileSystemException0(new B.dirExists_closure0(path));
+    },
+    listDir0: function(path) {
+      return B._systemErrorToFileSystemException0(new B.listDir_closure0(false, path));
+    },
+    _systemErrorToFileSystemException0: function(callback) {
+      var error, systemError, t1, exception, t2;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        systemError = type$.legacy_JsSystemError._as(error);
+        t1 = systemError;
+        t2 = J.getInterceptor$x(t1);
+        throw H.wrapException(new B.FileSystemException0(J.substring$2$s(t2.get$message(t1), (H.S(t2.get$code(t1)) + ": ").length, J.get$length$asx(t2.get$message(t1)) - (", " + H.S(t2.get$syscall(t1)) + " '" + H.S(t2.get$path(t1)) + "'").length), J.get$path$x(systemError)));
+      }
+    },
+    FileSystemException0: function FileSystemException0(t0, t1) {
+      this.message = t0;
+      this.path = t1;
+    },
+    Stderr0: function Stderr0(t0) {
+      this._node1$_stderr = t0;
+    },
+    _readFile_closure0: function _readFile_closure0(t0, t1) {
+      this.path = t0;
+      this.encoding = t1;
+    },
+    fileExists_closure0: function fileExists_closure0(t0) {
+      this.path = t0;
+    },
+    dirExists_closure0: function dirExists_closure0(t0) {
+      this.path = t0;
+    },
+    listDir_closure0: function listDir_closure0(t0, t1) {
+      this.recursive = t0;
+      this.path = t1;
+    },
+    listDir__closure1: function listDir__closure1(t0) {
+      this.path = t0;
+    },
+    listDir__closure2: function listDir__closure2() {
+    },
+    listDir_closure_list0: function listDir_closure_list0() {
+    },
+    listDir__list_closure0: function listDir__list_closure0(t0, t1) {
+      this.parent = t0;
+      this.list = t1;
+    },
+    ModifiableCssNode0: function ModifiableCssNode0() {
+    },
+    ModifiableCssParentNode0: function ModifiableCssParentNode0() {
+    },
+    _render: function(options, callback) {
+      var t1 = J.getInterceptor$x(options);
+      if (t1.get$fiber(options) != null)
+        J.run$0$x(t1.get$fiber(options).call$1(P.allowInterop(new B._render_closure(callback, options))));
+      else
+        B._renderAsync(options).then$1$2$onError(0, new B._render_closure0(callback), new B._render_closure1(callback), type$.Null);
+    },
+    _renderAsync: function(options) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_RenderResult),
+        $async$returnValue, t2, t3, t4, t5, t6, t7, t8, t9, result, start, t1, file;
+      var $async$_renderAsync = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              start = new P.DateTime(Date.now(), false);
+              t1 = J.getInterceptor$x(options);
+              file = t1.get$file(options) == null ? null : D.absolute(t1.get$file(options));
+              $async$goto = t1.get$data(options) != null ? 3 : 5;
+              break;
+            case 3:
+              // then
+              t2 = t1.get$data(options);
+              t3 = B._parseImporter(options, start);
+              t4 = B._parseFunctions(options, start, true);
+              t5 = t1.get$indentedSyntax(options);
+              t5 = !J.$eq$(t5, false) && t5 != null ? C.Syntax_Sass0 : null;
+              t6 = B._parseOutputStyle(t1.get$outputStyle(options));
+              t7 = J.$eq$(t1.get$indentType(options), "tab");
+              t8 = B._parseIndentWidth(t1.get$indentWidth(options));
+              t9 = B._parseLineFeed(t1.get$linefeed(options));
+              t1 = t1.get$file(options) == null ? "stdin" : $.$get$context().toUri$1(file).toString$0(0);
+              $async$goto = 6;
+              return P._asyncAwait(X.compileStringAsync0(t2, t4, t8, t9, t3, B._enableSourceMaps(options), t6, t5, t1, !t7), $async$_renderAsync);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = t1.get$file(options) != null ? 7 : 9;
+              break;
+            case 7:
+              // then
+              t2 = B._parseImporter(options, start);
+              t3 = B._parseFunctions(options, start, true);
+              t4 = t1.get$indentedSyntax(options);
+              t4 = !J.$eq$(t4, false) && t4 != null ? C.Syntax_Sass0 : null;
+              t5 = B._parseOutputStyle(t1.get$outputStyle(options));
+              t6 = J.$eq$(t1.get$indentType(options), "tab");
+              $async$goto = 10;
+              return P._asyncAwait(X.compileAsync0(file, t3, B._parseIndentWidth(t1.get$indentWidth(options)), B._parseLineFeed(t1.get$linefeed(options)), t2, B._enableSourceMaps(options), t5, t4, !t6), $async$_renderAsync);
+            case 10:
+              // returning from await.
+              result = $async$result;
+              // goto join
+              $async$goto = 8;
+              break;
+            case 9:
+              // else
+              throw H.wrapException(P.ArgumentError$(string$.Either));
+            case 8:
+              // join
+            case 4:
+              // join
+              $async$returnValue = B._newRenderResult(options, result, start);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_renderAsync, $async$completer);
+    },
+    _renderSync: function(options) {
+      var start, file, result, error, error0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, stylesheet, exception, _null = null;
+      try {
+        start = new P.DateTime(Date.now(), false);
+        t1 = J.getInterceptor$x(options);
+        file = t1.get$file(options) == null ? _null : D.absolute(t1.get$file(options));
+        result = null;
+        if (t1.get$data(options) != null) {
+          t2 = t1.get$data(options);
+          t3 = B._parseImporter(options, start);
+          t4 = B._parseFunctions(options, start, false);
+          t5 = t1.get$indentedSyntax(options);
+          t5 = !J.$eq$(t5, false) && t5 != null ? C.Syntax_Sass0 : _null;
+          t6 = B._parseOutputStyle(t1.get$outputStyle(options));
+          t7 = J.$eq$(t1.get$indentType(options), "tab");
+          t8 = B._parseIndentWidth(t1.get$indentWidth(options));
+          t9 = B._parseLineFeed(t1.get$linefeed(options));
+          t1 = t1.get$file(options) == null ? "stdin" : $.$get$context().toUri$1(file).toString$0(0);
+          t10 = B._enableSourceMaps(options);
+          stylesheet = V.Stylesheet_Stylesheet$parse0(t2, t5 == null ? C.Syntax_SCSS0 : t5, _null, t1);
+          t1 = D.absolute(".");
+          result = U._compileStylesheet1(stylesheet, _null, _null, t3, new F.FilesystemImporter0(t1), new H.CastList(t4, H._arrayInstanceType(t4)._eval$1("CastList<1,Callable0*>")), t6, !t7, t8, t9, t10, true);
+        } else if (t1.get$file(options) != null) {
+          t2 = file;
+          t3 = B._parseImporter(options, start);
+          t4 = B._parseFunctions(options, start, false);
+          t5 = t1.get$indentedSyntax(options);
+          t5 = !J.$eq$(t5, false) && t5 != null ? C.Syntax_Sass0 : _null;
+          t6 = B._parseOutputStyle(t1.get$outputStyle(options));
+          t7 = J.$eq$(t1.get$indentType(options), "tab");
+          t8 = B._parseIndentWidth(t1.get$indentWidth(options));
+          t1 = B._parseLineFeed(t1.get$linefeed(options));
+          t9 = B._enableSourceMaps(options);
+          t10 = B.readFile0(t2);
+          if (t5 == null)
+            t5 = M.Syntax_forPath0(t2);
+          stylesheet = V.Stylesheet_Stylesheet$parse0(t10, t5, _null, $.$get$context().toUri$1(t2));
+          result = U._compileStylesheet1(stylesheet, _null, _null, t3, new F.FilesystemImporter0(D.absolute(".")), new H.CastList(t4, H._arrayInstanceType(t4)._eval$1("CastList<1,Callable0*>")), t6, !t7, t8, t1, t9, true);
+        } else {
+          t1 = P.ArgumentError$(string$.Either);
+          throw H.wrapException(t1);
+        }
+        t1 = B._newRenderResult(options, result, start);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassException0) {
+          error = t1;
+          t1 = B._wrapException(error);
+          $.$get$_jsThrow().call$1(t1);
+        } else {
+          error0 = t1;
+          t1 = B._newRenderError(J.toString$0$(error0), _null, _null, _null, 3);
+          $.$get$_jsThrow().call$1(t1);
+        }
+      }
+      throw H.wrapException("unreachable");
+    },
+    _wrapException: function(exception) {
+      var t3, t4,
+        t1 = C.JSString_methods.replaceFirst$2(exception.toString$0(0), "Error: ", ""),
+        t2 = G.SourceSpanException.prototype.get$span.call(exception);
+      t2 = Y.FileLocation$_(t2.file, t2._file$_start);
+      t2 = t2.file.getLine$1(t2.offset);
+      t3 = G.SourceSpanException.prototype.get$span.call(exception);
+      t3 = Y.FileLocation$_(t3.file, t3._file$_start);
+      t3 = t3.file.getColumn$1(t3.offset);
+      if (G.SourceSpanException.prototype.get$span.call(exception).file.url == null)
+        t4 = "stdin";
+      else {
+        t4 = G.SourceSpanException.prototype.get$span.call(exception).file;
+        t4 = $.$get$context().style.pathFromUri$1(M._parseUri(t4.url));
+      }
+      return B._newRenderError(t1, t3 + 1, t4, t2 + 1, 1);
+    },
+    _parseFunctions: function(options, start, asynch) {
+      var result,
+        t1 = J.getInterceptor$x(options);
+      if (t1.get$functions(options) == null)
+        return C.List_empty21;
+      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AsyncCallable);
+      B.jsForEach(t1.get$functions(options), new B._parseFunctions_closure(options, start, result, asynch));
+      return result;
+    },
+    _parseImporter: function(options, start) {
+      var importers, t2, t3, context,
+        t1 = J.getInterceptor$x(options);
+      if (t1.get$importer(options) == null)
+        importers = H.setRuntimeTypeInfo([], type$.JSArray_legacy_JSFunction);
+      else {
+        t2 = type$.legacy_List_legacy_Object;
+        t3 = type$.legacy_JSFunction;
+        importers = t2._is(t1.get$importer(options)) ? J.cast$1$0$ax(t2._as(t1.get$importer(options)), t3) : H.setRuntimeTypeInfo([t3._as(t1.get$importer(options))], type$.JSArray_legacy_JSFunction);
+      }
+      t2 = J.getInterceptor$asx(importers);
+      context = t2.get$isNotEmpty(importers) ? B._contextWithOptions(options, start) : null;
+      if (t1.get$fiber(options) != null) {
+        t2 = t2.map$1$1(importers, new B._parseImporter_closure(options), type$.legacy_JSFunction);
+        importers = P.List_List$from(t2, true, t2.$ti._eval$1("ListIterable.E"));
+      }
+      t1 = t1.get$includePaths(options);
+      if (t1 == null)
+        t1 = [];
+      t2 = type$.legacy_String;
+      return new F.NodeImporter(context, P.List_List$unmodifiable(F.NodeImporter__addSassPath(P.List_List$from(t1, true, t2)), t2), P.List_List$unmodifiable(J.cast$1$0$ax(importers, type$.dynamic), type$.legacy_JSFunction));
+    },
+    _contextWithOptions: function(options, start) {
+      var includePaths, t3, t4, t5, _i, t6, t7, context,
+        t1 = J.getInterceptor$x(options),
+        t2 = t1.get$includePaths(options);
+      if (t2 == null)
+        t2 = [];
+      includePaths = P.List_List$from(t2, true, type$.legacy_String);
+      t2 = t1.get$file(options);
+      t3 = t1.get$data(options);
+      t4 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      t4.push(D.current());
+      for (t5 = includePaths.length, _i = 0; _i < includePaths.length; includePaths.length === t5 || (0, H.throwConcurrentModificationError)(includePaths), ++_i)
+        t4.push(includePaths[_i]);
+      t4 = C.JSArray_methods.join$1(t4, J.$eq$(J.get$platform$x(self.process), "win32") ? ";" : ":");
+      t5 = J.$eq$(t1.get$indentType(options), "tab") ? 1 : 0;
+      t6 = B._parseIndentWidth(t1.get$indentWidth(options));
+      if (t6 == null)
+        t6 = 2;
+      t7 = B._parseLineFeed(t1.get$linefeed(options));
+      t1 = t1.get$file(options);
+      if (t1 == null)
+        t1 = "data";
+      context = {options: {file: t2, data: t3, includePaths: t4, precision: 10, style: 1, indentType: t5, indentWidth: t6, linefeed: t7.text, result: {stats: {entry: t1, start: start._value}}}};
+      J.set$context$x(J.get$options$x(context), context);
+      return context;
+    },
+    _parseOutputStyle: function(style) {
+      if (style == null || style === "expanded")
+        return C.OutputStyle_expanded;
+      if (style === "compressed")
+        return C.OutputStyle_compressed0;
+      throw H.wrapException(P.ArgumentError$('Unsupported output style "' + H.S(style) + '".'));
+    },
+    _parseIndentWidth: function(width) {
+      if (width == null)
+        return null;
+      return H._isInt(width) ? width : P.int_parse(J.toString$0$(width), null);
+    },
+    _parseLineFeed: function(str) {
+      switch (str) {
+        case "cr":
+          return C.LineFeed_kMT;
+        case "crlf":
+          return C.LineFeed_Mss;
+        case "lfcr":
+          return C.LineFeed_a1Y;
+        default:
+          return C.LineFeed_D6m;
+      }
+    },
+    _newRenderResult: function(options, result, start) {
+      var t3, sourceMapPath, t4, sourceMapDir, sourceMapDirUrl, i, source, t5, t6, sourceMapBytes, buffer, indices, url, _null = null,
+        t1 = Date.now(),
+        t2 = result._async_compile$_serialize,
+        css = t2.css;
+      if (B._enableSourceMaps(options)) {
+        t3 = J.getInterceptor$x(options);
+        sourceMapPath = typeof t3.get$sourceMap(options) == "string" ? H._asStringS(t3.get$sourceMap(options)) : J.$add$ansx(t3.get$outFile(options), ".map");
+        t4 = $.$get$context();
+        sourceMapDir = t4.dirname$1(sourceMapPath);
+        t2 = t2.sourceMap;
+        t2.sourceRoot = t3.get$sourceMapRoot(options);
+        if (t3.get$outFile(options) == null)
+          if (t3.get$file(options) == null)
+            t2.targetUrl = "stdin.css";
+          else
+            t2.targetUrl = t4.toUri$1(t4.withoutExtension$1(t3.get$file(options)) + ".css").toString$0(0);
+        else
+          t2.targetUrl = t4.toUri$1(t4.relative$2$from(t3.get$outFile(options), sourceMapDir)).toString$0(0);
+        sourceMapDirUrl = t4.toUri$1(sourceMapDir).toString$0(0);
+        for (t4 = t2.urls, i = 0; i < t4.length; ++i) {
+          source = t4[i];
+          if (source === "stdin")
+            continue;
+          t5 = $.$get$url();
+          t6 = t5.style;
+          if (t6.rootLength$1(source) <= 0 || t6.isRootRelative$1(source))
+            continue;
+          t4[i] = t5.relative$2$from(source, sourceMapDirUrl);
+        }
+        t4 = t3.get$sourceMapContents(options);
+        sourceMapBytes = self.Buffer.from(C.C_JsonCodec.encode$2$toEncodable(t2.toJson$1$includeSourceContents(!J.$eq$(t4, false) && t4 != null), _null), "utf8");
+        t2 = t3.get$omitSourceMapUrl(options);
+        if (!(!J.$eq$(t2, false) && t2 != null)) {
+          t2 = t3.get$sourceMapEmbed(options);
+          if (!J.$eq$(t2, false) && t2 != null) {
+            buffer = new P.StringBuffer("");
+            indices = H.setRuntimeTypeInfo([-1], type$.JSArray_int);
+            P.UriData__writeUri("application/json", _null, _null, buffer, indices);
+            indices.push(buffer._contents.length);
+            t2 = buffer._contents += ";base64,";
+            indices.push(t2.length - 1);
+            C.C_Base64Encoder.startChunkedConversion$1(new P._StringSinkConversionSink(buffer)).addSlice$4(sourceMapBytes, 0, sourceMapBytes.length, true);
+            t2 = buffer._contents;
+            url = new P.UriData(t2.charCodeAt(0) == 0 ? t2 : t2, indices, _null).get$uri();
+          } else {
+            if (t3.get$outFile(options) == null)
+              t2 = sourceMapPath;
+            else {
+              t2 = t3.get$outFile(options);
+              t3 = $.$get$context();
+              t2 = t3.relative$2$from(sourceMapPath, t3.dirname$1(t2));
+            }
+            url = $.$get$context().toUri$1(t2);
+          }
+          css += "\n\n/*# sourceMappingURL=" + url.toString$0(0) + " */";
+        }
+      } else
+        sourceMapBytes = _null;
+      t2 = self.Buffer.from(css, "utf8");
+      t3 = J.get$file$x(options);
+      if (t3 == null)
+        t3 = "data";
+      t4 = start._value;
+      t1 = new P.DateTime(t1, false)._value;
+      t5 = C.JSInt_methods._tdivFast$1(P.Duration$(t1 - t4)._duration, 1000);
+      t6 = result._evaluate.includedFiles;
+      return {css: t2, map: sourceMapBytes, stats: {entry: t3, start: t4, end: t1, duration: t5, includedFiles: P.List_List$from(t6, true, H._instanceType(t6)._precomputed1)}};
+    },
+    _enableSourceMaps: function(options) {
+      var t2,
+        t1 = J.getInterceptor$x(options);
+      if (typeof t1.get$sourceMap(options) != "string") {
+        t2 = t1.get$sourceMap(options);
+        t1 = !J.$eq$(t2, false) && t2 != null && t1.get$outFile(options) != null;
+      } else
+        t1 = true;
+      return t1;
+    },
+    _newRenderError: function(message, column, file, line, $status) {
+      var error = new self.Error(message);
+      error.formatted = "Error: " + H.S(message);
+      if (line != null)
+        error.line = line;
+      if (column != null)
+        error.column = column;
+      if (file != null)
+        error.file = file;
+      error.status = $status;
+      return error;
+    },
+    _render_closure: function _render_closure(t0, t1) {
+      this.callback = t0;
+      this.options = t1;
+    },
+    _render_closure0: function _render_closure0(t0) {
+      this.callback = t0;
+    },
+    _render_closure1: function _render_closure1(t0) {
+      this.callback = t0;
+    },
+    _parseFunctions_closure: function _parseFunctions_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.options = t0;
+      _.start = t1;
+      _.result = t2;
+      _.asynch = t3;
+    },
+    _parseFunctions__closure: function _parseFunctions__closure(t0, t1, t2) {
+      this.options = t0;
+      this.callback = t1;
+      this.context = t2;
+    },
+    _parseFunctions___closure0: function _parseFunctions___closure0(t0) {
+      this.fiber = t0;
+    },
+    _parseFunctions____closure: function _parseFunctions____closure(t0, t1) {
+      this.fiber = t0;
+      this.result = t1;
+    },
+    _parseFunctions___closure1: function _parseFunctions___closure1(t0) {
+      this.options = t0;
+    },
+    _parseFunctions__closure0: function _parseFunctions__closure0(t0, t1) {
+      this.callback = t0;
+      this.context = t1;
+    },
+    _parseFunctions__closure1: function _parseFunctions__closure1(t0, t1) {
+      this.callback = t0;
+      this.context = t1;
+    },
+    _parseFunctions___closure: function _parseFunctions___closure(t0) {
+      this.completer = t0;
+    },
+    _parseImporter_closure: function _parseImporter_closure(t0) {
+      this.options = t0;
+    },
+    _parseImporter__closure: function _parseImporter__closure(t0, t1) {
+      this.options = t0;
+      this.importer = t1;
+    },
+    _parseImporter___closure: function _parseImporter___closure(t0) {
+      this.fiber = t0;
+    },
+    _parseImporter____closure: function _parseImporter____closure(t0, t1) {
+      this.fiber = t0;
+      this.result = t1;
+    },
+    _parseImporter___closure0: function _parseImporter___closure0(t0) {
+      this.options = t0;
+    },
+    ReturnRule0: function ReturnRule0(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    ShadowedModuleView_ifNecessary0: function(inner, functions, mixins, variables, $T) {
+      var t1;
+      if (B.ShadowedModuleView__needsBlacklist0(inner.get$variables(), variables) || B.ShadowedModuleView__needsBlacklist0(inner.get$functions(inner), functions) || B.ShadowedModuleView__needsBlacklist0(inner.get$mixins(), mixins)) {
+        t1 = $T._eval$1("0*");
+        t1 = new B.ShadowedModuleView0(inner, B.ShadowedModuleView__shadowedMap0(inner.get$variables(), variables, type$.legacy_Value_2), B.ShadowedModuleView__shadowedMap0(inner.get$variableNodes(), variables, type$.legacy_AstNode_2), B.ShadowedModuleView__shadowedMap0(inner.get$functions(inner), functions, t1), B.ShadowedModuleView__shadowedMap0(inner.get$mixins(), mixins, t1), $T._eval$1("ShadowedModuleView0<0*>"));
+      } else
+        t1 = null;
+      return t1;
+    },
+    ShadowedModuleView__shadowedMap0: function(map, blocklist, $V) {
+      if (map == null || !B.ShadowedModuleView__needsBlacklist0(map, blocklist))
+        return map;
+      return K.LimitedMapView$blocklist0(map, blocklist, type$.legacy_String, $V._eval$1("0*"));
+    },
+    ShadowedModuleView__needsBlacklist0: function(map, blocklist) {
+      var t1 = map.get$isNotEmpty(map) && blocklist.any$1(0, map.get$containsKey());
+      return t1;
+    },
+    ShadowedModuleView0: function ShadowedModuleView0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._shadowed_view0$_inner = t0;
+      _.variables = t1;
+      _.variableNodes = t2;
+      _.functions = t3;
+      _.mixins = t4;
+      _.$ti = t5;
+    },
+    SilentComment0: function SilentComment0(t0, t1) {
+      this.text = t0;
+      this.span = t1;
+    },
+    ModifiableCssSupportsRule$0: function(condition, span) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode_2);
+      return new B.ModifiableCssSupportsRule0(condition, span, new P.UnmodifiableListView(t1, type$.UnmodifiableListView_legacy_ModifiableCssNode_2), t1);
+    },
+    ModifiableCssSupportsRule0: function ModifiableCssSupportsRule0(t0, t1, t2, t3) {
+      var _ = this;
+      _.condition = t0;
+      _.span = t1;
+      _.children = t2;
+      _._node2$_children = t3;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    SupportsRule$0: function(condition, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new B.SupportsRule0(condition, span, t1, t2);
+    },
+    SupportsRule0: function SupportsRule0(t0, t1, t2, t3) {
+      var _ = this;
+      _.condition = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    inImportRule0: function(callback) {
+      var t1,
+        wasInImportRule = $._inImportRule0;
+      $._inImportRule0 = true;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } finally {
+        $._inImportRule0 = wasInImportRule;
+      }
+    },
+    resolveImportPath0: function(path) {
+      var t1,
+        extension = X.ParsedPath_ParsedPath$parse(path, $.$get$context().style)._splitExtension$1(1)[1];
+      if (extension === ".sass" || extension === ".scss" || extension === ".css") {
+        t1 = $._inImportRule0 ? new B.resolveImportPath_closure1(path, extension).call$0() : null;
+        return t1 == null ? B._exactlyOne0(B._tryPath0(path)) : t1;
+      }
+      t1 = $._inImportRule0 ? new B.resolveImportPath_closure2(path).call$0() : null;
+      if (t1 == null)
+        t1 = B._exactlyOne0(B._tryPathWithExtensions0(path));
+      return t1 == null ? B._tryPathAsDirectory0(path) : t1;
+    },
+    _tryPathWithExtensions0: function(path) {
+      var result = B._tryPath0(J.$add$ansx(path, ".sass"));
+      C.JSArray_methods.addAll$1(result, B._tryPath0(path + ".scss"));
+      return result.length !== 0 ? result : B._tryPath0(path + ".css");
+    },
+    _tryPath0: function(path) {
+      var t1 = $.$get$context(),
+        partial = D.join(t1.dirname$1(path), "_" + H.S(X.ParsedPath_ParsedPath$parse(path, t1.style).get$basename()), null);
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      if (B.fileExists0(partial))
+        t1.push(partial);
+      if (B.fileExists0(path))
+        t1.push(path);
+      return t1;
+    },
+    _tryPathAsDirectory0: function(path) {
+      var t1;
+      if (!B.dirExists0(path))
+        return null;
+      t1 = $._inImportRule0 ? new B._tryPathAsDirectory_closure0(path).call$0() : null;
+      return t1 == null ? B._exactlyOne0(B._tryPathWithExtensions0(D.join(path, "index", null))) : t1;
+    },
+    _exactlyOne0: function(paths) {
+      var t1 = paths.length;
+      if (t1 === 0)
+        return null;
+      if (t1 === 1)
+        return C.JSArray_methods.get$first(paths);
+      throw H.wrapException(string$.It_s_n + C.JSArray_methods.map$1$1(paths, new B._exactlyOne_closure0(), type$.legacy_String).join$1(0, "\n"));
+    },
+    resolveImportPath_closure1: function resolveImportPath_closure1(t0, t1) {
+      this.path = t0;
+      this.extension = t1;
+    },
+    resolveImportPath_closure2: function resolveImportPath_closure2(t0) {
+      this.path = t0;
+    },
+    _tryPathAsDirectory_closure0: function _tryPathAsDirectory_closure0(t0) {
+      this.path = t0;
+    },
+    _exactlyOne_closure0: function _exactlyOne_closure0() {
+    },
+    forwardToString: function(klass) {
+      klass.prototype.toString = P.allowInteropCaptureThis(new B.forwardToString_closure());
+    },
+    jsForEach: function(object, callback) {
+      var t1, t2;
+      for (t1 = J.get$iterator$ax(self.Object.keys(object)); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        callback.call$2(t2, object[t2]);
+      }
+    },
+    createClass: function($name, $constructor, methods) {
+      var klass = P.allowInteropCaptureThis($constructor);
+      self.Object.defineProperty(klass, "name", {value: $name});
+      methods.forEach$1(0, new B.createClass_closure(klass.prototype));
+      return klass;
+    },
+    injectSuperclass: function(object, $constructor) {
+      var $prototype = self.Object.getPrototypeOf(object),
+        $parent = self.Object.getPrototypeOf($prototype);
+      if ($parent != null)
+        self.Object.setPrototypeOf($constructor.prototype, $parent);
+      self.Object.setPrototypeOf($prototype, self.Object.create($constructor.prototype));
+    },
+    forwardToString_closure: function forwardToString_closure() {
+    },
+    createClass_closure: function createClass_closure(t0) {
+      this.$prototype = t0;
+    },
+    _PropertyDescriptor0: function _PropertyDescriptor0() {
+    },
+    toSentence0: function(iter, conjunction) {
+      var t1 = iter.__internal$_iterable,
+        t2 = J.getInterceptor$asx(t1);
+      if (t2.get$length(t1) === 1)
+        return J.toString$0$(iter._f.call$1(t2.get$first(t1)));
+      return H.TakeIterable_TakeIterable(iter, t2.get$length(t1) - 1, H._instanceType(iter)._eval$1("Iterable.E")).join$1(0, ", ") + (" " + conjunction + " " + H.S(iter._f.call$1(t2.get$last(t1))));
+    },
+    indent0: function(string, indentation) {
+      return new H.MappedListIterable(H.setRuntimeTypeInfo(string.split("\n"), type$.JSArray_String), new B.indent_closure0(indentation), type$.MappedListIterable_of_String_and_legacy_String).join$1(0, "\n");
+    },
+    pluralize0: function($name, number, plural) {
+      if (number === 1)
+        return $name;
+      if (plural != null)
+        return plural;
+      return $name + "s";
+    },
+    trimAscii0: function(string, excludeEscape) {
+      var start = B._firstNonWhitespace0(string);
+      return start == null ? "" : J.substring$2$s(string, start, B._lastNonWhitespace0(string, true) + 1);
+    },
+    trimAsciiRight0: function(string, excludeEscape) {
+      var end = B._lastNonWhitespace0(string, excludeEscape);
+      return end == null ? "" : J.substring$2$s(string, 0, end + 1);
+    },
+    _firstNonWhitespace0: function(string) {
+      var t1, i, t2;
+      for (t1 = string.length, i = 0; i < t1; ++i) {
+        t2 = C.JSString_methods._codeUnitAt$1(string, i);
+        if (!(t2 === 32 || t2 === 9 || t2 === 10 || t2 === 13 || t2 === 12))
+          return i;
+      }
+      return null;
+    },
+    _lastNonWhitespace0: function(string, excludeEscape) {
+      var t1, i, t2, codeUnit;
+      for (t1 = string.length, i = t1 - 1, t2 = J.getInterceptor$s(string); i >= 0; --i) {
+        codeUnit = t2.codeUnitAt$1(string, i);
+        if (!(codeUnit === 32 || codeUnit === 9 || codeUnit === 10 || codeUnit === 13 || codeUnit === 12))
+          if (excludeEscape && i !== 0 && i !== t1 && codeUnit === 92)
+            return i + 1;
+          else
+            return i;
+      }
+      return null;
+    },
+    isPublic0: function(member) {
+      var start = J._codeUnitAt$1$s(member, 0);
+      return start !== 45 && start !== 95;
+    },
+    flattenVertically0: function(iterable, $T) {
+      var result,
+        t1 = iterable.$ti._eval$1("@<ListIterable.E>")._bind$1($T._eval$1("QueueList<0*>*"))._eval$1("MappedListIterable<1,2>"),
+        queues = P.List_List$from(new H.MappedListIterable(iterable, new B.flattenVertically_closure1($T), t1), true, t1._eval$1("ListIterable.E"));
+      if (queues.length === 1)
+        return C.JSArray_methods.get$first(queues);
+      result = H.setRuntimeTypeInfo([], $T._eval$1("JSArray<0*>"));
+      for (; queues.length !== 0;) {
+        if (!!queues.fixed$length)
+          H.throwExpression(P.UnsupportedError$("removeWhere"));
+        C.JSArray_methods._removeWhere$2(queues, new B.flattenVertically_closure2(result, $T), true);
+      }
+      return result;
+    },
+    firstOrNull0: function(iterable) {
+      var iterator = J.get$iterator$ax(iterable);
+      return iterator.moveNext$0() ? iterator.get$current(iterator) : null;
+    },
+    codepointIndexToCodeUnitIndex0: function(string, codepointIndex) {
+      var t1, codeUnitIndex, i, codeUnitIndex0, t2;
+      for (t1 = J.getInterceptor$s(string), codeUnitIndex = 0, i = 0; i < codepointIndex; ++i) {
+        codeUnitIndex0 = codeUnitIndex + 1;
+        t2 = t1._codeUnitAt$1(string, codeUnitIndex);
+        codeUnitIndex = t2 >= 55296 && t2 <= 56319 ? codeUnitIndex0 + 1 : codeUnitIndex0;
+      }
+      return codeUnitIndex;
+    },
+    codeUnitIndexToCodepointIndex0: function(string, codeUnitIndex) {
+      var t1, codepointIndex, i, t2;
+      for (t1 = J.getInterceptor$s(string), codepointIndex = 0, i = 0; i < codeUnitIndex; i = (t2 >= 55296 && t2 <= 56319 ? i + 1 : i) + 1) {
+        ++codepointIndex;
+        t2 = t1._codeUnitAt$1(string, i);
+      }
+      return codepointIndex;
+    },
+    frameForSpan0: function(span, member, url) {
+      var t2, t3, t4,
+        t1 = url == null ? span.file.url : url;
+      if (t1 == null)
+        t1 = $.$get$_noSourceUrl0();
+      t2 = span.file;
+      t3 = span._file$_start;
+      t4 = Y.FileLocation$_(t2, t3);
+      t4 = t4.file.getLine$1(t4.offset);
+      t3 = Y.FileLocation$_(t2, t3);
+      return new A.Frame(t1, t4 + 1, t3.file.getColumn$1(t3.offset) + 1, member);
+    },
+    spanForList0: function(nodes) {
+      var t1, left, right, _null = null;
+      if (nodes.length === 0)
+        return _null;
+      t1 = C.JSArray_methods.get$first(nodes);
+      left = t1 == null ? _null : t1.get$span();
+      if (left == null)
+        return _null;
+      t1 = C.JSArray_methods.get$last(nodes);
+      right = t1 == null ? _null : t1.get$span();
+      if (right == null)
+        return _null;
+      return left.expand$1(0, right);
+    },
+    declarationName0: function(span) {
+      var text = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(span.file._decodedChars, span._file$_start, span._end), 0, null);
+      return B.trimAsciiRight0(C.JSString_methods.substring$2(text, 0, C.JSString_methods.indexOf$1(text, ":")), false);
+    },
+    unvendor0: function($name) {
+      var i,
+        t1 = $name.length;
+      if (t1 < 2)
+        return $name;
+      if (J.getInterceptor$s($name)._codeUnitAt$1($name, 0) !== 45)
+        return $name;
+      if (C.JSString_methods._codeUnitAt$1($name, 1) === 45)
+        return $name;
+      for (i = 2; i < t1; ++i)
+        if (C.JSString_methods._codeUnitAt$1($name, i) === 45)
+          return C.JSString_methods.substring$1($name, i + 1);
+      return $name;
+    },
+    equalsIgnoreCase0: function(string1, string2) {
+      var t1, i;
+      if (string1 == string2)
+        return true;
+      if (string1 == null || string2 == null)
+        return false;
+      t1 = string1.length;
+      if (t1 !== string2.length)
+        return false;
+      for (i = 0; i < t1; ++i)
+        if (!T.characterEqualsIgnoreCase0(C.JSString_methods._codeUnitAt$1(string1, i), C.JSString_methods._codeUnitAt$1(string2, i)))
+          return false;
+      return true;
+    },
+    startsWithIgnoreCase0: function(string, prefix) {
+      var t2, i,
+        t1 = prefix.length;
+      if (string.length < t1)
+        return false;
+      for (t2 = J.getInterceptor$s(string), i = 0; i < t1; ++i)
+        if (!T.characterEqualsIgnoreCase0(t2._codeUnitAt$1(string, i), C.JSString_methods._codeUnitAt$1(prefix, i)))
+          return false;
+      return true;
+    },
+    mapInPlace0: function(list, $function) {
+      var i;
+      for (i = 0; i < list.length; ++i)
+        list[i] = $function.call$1(list[i]);
+    },
+    longestCommonSubsequence0: function(list1, list2, select, $T) {
+      var t1, lengths, selections, t2, i, i0, j, selection, t3, j0, t4, t5;
+      if (select == null)
+        select = new B.longestCommonSubsequence_closure2($T);
+      t1 = J.getInterceptor$asx(list1);
+      lengths = P.List_List$generate(t1.get$length(list1) + 1, new B.longestCommonSubsequence_closure3(list2), false, type$.legacy_List_legacy_int);
+      selections = P.List_List$generate(t1.get$length(list1), new B.longestCommonSubsequence_closure4(list2, $T), false, $T._eval$1("List<0*>*"));
+      for (t2 = J.getInterceptor$asx(list2), i = 0; i < t1.get$length(list1); i = i0)
+        for (i0 = i + 1, j = 0; j < t2.get$length(list2); j = j0) {
+          selection = select.call$2(t1.$index(list1, i), t2.$index(list2, j));
+          J.$indexSet$ax(selections[i], j, selection);
+          t3 = lengths[i0];
+          j0 = j + 1;
+          if (selection == null) {
+            t4 = J.$index$asx(t3, j);
+            t5 = J.$index$asx(lengths[i], j0);
+            t5 = Math.max(H.checkNum(t4), H.checkNum(t5));
+            t4 = t5;
+          } else
+            t4 = J.$index$asx(lengths[i], j) + 1;
+          J.$indexSet$ax(t3, j0, t4);
+        }
+      return new B.longestCommonSubsequence_backtrack0(selections, lengths, $T).call$2(t1.get$length(list1) - 1, t2.get$length(list2) - 1);
+    },
+    removeFirstWhere0: function(list, test, orElse) {
+      var toRemove, element,
+        t1 = list.length,
+        _i = 0;
+      while (true) {
+        if (!(_i < list.length)) {
+          toRemove = null;
+          break;
+        }
+        c$0: {
+          element = list[_i];
+          if (!test.call$1(element))
+            break c$0;
+          toRemove = element;
+          break;
+        }
+        list.length === t1 || (0, H.throwConcurrentModificationError)(list);
+        ++_i;
+      }
+      if (toRemove == null)
+        return orElse.call$0();
+      else {
+        C.JSArray_methods.remove$1(list, toRemove);
+        return toRemove;
+      }
+    },
+    mapAddAll20: function(destination, source, K1, K2, $V) {
+      source.forEach$1(0, new B.mapAddAll2_closure0(destination, K1, K2, $V));
+    },
+    setAll0: function(map, keys, value) {
+      var t1;
+      for (t1 = J.get$iterator$ax(keys); t1.moveNext$0();)
+        map.$indexSet(0, t1.get$current(t1), value);
+    },
+    rotateSlice0: function(list, start, end) {
+      var i, next,
+        element = list.$index(0, end - 1);
+      for (i = start; i < end; ++i, element = next) {
+        next = list.$index(0, i);
+        list.$indexSet(0, i, element);
+      }
+    },
+    mapAsync0: function(iterable, callback, $E, $F) {
+      return B.mapAsync$body0(iterable, callback, $E, $F, $F._eval$1("Iterable<0*>*"));
+    },
+    mapAsync$body0: function(iterable, callback, $E, $F, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, t2, _i, t1, $async$temp1;
+      var $async$mapAsync0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = H.setRuntimeTypeInfo([], $F._eval$1("JSArray<0*>"));
+              t2 = iterable.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$temp1 = t1;
+              $async$goto = 6;
+              return P._asyncAwait(callback.call$1(iterable[_i]), $async$mapAsync0);
+            case 6:
+              // returning from await.
+              $async$temp1.push($async$result);
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = t1;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$mapAsync0, $async$completer);
+    },
+    putIfAbsentAsync0: function(map, key, ifAbsent, $K, $V) {
+      return B.putIfAbsentAsync$body0(map, key, ifAbsent, $K, $V, $V._eval$1("0*"));
+    },
+    putIfAbsentAsync$body0: function(map, key, ifAbsent, $K, $V, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, value;
+      var $async$putIfAbsentAsync0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (map.containsKey$1(key)) {
+                $async$returnValue = map.$index(0, key);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 3;
+              return P._asyncAwait(ifAbsent.call$0(), $async$putIfAbsentAsync0);
+            case 3:
+              // returning from await.
+              value = $async$result;
+              map.$indexSet(0, key, value);
+              $async$returnValue = value;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$putIfAbsentAsync0, $async$completer);
+    },
+    copyMapOfMap0: function(map, K1, K2, $V) {
+      var t2, t3, t4, t5, t6, t7,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(K1._eval$1("0*"), K2._eval$1("@<0>")._bind$1($V)._eval$1("Map<1*,2*>*"));
+      for (t2 = map.get$entries(map), t2 = t2.get$iterator(t2), t3 = K2._eval$1("0*"), t4 = $V._eval$1("0*"); t2.moveNext$0();) {
+        t5 = t2.get$current(t2);
+        t6 = t5.key;
+        t5 = t5.value;
+        t7 = P.LinkedHashMap_LinkedHashMap(null, null, null, t3, t4);
+        t7.addAll$1(0, t5);
+        t1.$indexSet(0, t6, t7);
+      }
+      return t1;
+    },
+    copyMapOfList0: function(map, $K, $E) {
+      var t2, t3,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty($K._eval$1("0*"), $E._eval$1("List<0*>*"));
+      for (t2 = map.get$entries(map), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t1.$indexSet(0, t3.key, J.toList$0$ax(t3.value));
+      }
+      return t1;
+    },
+    SpanExtensions_trim0: function(_this) {
+      var t3, end, end0,
+        t1 = _this.file,
+        t2 = _this._file$_start,
+        text = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1._decodedChars, t2, _this._end), 0, null),
+        start = 0;
+      while (true) {
+        t3 = C.JSString_methods._codeUnitAt$1(text, start);
+        if (!(t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12))
+          break;
+        ++start;
+      }
+      end = text.length - 1;
+      end0 = end;
+      while (true) {
+        t3 = C.JSString_methods.codeUnitAt$1(text, end0);
+        if (!(t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12))
+          break;
+        --end0;
+      }
+      return start === 0 && end0 === end ? _this : t1.span$2(Y.FileLocation$_(t1, t2).offset + start, Y.FileLocation$_(t1, t2).offset + end0 + 1);
+    },
+    indent_closure0: function indent_closure0(t0) {
+      this.indentation = t0;
+    },
+    flattenVertically_closure1: function flattenVertically_closure1(t0) {
+      this.T = t0;
+    },
+    flattenVertically_closure2: function flattenVertically_closure2(t0, t1) {
+      this.result = t0;
+      this.T = t1;
+    },
+    longestCommonSubsequence_closure2: function longestCommonSubsequence_closure2(t0) {
+      this.T = t0;
+    },
+    longestCommonSubsequence_closure3: function longestCommonSubsequence_closure3(t0) {
+      this.list2 = t0;
+    },
+    longestCommonSubsequence_closure4: function longestCommonSubsequence_closure4(t0, t1) {
+      this.list2 = t0;
+      this.T = t1;
+    },
+    longestCommonSubsequence_backtrack0: function longestCommonSubsequence_backtrack0(t0, t1, t2) {
+      this.selections = t0;
+      this.lengths = t1;
+      this.T = t2;
+    },
+    mapAddAll2_closure0: function mapAddAll2_closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _.destination = t0;
+      _.K1 = t1;
+      _.K2 = t2;
+      _.V = t3;
+    },
+    isAlphabetic: function(char) {
+      var t1;
+      if (!(char >= 65 && char <= 90))
+        t1 = char >= 97 && char <= 122;
+      else
+        t1 = true;
+      return t1;
+    },
+    isDriveLetter: function(path, index) {
+      var t1 = path.length,
+        t2 = index + 2;
+      if (t1 < t2)
+        return false;
+      if (!B.isAlphabetic(C.JSString_methods.codeUnitAt$1(path, index)))
+        return false;
+      if (C.JSString_methods.codeUnitAt$1(path, index + 1) !== 58)
+        return false;
+      if (t1 === t2)
+        return true;
+      return C.JSString_methods.codeUnitAt$1(path, t2) === 47;
+    },
+    isAllTheSame: function(iter) {
+      var t1, lastValue, cur;
+      for (t1 = new H.ListIterator(iter, iter.get$length(iter)), lastValue = null; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (lastValue == null)
+          lastValue = cur;
+        else if (!J.$eq$(cur, lastValue))
+          return false;
+      }
+      return true;
+    },
+    replaceFirstNull: function(list, element) {
+      var index = C.JSArray_methods.indexOf$1(list, null);
+      if (index < 0)
+        throw H.wrapException(P.ArgumentError$(H.S(list) + " contains no null elements."));
+      list[index] = element;
+    },
+    replaceWithNull: function(list, element) {
+      var index = C.JSArray_methods.indexOf$1(list, element);
+      if (index < 0)
+        throw H.wrapException(P.ArgumentError$(H.S(list) + " contains no elements matching " + element.toString$0(0) + "."));
+      list[index] = null;
+    },
+    countCodeUnits: function(string, codeUnit) {
+      var t1, count, cur;
+      for (t1 = new H.CodeUnits(string), t1 = new H.ListIterator(t1, t1.get$length(t1)), count = 0; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur === codeUnit)
+          ++count;
+      }
+      return count;
+    },
+    findLineStart: function(context, text, column) {
+      var beginningOfLine, index, lineStart;
+      if (text.length === 0)
+        for (beginningOfLine = 0; true;) {
+          index = C.JSString_methods.indexOf$2(context, "\n", beginningOfLine);
+          if (index === -1)
+            return context.length - beginningOfLine >= column ? beginningOfLine : null;
+          if (index - beginningOfLine >= column)
+            return beginningOfLine;
+          beginningOfLine = index + 1;
+        }
+      index = C.JSString_methods.indexOf$1(context, text);
+      for (; index !== -1;) {
+        lineStart = index === 0 ? 0 : C.JSString_methods.lastIndexOf$2(context, "\n", index - 1) + 1;
+        if (column === index - lineStart)
+          return lineStart;
+        index = C.JSString_methods.indexOf$2(context, text, index + 1);
+      }
+      return null;
+    },
+    validateErrorArgs: function(string, match, position, $length) {
+      var t2,
+        t1 = position != null;
+      if (t1)
+        if (position < 0)
+          throw H.wrapException(P.RangeError$("position must be greater than or equal to 0."));
+        else if (position > string.length)
+          throw H.wrapException(P.RangeError$("position must be less than or equal to the string length."));
+      t2 = $length != null;
+      if (t2 && $length < 0)
+        throw H.wrapException(P.RangeError$("length must be greater than or equal to 0."));
+      if (t1 && t2 && position + $length > string.length)
+        throw H.wrapException(P.RangeError$("position plus length must not go beyond the end of the string."));
+    }
+  },
+  O = {
+    EmptyUnmodifiableSet__throw: function() {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable Set"));
+    },
+    EmptyUnmodifiableSet: function EmptyUnmodifiableSet(t0) {
+      this.$ti = t0;
+    },
+    Style__getPlatformStyle: function() {
+      if (P.Uri_base().get$scheme() !== "file")
+        return $.$get$Style_url();
+      var t1 = P.Uri_base();
+      if (!C.JSString_methods.endsWith$1(t1.get$path(t1), "/"))
+        return $.$get$Style_url();
+      if (P._Uri__Uri(null, "a/b", null, null).toFilePath$0() === "a\\b")
+        return $.$get$Style_windows();
+      return $.$get$Style_posix();
+    },
+    Style: function Style() {
+    },
+    NullExpression: function NullExpression(t0) {
+      this.span = t0;
+    },
+    AsyncImportCache__toImporters: function(importers, loadPaths, packageResolver) {
+      var _i, t2, t3, path, _null = null,
+        sassPath = H._asStringS(J.get$env$x(self.process).SASS_PATH),
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AsyncImporter);
+      for (_i = 0; false; ++_i)
+        t1.push(importers[_i]);
+      if (loadPaths != null)
+        for (t2 = J.get$iterator$ax(loadPaths); t2.moveNext$0();) {
+          t3 = t2.get$current(t2);
+          t1.push(new F.FilesystemImporter($.$get$context().absolute$7(t3, _null, _null, _null, _null, _null, _null)));
+        }
+      if (sassPath != null) {
+        t2 = sassPath.split(J.$eq$(J.get$platform$x(self.process), "win32") ? ";" : ":");
+        t3 = t2.length;
+        _i = 0;
+        for (; _i < t3; ++_i) {
+          path = t2[_i];
+          t1.push(new F.FilesystemImporter($.$get$context().absolute$7(path, _null, _null, _null, _null, _null, _null)));
+        }
+      }
+      return t1;
+    },
+    AsyncImportCache: function AsyncImportCache(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._async_import_cache$_importers = t0;
+      _._async_import_cache$_logger = t1;
+      _._async_import_cache$_canonicalizeCache = t2;
+      _._async_import_cache$_importCache = t3;
+      _._async_import_cache$_resultsCache = t4;
+    },
+    AsyncImportCache_canonicalize_closure: function AsyncImportCache_canonicalize_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.url = t1;
+      this.forImport = t2;
+    },
+    AsyncImportCache__canonicalize_closure: function AsyncImportCache__canonicalize_closure(t0, t1) {
+      this.importer = t0;
+      this.url = t1;
+    },
+    AsyncImportCache_importCanonical_closure: function AsyncImportCache_importCanonical_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.importer = t1;
+      _.canonicalUrl = t2;
+      _.originalUrl = t3;
+    },
+    AsyncImportCache_humanize_closure: function AsyncImportCache_humanize_closure(t0) {
+      this.canonicalUrl = t0;
+    },
+    AsyncImportCache_humanize_closure0: function AsyncImportCache_humanize_closure0() {
+    },
+    AsyncImportCache_humanize_closure1: function AsyncImportCache_humanize_closure1() {
+    },
+    Environment$: function(sourceMap) {
+      var _null = null,
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_Module_legacy_Callable,
+        t3 = type$.legacy_AstNode,
+        t4 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_Callable),
+        t5 = H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Value)], type$.JSArray_legacy_Map_of_legacy_String_and_legacy_Value),
+        t6 = sourceMap ? H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t3)], type$.JSArray_legacy_Map_of_legacy_String_and_legacy_AstNode) : _null,
+        t7 = type$.legacy_int,
+        t8 = type$.legacy_Callable,
+        t9 = type$.JSArray_legacy_Map_of_legacy_String_and_legacy_Callable;
+      return new O.Environment(P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), P.LinkedHashMap_LinkedHashMap$_empty(t1, t3), P.LinkedHashSet_LinkedHashSet$_empty(t2), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), _null, _null, _null, t4, t5, t6, P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t8)], t9), P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t8)], t9), P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), _null);
+    },
+    Environment$_: function(_modules, _namespaceNodes, _globalModules, _globalModuleNodes, _forwardedModules, _forwardedModuleNodes, _nestedForwardedModules, _allModules, _variables, _variableNodes, _functions, _mixins, _content) {
+      var t1 = type$.legacy_String,
+        t2 = type$.legacy_int;
+      return new O.Environment(_modules, _namespaceNodes, _globalModules, _globalModuleNodes, _forwardedModules, _forwardedModuleNodes, _nestedForwardedModules, _allModules, _variables, _variableNodes, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _functions, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _mixins, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _content);
+    },
+    _EnvironmentModule__EnvironmentModule: function(environment, css, extender, forwarded) {
+      var t1, t2, t3, t4, t5, t6;
+      if (forwarded == null)
+        forwarded = C.Set_empty;
+      t1 = O._EnvironmentModule__makeModulesByVariable(forwarded);
+      t2 = H._instanceType(forwarded);
+      t3 = O._EnvironmentModule__memberMap(C.JSArray_methods.get$first(environment._variables), new H.EfficientLengthMappedIterable(forwarded, new O._EnvironmentModule__EnvironmentModule_closure(), t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,Value*>*>")), type$.legacy_Value);
+      t4 = environment._variableNodes;
+      t4 = t4 == null ? null : O._EnvironmentModule__memberMap(C.JSArray_methods.get$first(t4), new H.EfficientLengthMappedIterable(forwarded, new O._EnvironmentModule__EnvironmentModule_closure0(), t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,AstNode*>*>")), type$.legacy_AstNode);
+      t2 = t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,Callable*>*>");
+      t5 = type$.legacy_Callable;
+      t6 = O._EnvironmentModule__memberMap(C.JSArray_methods.get$first(environment._functions), new H.EfficientLengthMappedIterable(forwarded, new O._EnvironmentModule__EnvironmentModule_closure1(), t2), t5);
+      t5 = O._EnvironmentModule__memberMap(C.JSArray_methods.get$first(environment._mixins), new H.EfficientLengthMappedIterable(forwarded, new O._EnvironmentModule__EnvironmentModule_closure2(), t2), t5);
+      t2 = J.get$isNotEmpty$asx(css.get$children(css)) || C.JSArray_methods.any$1(environment._allModules, new O._EnvironmentModule__EnvironmentModule_closure3());
+      return O._EnvironmentModule$_(environment, css, extender, t1, t3, t4, t6, t5, t2, !extender.get$isEmpty(extender) || C.JSArray_methods.any$1(environment._allModules, new O._EnvironmentModule__EnvironmentModule_closure4()));
+    },
+    _EnvironmentModule__makeModulesByVariable: function(forwarded) {
+      var modulesByVariable, t1, t2, t3, t4, t5;
+      if (forwarded.get$isEmpty(forwarded))
+        return C.Map_empty0;
+      modulesByVariable = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Module_legacy_Callable);
+      for (t1 = forwarded.get$iterator(forwarded); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        if (t2 instanceof O._EnvironmentModule) {
+          for (t3 = t2._modulesByVariable, t3 = t3.get$values(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+            t4 = t3.get$current(t3);
+            t5 = t4.get$variables();
+            B.setAll(modulesByVariable, t5.get$keys(t5), t4);
+          }
+          B.setAll(modulesByVariable, J.get$keys$z(C.JSArray_methods.get$first(t2._environment._variables)), t2);
+        } else {
+          t3 = t2.get$variables();
+          B.setAll(modulesByVariable, t3.get$keys(t3), t2);
+        }
+      }
+      return modulesByVariable;
+    },
+    _EnvironmentModule__memberMap: function(localMap, otherMaps, $V) {
+      var t1, t2, t3, cur;
+      localMap = new U.PublicMemberMapView(localMap, $V._eval$1("PublicMemberMapView<0*>"));
+      t1 = otherMaps.__internal$_iterable;
+      t2 = J.getInterceptor$asx(t1);
+      if (t2.get$isEmpty(t1))
+        return localMap;
+      t3 = H.setRuntimeTypeInfo([], $V._eval$1("JSArray<Map<String*,0*>*>"));
+      for (t1 = new H.MappedIterator(t2.get$iterator(t1), otherMaps._f); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur.get$isNotEmpty(cur))
+          t3.push(cur);
+      }
+      t3.push(localMap);
+      if (t3.length === 1)
+        return localMap;
+      return Z.MergedMapView$(t3, type$.legacy_String, $V._eval$1("0*"));
+    },
+    _EnvironmentModule$_: function(_environment, css, extender, _modulesByVariable, variables, variableNodes, functions, mixins, transitivelyContainsCss, transitivelyContainsExtensions) {
+      return new O._EnvironmentModule(_environment._allModules, variables, variableNodes, functions, mixins, extender, css, transitivelyContainsCss, transitivelyContainsExtensions, _environment, _modulesByVariable);
+    },
+    Environment: function Environment(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15) {
+      var _ = this;
+      _._environment$_modules = t0;
+      _._namespaceNodes = t1;
+      _._globalModules = t2;
+      _._globalModuleNodes = t3;
+      _._forwardedModules = t4;
+      _._forwardedModuleNodes = t5;
+      _._nestedForwardedModules = t6;
+      _._allModules = t7;
+      _._variables = t8;
+      _._variableNodes = t9;
+      _._variableIndices = t10;
+      _._functions = t11;
+      _._functionIndices = t12;
+      _._mixins = t13;
+      _._mixinIndices = t14;
+      _._content = t15;
+      _._inMixin = false;
+      _._inSemiGlobalScope = true;
+      _._lastVariableIndex = _._lastVariableName = null;
+    },
+    Environment_importForwards_closure: function Environment_importForwards_closure() {
+    },
+    Environment_importForwards_closure0: function Environment_importForwards_closure0() {
+    },
+    Environment_importForwards_closure1: function Environment_importForwards_closure1() {
+    },
+    Environment_importForwards_closure2: function Environment_importForwards_closure2() {
+    },
+    Environment__getVariableFromGlobalModule_closure: function Environment__getVariableFromGlobalModule_closure(t0) {
+      this.name = t0;
+    },
+    Environment_setVariable_closure: function Environment_setVariable_closure(t0, t1) {
+      this.$this = t0;
+      this.name = t1;
+    },
+    Environment_setVariable_closure0: function Environment_setVariable_closure0(t0) {
+      this.name = t0;
+    },
+    Environment_setVariable_closure1: function Environment_setVariable_closure1(t0, t1) {
+      this.$this = t0;
+      this.name = t1;
+    },
+    Environment__getFunctionFromGlobalModule_closure: function Environment__getFunctionFromGlobalModule_closure(t0) {
+      this.name = t0;
+    },
+    Environment__getMixinFromGlobalModule_closure: function Environment__getMixinFromGlobalModule_closure(t0) {
+      this.name = t0;
+    },
+    _EnvironmentModule: function _EnvironmentModule(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) {
+      var _ = this;
+      _.upstream = t0;
+      _.variables = t1;
+      _.variableNodes = t2;
+      _.functions = t3;
+      _.mixins = t4;
+      _.extender = t5;
+      _.css = t6;
+      _.transitivelyContainsCss = t7;
+      _.transitivelyContainsExtensions = t8;
+      _._environment = t9;
+      _._modulesByVariable = t10;
+    },
+    _EnvironmentModule__EnvironmentModule_closure: function _EnvironmentModule__EnvironmentModule_closure() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure0: function _EnvironmentModule__EnvironmentModule_closure0() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure1: function _EnvironmentModule__EnvironmentModule_closure1() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure2: function _EnvironmentModule__EnvironmentModule_closure2() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure3: function _EnvironmentModule__EnvironmentModule_closure3() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure4: function _EnvironmentModule__EnvironmentModule_closure4() {
+    },
+    SassNull: function SassNull() {
+    },
+    AsyncImportCache$none: function(logger) {
+      var t1 = type$.legacy_Uri;
+      return new O.AsyncImportCache0(C.C_StderrLogger, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Tuple2_of_legacy_Uri_and_legacy_bool, type$.legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Stylesheet), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_ImporterResult));
+    },
+    AsyncImportCache0: function AsyncImportCache0(t0, t1, t2, t3) {
+      var _ = this;
+      _._async_import_cache0$_logger = t0;
+      _._async_import_cache0$_canonicalizeCache = t1;
+      _._async_import_cache0$_importCache = t2;
+      _._async_import_cache0$_resultsCache = t3;
+    },
+    AsyncImportCache_canonicalize_closure0: function AsyncImportCache_canonicalize_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.url = t1;
+      this.forImport = t2;
+    },
+    AsyncImportCache__canonicalize_closure0: function AsyncImportCache__canonicalize_closure0(t0, t1) {
+      this.importer = t0;
+      this.url = t1;
+    },
+    AsyncImportCache_importCanonical_closure0: function AsyncImportCache_importCanonical_closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.importer = t1;
+      _.canonicalUrl = t2;
+      _.originalUrl = t3;
+    },
+    AsyncImportCache_humanize_closure2: function AsyncImportCache_humanize_closure2(t0) {
+      this.canonicalUrl = t0;
+    },
+    AsyncImportCache_humanize_closure3: function AsyncImportCache_humanize_closure3() {
+    },
+    AsyncImportCache_humanize_closure4: function AsyncImportCache_humanize_closure4() {
+    },
+    Environment$0: function(sourceMap) {
+      var _null = null,
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_Module_legacy_Callable_2,
+        t3 = type$.legacy_AstNode_2,
+        t4 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_Callable_2),
+        t5 = H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Value_2)], type$.JSArray_legacy_Map_of_legacy_String_and_legacy_Value_2),
+        t6 = sourceMap ? H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t3)], type$.JSArray_legacy_Map_of_legacy_String_and_legacy_AstNode_2) : _null,
+        t7 = type$.legacy_int,
+        t8 = type$.legacy_Callable_2,
+        t9 = type$.JSArray_legacy_Map_of_legacy_String_and_legacy_Callable_2;
+      return new O.Environment0(P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), P.LinkedHashMap_LinkedHashMap$_empty(t1, t3), P.LinkedHashSet_LinkedHashSet$_empty(t2), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), _null, _null, _null, t4, t5, t6, P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t8)], t9), P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), H.setRuntimeTypeInfo([P.LinkedHashMap_LinkedHashMap$_empty(t1, t8)], t9), P.LinkedHashMap_LinkedHashMap$_empty(t1, t7), _null);
+    },
+    Environment$_0: function(_modules, _namespaceNodes, _globalModules, _globalModuleNodes, _forwardedModules, _forwardedModuleNodes, _nestedForwardedModules, _allModules, _variables, _variableNodes, _functions, _mixins, _content) {
+      var t1 = type$.legacy_String,
+        t2 = type$.legacy_int;
+      return new O.Environment0(_modules, _namespaceNodes, _globalModules, _globalModuleNodes, _forwardedModules, _forwardedModuleNodes, _nestedForwardedModules, _allModules, _variables, _variableNodes, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _functions, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _mixins, P.LinkedHashMap_LinkedHashMap$_empty(t1, t2), _content);
+    },
+    _EnvironmentModule__EnvironmentModule1: function(environment, css, extender, forwarded) {
+      var t1, t2, t3, t4, t5, t6;
+      if (forwarded == null)
+        forwarded = C.Set_empty2;
+      t1 = O._EnvironmentModule__makeModulesByVariable1(forwarded);
+      t2 = H._instanceType(forwarded);
+      t3 = O._EnvironmentModule__memberMap1(C.JSArray_methods.get$first(environment._environment0$_variables), new H.EfficientLengthMappedIterable(forwarded, new O._EnvironmentModule__EnvironmentModule_closure11(), t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,Value0*>*>")), type$.legacy_Value_2);
+      t4 = environment._environment0$_variableNodes;
+      t4 = t4 == null ? null : O._EnvironmentModule__memberMap1(C.JSArray_methods.get$first(t4), new H.EfficientLengthMappedIterable(forwarded, new O._EnvironmentModule__EnvironmentModule_closure12(), t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,AstNode0*>*>")), type$.legacy_AstNode_2);
+      t2 = t2._eval$1("EfficientLengthMappedIterable<1,Map<String*,Callable0*>*>");
+      t5 = type$.legacy_Callable_2;
+      t6 = O._EnvironmentModule__memberMap1(C.JSArray_methods.get$first(environment._environment0$_functions), new H.EfficientLengthMappedIterable(forwarded, new O._EnvironmentModule__EnvironmentModule_closure13(), t2), t5);
+      t5 = O._EnvironmentModule__memberMap1(C.JSArray_methods.get$first(environment._environment0$_mixins), new H.EfficientLengthMappedIterable(forwarded, new O._EnvironmentModule__EnvironmentModule_closure14(), t2), t5);
+      t2 = J.get$isNotEmpty$asx(css.get$children(css)) || C.JSArray_methods.any$1(environment._environment0$_allModules, new O._EnvironmentModule__EnvironmentModule_closure15());
+      return O._EnvironmentModule$_1(environment, css, extender, t1, t3, t4, t6, t5, t2, !extender.get$isEmpty(extender) || C.JSArray_methods.any$1(environment._environment0$_allModules, new O._EnvironmentModule__EnvironmentModule_closure16()));
+    },
+    _EnvironmentModule__makeModulesByVariable1: function(forwarded) {
+      var modulesByVariable, t1, t2, t3, t4, t5;
+      if (forwarded.get$isEmpty(forwarded))
+        return C.Map_empty6;
+      modulesByVariable = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Module_legacy_Callable_2);
+      for (t1 = forwarded.get$iterator(forwarded); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        if (t2 instanceof O._EnvironmentModule1) {
+          for (t3 = t2._environment0$_modulesByVariable, t3 = t3.get$values(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+            t4 = t3.get$current(t3);
+            t5 = t4.get$variables();
+            B.setAll0(modulesByVariable, t5.get$keys(t5), t4);
+          }
+          B.setAll0(modulesByVariable, J.get$keys$z(C.JSArray_methods.get$first(t2._environment0$_environment._environment0$_variables)), t2);
+        } else {
+          t3 = t2.get$variables();
+          B.setAll0(modulesByVariable, t3.get$keys(t3), t2);
+        }
+      }
+      return modulesByVariable;
+    },
+    _EnvironmentModule__memberMap1: function(localMap, otherMaps, $V) {
+      var t1, t2, t3, cur;
+      localMap = new U.PublicMemberMapView0(localMap, $V._eval$1("PublicMemberMapView0<0*>"));
+      t1 = otherMaps.__internal$_iterable;
+      t2 = J.getInterceptor$asx(t1);
+      if (t2.get$isEmpty(t1))
+        return localMap;
+      t3 = H.setRuntimeTypeInfo([], $V._eval$1("JSArray<Map<String*,0*>*>"));
+      for (t1 = new H.MappedIterator(t2.get$iterator(t1), otherMaps._f); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur.get$isNotEmpty(cur))
+          t3.push(cur);
+      }
+      t3.push(localMap);
+      if (t3.length === 1)
+        return localMap;
+      return Z.MergedMapView$0(t3, type$.legacy_String, $V._eval$1("0*"));
+    },
+    _EnvironmentModule$_1: function(_environment, css, extender, _modulesByVariable, variables, variableNodes, functions, mixins, transitivelyContainsCss, transitivelyContainsExtensions) {
+      return new O._EnvironmentModule1(_environment._environment0$_allModules, variables, variableNodes, functions, mixins, extender, css, transitivelyContainsCss, transitivelyContainsExtensions, _environment, _modulesByVariable);
+    },
+    Environment0: function Environment0(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15) {
+      var _ = this;
+      _._environment0$_modules = t0;
+      _._environment0$_namespaceNodes = t1;
+      _._environment0$_globalModules = t2;
+      _._environment0$_globalModuleNodes = t3;
+      _._environment0$_forwardedModules = t4;
+      _._environment0$_forwardedModuleNodes = t5;
+      _._environment0$_nestedForwardedModules = t6;
+      _._environment0$_allModules = t7;
+      _._environment0$_variables = t8;
+      _._environment0$_variableNodes = t9;
+      _._environment0$_variableIndices = t10;
+      _._environment0$_functions = t11;
+      _._environment0$_functionIndices = t12;
+      _._environment0$_mixins = t13;
+      _._environment0$_mixinIndices = t14;
+      _._environment0$_content = t15;
+      _._environment0$_inMixin = false;
+      _._environment0$_inSemiGlobalScope = true;
+      _._environment0$_lastVariableIndex = _._environment0$_lastVariableName = null;
+    },
+    Environment_importForwards_closure3: function Environment_importForwards_closure3() {
+    },
+    Environment_importForwards_closure4: function Environment_importForwards_closure4() {
+    },
+    Environment_importForwards_closure5: function Environment_importForwards_closure5() {
+    },
+    Environment_importForwards_closure6: function Environment_importForwards_closure6() {
+    },
+    Environment__getVariableFromGlobalModule_closure0: function Environment__getVariableFromGlobalModule_closure0(t0) {
+      this.name = t0;
+    },
+    Environment_setVariable_closure2: function Environment_setVariable_closure2(t0, t1) {
+      this.$this = t0;
+      this.name = t1;
+    },
+    Environment_setVariable_closure3: function Environment_setVariable_closure3(t0) {
+      this.name = t0;
+    },
+    Environment_setVariable_closure4: function Environment_setVariable_closure4(t0, t1) {
+      this.$this = t0;
+      this.name = t1;
+    },
+    Environment__getFunctionFromGlobalModule_closure0: function Environment__getFunctionFromGlobalModule_closure0(t0) {
+      this.name = t0;
+    },
+    Environment__getMixinFromGlobalModule_closure0: function Environment__getMixinFromGlobalModule_closure0(t0) {
+      this.name = t0;
+    },
+    _EnvironmentModule1: function _EnvironmentModule1(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) {
+      var _ = this;
+      _.upstream = t0;
+      _.variables = t1;
+      _.variableNodes = t2;
+      _.functions = t3;
+      _.mixins = t4;
+      _.extender = t5;
+      _.css = t6;
+      _.transitivelyContainsCss = t7;
+      _.transitivelyContainsExtensions = t8;
+      _._environment0$_environment = t9;
+      _._environment0$_modulesByVariable = t10;
+    },
+    _EnvironmentModule__EnvironmentModule_closure11: function _EnvironmentModule__EnvironmentModule_closure11() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure12: function _EnvironmentModule__EnvironmentModule_closure12() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure13: function _EnvironmentModule__EnvironmentModule_closure13() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure14: function _EnvironmentModule__EnvironmentModule_closure14() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure15: function _EnvironmentModule__EnvironmentModule_closure15() {
+    },
+    _EnvironmentModule__EnvironmentModule_closure16: function _EnvironmentModule__EnvironmentModule_closure16() {
+    },
+    NullExpression0: function NullExpression0(t0) {
+      this.span = t0;
+    },
+    closure238: function closure238() {
+    },
+    _closure29: function _closure29() {
+    },
+    _closure30: function _closure30() {
+    },
+    SassNull0: function SassNull0() {
+    }
+  },
+  U = {DefaultEquality: function DefaultEquality() {
+    }, IterableEquality: function IterableEquality() {
+    }, ListEquality: function ListEquality() {
+    }, _MapEntry: function _MapEntry(t0, t1, t2) {
+      this.equality = t0;
+      this.key = t1;
+      this.value = t2;
+    }, MapEquality: function MapEquality() {
+    },
+    ModifiableCssAtRule$: function($name, span, childless, value) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode);
+      return new U.ModifiableCssAtRule($name, value, childless, span, new P.UnmodifiableListView(t1, type$.UnmodifiableListView_legacy_ModifiableCssNode), t1);
+    },
+    ModifiableCssAtRule: function ModifiableCssAtRule(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.name = t0;
+      _.value = t1;
+      _.isChildless = t2;
+      _.span = t3;
+      _.children = t4;
+      _._children = t5;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    ModifiableCssKeyframeBlock$: function(selector, span) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode);
+      return new U.ModifiableCssKeyframeBlock(selector, span, new P.UnmodifiableListView(t1, type$.UnmodifiableListView_legacy_ModifiableCssNode), t1);
+    },
+    ModifiableCssKeyframeBlock: function ModifiableCssKeyframeBlock(t0, t1, t2, t3) {
+      var _ = this;
+      _.selector = t0;
+      _.span = t1;
+      _.children = t2;
+      _._children = t3;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    AtRule$: function($name, span, children, value) {
+      var t1 = children == null ? null : P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = t1 == null ? null : C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new U.AtRule($name, value, span, t1, t2 === true);
+    },
+    AtRule: function AtRule(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.value = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    SupportsOperation: function SupportsOperation(t0, t1, t2, t3) {
+      var _ = this;
+      _.left = t0;
+      _.right = t1;
+      _.operator = t2;
+      _.span = t3;
+    },
+    _compileStylesheet: function(stylesheet, logger, importCache, nodeImporter, importer, functions, style, useSpaces, indentWidth, lineFeed, sourceMap, charset) {
+      var serializeResult = N.serialize(R._EvaluateVisitor$(functions, importCache, logger, nodeImporter, sourceMap).run$2(0, importer, stylesheet).stylesheet, charset, indentWidth, false, lineFeed, sourceMap, style, true),
+        t1 = serializeResult.sourceMap;
+      if (t1 != null && true)
+        B.mapInPlace(t1.urls, new U._compileStylesheet_closure(stylesheet, importCache));
+      return new X.CompileResult(serializeResult);
+    },
+    _compileStylesheet_closure: function _compileStylesheet_closure(t0, t1) {
+      this.stylesheet = t0;
+      this.importCache = t1;
+    },
+    SassParser: function SassParser(t0, t1, t2) {
+      var _ = this;
+      _._currentIndentation = 0;
+      _._spaces = _._nextIndentationEnd = _._nextIndentation = null;
+      _._isUseAllowed = true;
+      _._stylesheet$_inMixin = false;
+      _._mixinHasContent = null;
+      _._inParentheses = _._inStyleRule = _._stylesheet$_inUnknownAtRule = _._inControlDirective = _._inContentBlock = false;
+      _._globalVariables = t0;
+      _.lastSilentComment = null;
+      _.scanner = t1;
+      _.logger = t2;
+    },
+    SassParser_children_closure: function SassParser_children_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.children = t1;
+      this.child = t2;
+    },
+    MultiDirWatcher: function MultiDirWatcher(t0, t1, t2) {
+      this._watchers = t0;
+      this._group = t1;
+      this._poll = t2;
+    },
+    PublicMemberMapView: function PublicMemberMapView(t0, t1) {
+      this._inner = t0;
+      this.$ti = t1;
+    },
+    Highlighter$: function(span, color) {
+      var t1 = U.Highlighter__collateLines(H.setRuntimeTypeInfo([U._Highlight$(span, null, true)], type$.JSArray_legacy__Highlight)),
+        t2 = new U.Highlighter_closure(color).call$0(),
+        t3 = C.JSInt_methods.toString$0(C.JSArray_methods.get$last(t1).number + 1),
+        t4 = U.Highlighter__contiguous(t1) ? 0 : 3,
+        t5 = H._arrayInstanceType(t1);
+      return new U.Highlighter(t1, t2, null, 1 + Math.max(t3.length, t4), new H.MappedListIterable(t1, new U.Highlighter$__closure(), t5._eval$1("MappedListIterable<1,int*>")).reduce$1(0, H.instantiate1(P.math__max$closure(), type$.legacy_int)), !B.isAllTheSame(new H.MappedListIterable(t1, new U.Highlighter$__closure0(), t5._eval$1("MappedListIterable<1,Object*>"))), new P.StringBuffer(""));
+    },
+    Highlighter$multiple: function(primarySpan, primaryLabel, secondarySpans, color, primaryColor, secondaryColor) {
+      var t2, t3, t4, t5, t6,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy__Highlight);
+      t1.push(U._Highlight$(primarySpan, primaryLabel, true));
+      for (t2 = secondarySpans.get$entries(secondarySpans), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t1.push(U._Highlight$(t3.key, t3.value, false));
+      }
+      t1 = U.Highlighter__collateLines(t1);
+      if (color)
+        t2 = "\x1b[31m";
+      else
+        t2 = null;
+      if (color)
+        t3 = "\x1b[34m";
+      else
+        t3 = null;
+      t4 = C.JSInt_methods.toString$0(C.JSArray_methods.get$last(t1).number + 1);
+      t5 = U.Highlighter__contiguous(t1) ? 0 : 3;
+      t6 = H._arrayInstanceType(t1);
+      return new U.Highlighter(t1, t2, t3, 1 + Math.max(t4.length, t5), new H.MappedListIterable(t1, new U.Highlighter$__closure(), t6._eval$1("MappedListIterable<1,int*>")).reduce$1(0, H.instantiate1(P.math__max$closure(), type$.legacy_int)), !B.isAllTheSame(new H.MappedListIterable(t1, new U.Highlighter$__closure0(), t6._eval$1("MappedListIterable<1,Object*>"))), new P.StringBuffer(""));
+    },
+    Highlighter__contiguous: function(lines) {
+      var i, thisLine, nextLine;
+      for (i = 0; i < lines.length - 1;) {
+        thisLine = lines[i];
+        ++i;
+        nextLine = lines[i];
+        if (thisLine.number + 1 !== nextLine.number && J.$eq$(thisLine.url, nextLine.url))
+          return false;
+      }
+      return true;
+    },
+    Highlighter__collateLines: function(highlights) {
+      var t1, t2,
+        highlightsByUrl = Y.groupBy(highlights, new U.Highlighter__collateLines_closure(), type$.legacy__Highlight, type$.dynamic);
+      for (t1 = highlightsByUrl.get$values(highlightsByUrl), t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        J.sort$1$ax(t1.get$current(t1), new U.Highlighter__collateLines_closure0());
+      t1 = highlightsByUrl.get$values(highlightsByUrl);
+      t2 = H._instanceType(t1)._eval$1("ExpandIterable<Iterable.E,_Line*>");
+      return P.List_List$from(new H.ExpandIterable(t1, new U.Highlighter__collateLines_closure1(), t2), true, t2._eval$1("Iterable.E"));
+    },
+    _Highlight$: function(span, label, primary) {
+      return new U._Highlight(new U._Highlight_closure(span).call$0(), primary, label);
+    },
+    _Highlight__normalizeNewlines: function(span) {
+      var endOffset, t1, i, t2, t3, t4,
+        text = span.get$text();
+      if (!C.JSString_methods.contains$1(text, "\r\n"))
+        return span;
+      endOffset = span.get$end(span).get$offset();
+      for (t1 = text.length - 1, i = 0; i < t1; ++i)
+        if (C.JSString_methods._codeUnitAt$1(text, i) === 13 && C.JSString_methods._codeUnitAt$1(text, i + 1) === 10)
+          --endOffset;
+      t1 = span.get$start(span);
+      t2 = span.get$sourceUrl(span);
+      t3 = span.get$end(span).get$line();
+      t2 = V.SourceLocation$(endOffset, span.get$end(span).get$column(), t3, t2);
+      t3 = H.stringReplaceAllUnchecked(text, "\r\n", "\n");
+      t4 = span.get$context(span);
+      return X.SourceSpanWithContext$(t1, t2, t3, H.stringReplaceAllUnchecked(t4, "\r\n", "\n"));
+    },
+    _Highlight__normalizeTrailingNewline: function(span) {
+      var context, text, start, end, t1, t2, t3;
+      if (!C.JSString_methods.endsWith$1(span.get$context(span), "\n"))
+        return span;
+      if (C.JSString_methods.endsWith$1(span.get$text(), "\n\n"))
+        return span;
+      context = C.JSString_methods.substring$2(span.get$context(span), 0, span.get$context(span).length - 1);
+      text = span.get$text();
+      start = span.get$start(span);
+      end = span.get$end(span);
+      if (C.JSString_methods.endsWith$1(span.get$text(), "\n") && B.findLineStart(span.get$context(span), span.get$text(), span.get$start(span).get$column()) + span.get$start(span).get$column() + span.get$length(span) === span.get$context(span).length) {
+        text = C.JSString_methods.substring$2(span.get$text(), 0, span.get$text().length - 1);
+        if (text.length === 0)
+          end = start;
+        else {
+          t1 = span.get$end(span).get$offset();
+          t2 = span.get$sourceUrl(span);
+          t3 = span.get$end(span).get$line();
+          end = V.SourceLocation$(t1 - 1, U._Highlight__lastLineLength(context), t3 - 1, t2);
+          start = span.get$start(span).get$offset() === span.get$end(span).get$offset() ? end : span.get$start(span);
+        }
+      }
+      return X.SourceSpanWithContext$(start, end, text, context);
+    },
+    _Highlight__normalizeEndOfLine: function(span) {
+      var text, t1, t2, t3, t4;
+      if (span.get$end(span).get$column() !== 0)
+        return span;
+      if (span.get$end(span).get$line() == span.get$start(span).get$line())
+        return span;
+      text = C.JSString_methods.substring$2(span.get$text(), 0, span.get$text().length - 1);
+      t1 = span.get$start(span);
+      t2 = span.get$end(span).get$offset();
+      t3 = span.get$sourceUrl(span);
+      t4 = span.get$end(span).get$line();
+      t3 = V.SourceLocation$(t2 - 1, text.length - C.JSString_methods.lastIndexOf$1(text, "\n") - 1, t4 - 1, t3);
+      return X.SourceSpanWithContext$(t1, t3, text, C.JSString_methods.endsWith$1(span.get$context(span), "\n") ? C.JSString_methods.substring$2(span.get$context(span), 0, span.get$context(span).length - 1) : span.get$context(span));
+    },
+    _Highlight__lastLineLength: function(text) {
+      var t1 = text.length;
+      if (t1 === 0)
+        return 0;
+      else if (C.JSString_methods.codeUnitAt$1(text, t1 - 1) === 10)
+        return t1 === 1 ? 0 : t1 - C.JSString_methods.lastIndexOf$2(text, "\n", t1 - 2) - 1;
+      else
+        return t1 - C.JSString_methods.lastIndexOf$1(text, "\n") - 1;
+    },
+    Highlighter: function Highlighter(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._lines = t0;
+      _._primaryColor = t1;
+      _._secondaryColor = t2;
+      _._paddingBeforeSidebar = t3;
+      _._maxMultilineSpans = t4;
+      _._multipleFiles = t5;
+      _._highlighter$_buffer = t6;
+    },
+    Highlighter_closure: function Highlighter_closure(t0) {
+      this.color = t0;
+    },
+    Highlighter$__closure: function Highlighter$__closure() {
+    },
+    Highlighter$___closure: function Highlighter$___closure() {
+    },
+    Highlighter$__closure0: function Highlighter$__closure0() {
+    },
+    Highlighter__collateLines_closure: function Highlighter__collateLines_closure() {
+    },
+    Highlighter__collateLines_closure0: function Highlighter__collateLines_closure0() {
+    },
+    Highlighter__collateLines_closure1: function Highlighter__collateLines_closure1() {
+    },
+    Highlighter__collateLines__closure: function Highlighter__collateLines__closure(t0) {
+      this.line = t0;
+    },
+    Highlighter_highlight_closure: function Highlighter_highlight_closure() {
+    },
+    Highlighter_highlight_closure0: function Highlighter_highlight_closure0() {
+    },
+    Highlighter__writeFileStart_closure: function Highlighter__writeFileStart_closure(t0) {
+      this.$this = t0;
+    },
+    Highlighter__writeMultilineHighlights_closure: function Highlighter__writeMultilineHighlights_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.startLine = t1;
+      this.line = t2;
+    },
+    Highlighter__writeMultilineHighlights_closure0: function Highlighter__writeMultilineHighlights_closure0(t0, t1) {
+      this.$this = t0;
+      this.highlight = t1;
+    },
+    Highlighter__writeMultilineHighlights_closure1: function Highlighter__writeMultilineHighlights_closure1(t0) {
+      this.$this = t0;
+    },
+    Highlighter__writeMultilineHighlights_closure2: function Highlighter__writeMultilineHighlights_closure2(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.current = t2;
+      _.startLine = t3;
+      _.line = t4;
+      _.highlight = t5;
+      _.endLine = t6;
+    },
+    Highlighter__writeMultilineHighlights__closure: function Highlighter__writeMultilineHighlights__closure(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    Highlighter__writeMultilineHighlights__closure0: function Highlighter__writeMultilineHighlights__closure0(t0, t1) {
+      this.$this = t0;
+      this.vertical = t1;
+    },
+    Highlighter__writeHighlightedText_closure: function Highlighter__writeHighlightedText_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.text = t1;
+      _.startColumn = t2;
+      _.endColumn = t3;
+    },
+    Highlighter__writeIndicator_closure: function Highlighter__writeIndicator_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.line = t1;
+      this.highlight = t2;
+    },
+    Highlighter__writeIndicator_closure0: function Highlighter__writeIndicator_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.line = t1;
+      this.highlight = t2;
+    },
+    Highlighter__writeIndicator_closure1: function Highlighter__writeIndicator_closure1(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.coversWholeLine = t1;
+      _.line = t2;
+      _.highlight = t3;
+    },
+    Highlighter__writeSidebar_closure: function Highlighter__writeSidebar_closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.end = t2;
+    },
+    _Highlight: function _Highlight(t0, t1, t2) {
+      this.span = t0;
+      this.isPrimary = t1;
+      this.label = t2;
+    },
+    _Highlight_closure: function _Highlight_closure(t0) {
+      this.span = t0;
+    },
+    _Line: function _Line(t0, t1, t2, t3) {
+      var _ = this;
+      _.text = t0;
+      _.number = t1;
+      _.url = t2;
+      _.highlights = t3;
+    },
+    Chain_Chain$parse: function(chain) {
+      var t1, t2,
+        _s51_ = string$.x3d_____;
+      if (chain.length === 0)
+        return new U.Chain(P.List_List$unmodifiable(H.setRuntimeTypeInfo([], type$.JSArray_legacy_Trace), type$.legacy_Trace));
+      t1 = $.$get$vmChainGap();
+      if (C.JSString_methods.contains$1(chain, t1)) {
+        t1 = C.JSString_methods.split$1(chain, t1);
+        t2 = H._arrayInstanceType(t1);
+        return new U.Chain(P.List_List$unmodifiable(new H.MappedIterable(new H.WhereIterable(t1, new U.Chain_Chain$parse_closure(), t2._eval$1("WhereIterable<1>")), new U.Chain_Chain$parse_closure0(), t2._eval$1("MappedIterable<1,Trace*>")), type$.legacy_Trace));
+      }
+      if (!C.JSString_methods.contains$1(chain, _s51_))
+        return new U.Chain(P.List_List$unmodifiable(H.setRuntimeTypeInfo([Y.Trace_Trace$parse(chain)], type$.JSArray_legacy_Trace), type$.legacy_Trace));
+      return new U.Chain(P.List_List$unmodifiable(new H.MappedListIterable(H.setRuntimeTypeInfo(chain.split(_s51_), type$.JSArray_String), new U.Chain_Chain$parse_closure1(), type$.MappedListIterable_of_String_and_legacy_Trace), type$.legacy_Trace));
+    },
+    Chain: function Chain(t0) {
+      this.traces = t0;
+    },
+    Chain_Chain$parse_closure: function Chain_Chain$parse_closure() {
+    },
+    Chain_Chain$parse_closure0: function Chain_Chain$parse_closure0() {
+    },
+    Chain_Chain$parse_closure1: function Chain_Chain$parse_closure1() {
+    },
+    Chain_toTrace_closure: function Chain_toTrace_closure() {
+    },
+    Chain_toString_closure0: function Chain_toString_closure0() {
+    },
+    Chain_toString__closure0: function Chain_toString__closure0() {
+    },
+    Chain_toString_closure: function Chain_toString_closure(t0) {
+      this.longest = t0;
+    },
+    Chain_toString__closure: function Chain_toString__closure(t0) {
+      this.longest = t0;
+    },
+    ModifiableCssAtRule$0: function($name, span, childless, value) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode_2);
+      return new U.ModifiableCssAtRule0($name, value, childless, span, new P.UnmodifiableListView(t1, type$.UnmodifiableListView_legacy_ModifiableCssNode_2), t1);
+    },
+    ModifiableCssAtRule0: function ModifiableCssAtRule0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.name = t0;
+      _.value = t1;
+      _.isChildless = t2;
+      _.span = t3;
+      _.children = t4;
+      _._node2$_children = t5;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    AtRule$0: function($name, span, children, value) {
+      var t1 = children == null ? null : P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = t1 == null ? null : C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new U.AtRule0($name, value, span, t1, t2 === true);
+    },
+    AtRule0: function AtRule0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.value = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    _compileStylesheet1: function(stylesheet, logger, importCache, nodeImporter, importer, functions, style, useSpaces, indentWidth, lineFeed, sourceMap, charset) {
+      var evaluateResult = R._EvaluateVisitor$1(functions, importCache, logger, nodeImporter, sourceMap).run$2(0, importer, stylesheet),
+        serializeResult = N.serialize0(evaluateResult.stylesheet, true, indentWidth, false, lineFeed, sourceMap, style, useSpaces),
+        t1 = serializeResult.sourceMap;
+      if (t1 != null && importCache != null)
+        B.mapInPlace0(t1.urls, new U._compileStylesheet_closure1(stylesheet, importCache));
+      return new X.CompileResult0(evaluateResult, serializeResult);
+    },
+    _compileStylesheet_closure1: function _compileStylesheet_closure1(t0, t1) {
+      this.stylesheet = t0;
+      this.importCache = t1;
+    },
+    ModifiableCssKeyframeBlock$0: function(selector, span) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode_2);
+      return new U.ModifiableCssKeyframeBlock0(selector, span, new P.UnmodifiableListView(t1, type$.UnmodifiableListView_legacy_ModifiableCssNode_2), t1);
+    },
+    ModifiableCssKeyframeBlock0: function ModifiableCssKeyframeBlock0(t0, t1, t2, t3) {
+      var _ = this;
+      _.selector = t0;
+      _.span = t1;
+      _.children = t2;
+      _._node2$_children = t3;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    SupportsOperation0: function SupportsOperation0(t0, t1, t2, t3) {
+      var _ = this;
+      _.left = t0;
+      _.right = t1;
+      _.operator = t2;
+      _.span = t3;
+    },
+    PublicMemberMapView0: function PublicMemberMapView0(t0, t1) {
+      this._public_member_map_view$_inner = t0;
+      this.$ti = t1;
+    },
+    RenderResult: function RenderResult() {
+    },
+    RenderResultStats: function RenderResultStats() {
+    },
+    main: function(args) {
+      return U.main$body(args);
+    },
+    main$body: function(args) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], printError, graph, source, destination, error, stackTrace, error0, stackTrace0, error1, error2, stackTrace1, buffer, options, t1, t2, t3, t4, exception, _box_0, $async$exception, $async$exception1, $async$temp1;
+      var $async$main = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              _box_0 = {};
+              _box_0.printedError = false;
+              printError = new U.main_printError(_box_0);
+              _box_0.options = null;
+              $async$handler = 4;
+              options = B.ExecutableOptions_ExecutableOptions$parse(args);
+              _box_0.options = options;
+              t1 = options._options;
+              $._glyphs = !(t1.wasParsed$1("unicode") ? H._asBoolS(t1.$index(0, "unicode")) : $._glyphs !== C.C_AsciiGlyphSet) ? C.C_AsciiGlyphSet : C.C_UnicodeGlyphSet;
+              $async$goto = H._asBoolS(_box_0.options._options.$index(0, "version")) ? 7 : 8;
+              break;
+            case 7:
+              // then
+              $async$temp1 = P;
+              $async$goto = 9;
+              return P._asyncAwait(U._loadVersion(), $async$main);
+            case 9:
+              // returning from await.
+              $async$temp1.print($async$result);
+              J.set$exitCode$x(self.process, 0);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 8:
+              // join
+              $async$goto = _box_0.options.get$interactive() ? 10 : 11;
+              break;
+            case 10:
+              // then
+              $async$goto = 12;
+              return P._asyncAwait(Y.repl(_box_0.options), $async$main);
+            case 12:
+              // returning from await.
+              // goto return
+              $async$goto = 1;
+              break;
+            case 11:
+              // join
+              t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Importer);
+              t2 = type$.legacy_List_legacy_String._as(_box_0.options._options.$index(0, "load-path"));
+              t3 = _box_0.options;
+              t4 = type$.legacy_Uri;
+              graph = new M.StylesheetGraph(P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_StylesheetNode), R.ImportCache$(t1, t2, H._asBoolS(t3._options.$index(0, "quiet")) ? $.$get$Logger_quiet() : new S.StderrLogger(t3.get$color())), P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_DateTime));
+              $async$goto = H._asBoolS(_box_0.options._options.$index(0, "watch")) ? 13 : 14;
+              break;
+            case 13:
+              // then
+              $async$goto = 15;
+              return P._asyncAwait(A.watch(_box_0.options, graph), $async$main);
+            case 15:
+              // returning from await.
+              // goto return
+              $async$goto = 1;
+              break;
+            case 14:
+              // join
+              t1 = _box_0.options, t1._ensureSources$0(), t1 = t1._sourcesToDestinations, t1 = J.get$iterator$ax(t1.get$keys(t1));
+            case 16:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 17;
+                break;
+              }
+              source = t1.get$current(t1);
+              t2 = _box_0.options;
+              t2._ensureSources$0();
+              destination = t2._sourcesToDestinations.$index(0, source);
+              $async$handler = 19;
+              t2 = _box_0.options;
+              $async$goto = 22;
+              return P._asyncAwait(D.compileStylesheet(t2, graph, source, destination, H._asBoolS(t2._options.$index(0, "update"))), $async$main);
+            case 22:
+              // returning from await.
+              $async$handler = 4;
+              // goto after finally
+              $async$goto = 21;
+              break;
+            case 19:
+              // catch
+              $async$handler = 18;
+              $async$exception = $async$currentError;
+              t2 = H.unwrapException($async$exception);
+              if (t2 instanceof E.SassException) {
+                error = t2;
+                stackTrace = H.getTraceFromException($async$exception);
+                new U.main_closure(_box_0, destination).call$0();
+                t2 = _box_0.options._options;
+                if (t2._parser.options._collection$_map.$index(0, "color") == null)
+                  H.throwExpression(P.ArgumentError$('Could not find an option named "color".'));
+                if (t2._parsed.containsKey$1("color"))
+                  t2 = H._asBoolS(t2.$index(0, "color"));
+                else {
+                  t2 = J.get$isTTY$x(J.get$stdout$x(self.process));
+                  if (t2 == null)
+                    t2 = false;
+                }
+                t2 = J.toString$1$color$(error, t2);
+                t3 = H._asBoolS(_box_0.options._options.$index(0, "trace")) ? stackTrace : null;
+                printError.call$2(t2, t3);
+                if (J.get$exitCode$x(self.process) !== 66)
+                  J.set$exitCode$x(self.process, 65);
+                if (H._asBoolS(_box_0.options._options.$index(0, "stop-on-error"))) {
+                  // goto return
+                  $async$goto = 1;
+                  break;
+                }
+              } else if (t2 instanceof B.FileSystemException) {
+                error0 = t2;
+                stackTrace0 = H.getTraceFromException($async$exception);
+                t2 = error0.path;
+                t2 = "Error reading " + H.S($.$get$context().relative$2$from(t2, null)) + ": " + error0.message + ".";
+                t3 = H._asBoolS(_box_0.options._options.$index(0, "trace")) ? stackTrace0 : null;
+                printError.call$2(t2, t3);
+                J.set$exitCode$x(self.process, 66);
+                if (H._asBoolS(_box_0.options._options.$index(0, "stop-on-error"))) {
+                  // goto return
+                  $async$goto = 1;
+                  break;
+                }
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 21;
+              break;
+            case 18:
+              // uncaught
+              // goto catch
+              $async$goto = 4;
+              break;
+            case 21:
+              // after finally
+              // goto for condition
+              $async$goto = 16;
+              break;
+            case 17:
+              // after for
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception1 = $async$currentError;
+              t1 = H.unwrapException($async$exception1);
+              if (t1 instanceof B.UsageException) {
+                error1 = t1;
+                P.print(H.S(error1.message) + "\n");
+                P.print("Usage: sass <input.scss> [output.css]\n       sass <input.scss>:<output.css> <input/>:<output/> <dir/>\n");
+                t1 = $.$get$ExecutableOptions__parser();
+                P.print(new G.Usage(t1._optionsAndSeparators, t1.usageLineLength).generate$0());
+                J.set$exitCode$x(self.process, 64);
+              } else {
+                error2 = t1;
+                stackTrace1 = H.getTraceFromException($async$exception1);
+                buffer = new P.StringBuffer("");
+                t1 = _box_0.options;
+                if (t1 != null && t1.get$color())
+                  buffer._contents += "\x1b[31m\x1b[1m";
+                buffer._contents += "Unexpected exception:";
+                t1 = _box_0.options;
+                if (t1 != null && t1.get$color())
+                  buffer._contents += "\x1b[0m";
+                buffer._contents += "\n";
+                buffer._contents += H.S(error2) + "\n";
+                t1 = buffer._contents;
+                printError.call$2(t1.charCodeAt(0) == 0 ? t1 : t1, stackTrace1);
+                J.set$exitCode$x(self.process, 255);
+              }
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 3:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 6:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$main, $async$completer);
+    },
+    _loadVersion: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue;
+      var $async$_loadVersion = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = "1.32.8 compiled with dart2js 2.10.5";
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_loadVersion, $async$completer);
+    },
+    main_printError: function main_printError(t0) {
+      this._box_0 = t0;
+    },
+    main_closure: function main_closure(t0, t1) {
+      this._box_0 = t0;
+      this.destination = t1;
+    },
+    SassParser0: function SassParser0(t0, t1, t2) {
+      var _ = this;
+      _._sass0$_currentIndentation = 0;
+      _._sass0$_spaces = _._sass0$_nextIndentationEnd = _._sass0$_nextIndentation = null;
+      _._stylesheet0$_isUseAllowed = true;
+      _._stylesheet0$_inMixin = false;
+      _._stylesheet0$_mixinHasContent = null;
+      _._stylesheet0$_inParentheses = _._stylesheet0$_inStyleRule = _._stylesheet0$_inUnknownAtRule = _._stylesheet0$_inControlDirective = _._stylesheet0$_inContentBlock = false;
+      _._stylesheet0$_globalVariables = t0;
+      _.lastSilentComment = null;
+      _.scanner = t1;
+      _.logger = t2;
+    },
+    SassParser_children_closure0: function SassParser_children_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.children = t1;
+      this.child = t2;
+    }
+  },
+  M = {_DelegatingIterableBase: function _DelegatingIterableBase() {
+    }, DelegatingIterable: function DelegatingIterable() {
+    }, DelegatingSet: function DelegatingSet(t0, t1) {
+      this._base = t0;
+      this.$ti = t1;
+    }, MapKeySet: function MapKeySet(t0, t1) {
+      this._baseMap = t0;
+      this.$ti = t1;
+    }, _MapKeySet__DelegatingIterableBase_UnmodifiableSetMixin: function _MapKeySet__DelegatingIterableBase_UnmodifiableSetMixin() {
+    },
+    futureToPromise: function(future) {
+      return new self.Promise(P.allowInterop(new M.futureToPromise_closure(future)));
+    },
+    Util: function Util() {
+    },
+    futureToPromise_closure: function futureToPromise_closure(t0) {
+      this.future = t0;
+    },
+    Context_Context: function(style) {
+      var current = style == null ? D.current() : ".";
+      if (style == null)
+        style = $.$get$Style_platform();
+      return new M.Context(style, current);
+    },
+    _parseUri: function(uri) {
+      if (typeof uri == "string")
+        return P.Uri_parse(uri);
+      if (type$.legacy_Uri._is(uri))
+        return uri;
+      throw H.wrapException(P.ArgumentError$value(uri, "uri", "Value must be a String or a Uri"));
+    },
+    _validateArgList: function(method, args) {
+      var numArgs, i, numArgs0, message, t1, t2, t3, t4;
+      for (numArgs = args.length, i = 1; i < numArgs; ++i) {
+        if (args[i] == null || args[i - 1] != null)
+          continue;
+        for (; numArgs >= 1; numArgs = numArgs0) {
+          numArgs0 = numArgs - 1;
+          if (args[numArgs0] != null)
+            break;
+        }
+        message = new P.StringBuffer("");
+        t1 = method + "(";
+        message._contents = t1;
+        t2 = H._arrayInstanceType(args);
+        t3 = t2._eval$1("SubListIterable<1>");
+        t4 = new H.SubListIterable(args, 0, numArgs, t3);
+        t4.SubListIterable$3(args, 0, numArgs, t2._precomputed1);
+        t3 = t1 + new H.MappedListIterable(t4, new M._validateArgList_closure(), t3._eval$1("MappedListIterable<ListIterable.E,String*>")).join$1(0, ", ");
+        message._contents = t3;
+        message._contents = t3 + ("): part " + (i - 1) + " was null, but part " + i + " was not.");
+        throw H.wrapException(P.ArgumentError$(message.toString$0(0)));
+      }
+    },
+    Context: function Context(t0, t1) {
+      this.style = t0;
+      this._context$_current = t1;
+    },
+    Context_join_closure: function Context_join_closure() {
+    },
+    Context_joinAll_closure: function Context_joinAll_closure() {
+    },
+    Context_split_closure: function Context_split_closure() {
+    },
+    _validateArgList_closure: function _validateArgList_closure() {
+    },
+    _PathDirection: function _PathDirection(t0) {
+      this.name = t0;
+    },
+    _PathRelation: function _PathRelation(t0) {
+      this.name = t0;
+    },
+    CallableDeclaration: function CallableDeclaration() {
+    },
+    FunctionRule$: function($name, $arguments, children, span, comment) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new M.FunctionRule($name, $arguments, span, t1, t2);
+    },
+    FunctionRule: function FunctionRule(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.$arguments = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    ParentStatement: function ParentStatement() {
+    },
+    ParentStatement_closure: function ParentStatement_closure() {
+    },
+    ParentStatement__closure: function ParentStatement__closure() {
+    },
+    SupportsNegation: function SupportsNegation(t0, t1) {
+      this.condition = t0;
+      this.span = t1;
+    },
+    ParentSelector: function ParentSelector(t0) {
+      this.suffix = t0;
+    },
+    SimpleSelector: function SimpleSelector() {
+    },
+    Importer: function Importer() {
+    },
+    StylesheetNode$_: function(_stylesheet, importer, canonicalUrl, allUpstream) {
+      var t1 = new M.StylesheetNode(_stylesheet, importer, canonicalUrl, allUpstream.item1, allUpstream.item2, P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_StylesheetNode));
+      t1.StylesheetNode$_$4(_stylesheet, importer, canonicalUrl, allUpstream);
+      return t1;
+    },
+    StylesheetGraph: function StylesheetGraph(t0, t1, t2) {
+      this._nodes = t0;
+      this.importCache = t1;
+      this._transitiveModificationTimes = t2;
+    },
+    StylesheetGraph_modifiedSince_transitiveModificationTime: function StylesheetGraph_modifiedSince_transitiveModificationTime(t0) {
+      this.$this = t0;
+    },
+    StylesheetGraph_modifiedSince_transitiveModificationTime_closure: function StylesheetGraph_modifiedSince_transitiveModificationTime_closure(t0, t1) {
+      this.node = t0;
+      this.transitiveModificationTime = t1;
+    },
+    StylesheetGraph__add_closure: function StylesheetGraph__add_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.url = t1;
+      _.baseImporter = t2;
+      _.baseUrl = t3;
+    },
+    StylesheetGraph_addCanonical_closure: function StylesheetGraph_addCanonical_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.importer = t1;
+      _.canonicalUrl = t2;
+      _.originalUrl = t3;
+    },
+    StylesheetGraph_reload_closure: function StylesheetGraph_reload_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.canonicalUrl = t2;
+    },
+    StylesheetGraph__recanonicalizeImportsForNode_closure: function StylesheetGraph__recanonicalizeImportsForNode_closure(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.$this = t0;
+      _.importer = t1;
+      _.canonicalUrl = t2;
+      _.node = t3;
+      _.forImport = t4;
+      _.newMap = t5;
+    },
+    StylesheetGraph__nodeFor_closure: function StylesheetGraph__nodeFor_closure(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.url = t1;
+      _.baseImporter = t2;
+      _.baseUrl = t3;
+      _.forImport = t4;
+    },
+    StylesheetGraph__nodeFor_closure0: function StylesheetGraph__nodeFor_closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.importer = t1;
+      _.canonicalUrl = t2;
+      _.resolvedUrl = t3;
+    },
+    StylesheetNode: function StylesheetNode(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._stylesheet_graph$_stylesheet = t0;
+      _.importer = t1;
+      _.canonicalUrl = t2;
+      _._upstream = t3;
+      _._upstreamImports = t4;
+      _._downstream = t5;
+    },
+    Syntax_forPath: function(path) {
+      switch (X.ParsedPath_ParsedPath$parse(path, $.$get$context().style)._splitExtension$1(1)[1]) {
+        case ".sass":
+          return C.Syntax_Sass;
+        case ".css":
+          return C.Syntax_CSS;
+        default:
+          return C.Syntax_SCSS;
+      }
+    },
+    Syntax: function Syntax(t0) {
+      this._syntax$_name = t0;
+    },
+    CallableDeclaration0: function CallableDeclaration0() {
+    },
+    FunctionRule$0: function($name, $arguments, children, span, comment) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new M.FunctionRule0($name, $arguments, span, t1, t2);
+    },
+    FunctionRule0: function FunctionRule0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.name = t0;
+      _.$arguments = t1;
+      _.span = t2;
+      _.children = t3;
+      _.hasDeclarations = t4;
+    },
+    Importer0: function Importer0() {
+    },
+    SupportsNegation0: function SupportsNegation0(t0, t1) {
+      this.condition = t0;
+      this.span = t1;
+    },
+    ParentSelector0: function ParentSelector0(t0) {
+      this.suffix = t0;
+    },
+    ParentStatement0: function ParentStatement0() {
+    },
+    ParentStatement_closure0: function ParentStatement_closure0() {
+    },
+    ParentStatement__closure0: function ParentStatement__closure0() {
+    },
+    SimpleSelector0: function SimpleSelector0() {
+    },
+    Syntax_forPath0: function(path) {
+      switch (X.ParsedPath_ParsedPath$parse(path, $.$get$context().style)._splitExtension$1(1)[1]) {
+        case ".sass":
+          return C.Syntax_Sass0;
+        case ".css":
+          return C.Syntax_CSS0;
+        default:
+          return C.Syntax_SCSS0;
+      }
+    },
+    Syntax0: function Syntax0(t0) {
+      this._syntax0$_name = t0;
+    }
+  },
+  D = {
+    fs: function() {
+      var t1 = $._fs;
+      return t1 == null ? $._fs = self.fs : t1;
+    },
+    FS: function FS() {
+    },
+    FSConstants: function FSConstants() {
+    },
+    FSWatcher: function FSWatcher() {
+    },
+    ReadStream: function ReadStream() {
+    },
+    ReadStreamOptions: function ReadStreamOptions() {
+    },
+    WriteStream: function WriteStream() {
+    },
+    WriteStreamOptions: function WriteStreamOptions() {
+    },
+    Stats: function Stats() {
+    },
+    StreamModule: function StreamModule() {
+    },
+    Readable: function Readable() {
+    },
+    Writable: function Writable() {
+    },
+    Duplex: function Duplex() {
+    },
+    Transform: function Transform() {
+    },
+    WritableOptions: function WritableOptions() {
+    },
+    ReadableOptions: function ReadableOptions() {
+    },
+    ListExpression$: function(contents, separator, brackets, span) {
+      var t1 = P.List_List$unmodifiable(contents, type$.legacy_Expression);
+      return new D.ListExpression(t1, separator, brackets, span == null ? B.spanForList(t1) : span);
+    },
+    ListExpression: function ListExpression(t0, t1, t2, t3) {
+      var _ = this;
+      _.contents = t0;
+      _.separator = t1;
+      _.hasBrackets = t2;
+      _.span = t3;
+    },
+    ListExpression_toString_closure: function ListExpression_toString_closure(t0) {
+      this.$this = t0;
+    },
+    StringExpression: function StringExpression(t0, t1) {
+      this.text = t0;
+      this.hasQuotes = t1;
+    },
+    ErrorRule: function ErrorRule(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    SelectorList$: function(components) {
+      var t1 = P.List_List$unmodifiable(components, type$.legacy_ComplexSelector);
+      if (t1.length === 0)
+        H.throwExpression(P.ArgumentError$("components may not be empty."));
+      return new D.SelectorList(t1);
+    },
+    SelectorList_SelectorList$parse: function(contents, allowParent, allowPlaceholder, logger) {
+      return T.SelectorParser$(contents, allowParent, allowPlaceholder, logger, null).parse$0();
+    },
+    SelectorList: function SelectorList(t0) {
+      this.components = t0;
+    },
+    SelectorList_isInvisible_closure: function SelectorList_isInvisible_closure() {
+    },
+    SelectorList_asSassList_closure: function SelectorList_asSassList_closure() {
+    },
+    SelectorList_asSassList__closure: function SelectorList_asSassList__closure() {
+    },
+    SelectorList_unify_closure: function SelectorList_unify_closure(t0) {
+      this.other = t0;
+    },
+    SelectorList_unify__closure: function SelectorList_unify__closure(t0) {
+      this.complex1 = t0;
+    },
+    SelectorList_unify___closure: function SelectorList_unify___closure() {
+    },
+    SelectorList_resolveParentSelectors_closure: function SelectorList_resolveParentSelectors_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.implicitParent = t1;
+      this.parent = t2;
+    },
+    SelectorList_resolveParentSelectors__closure: function SelectorList_resolveParentSelectors__closure(t0) {
+      this.complex = t0;
+    },
+    SelectorList_resolveParentSelectors__closure0: function SelectorList_resolveParentSelectors__closure0(t0) {
+      this._box_0 = t0;
+    },
+    SelectorList__complexContainsParentSelector_closure: function SelectorList__complexContainsParentSelector_closure() {
+    },
+    SelectorList__complexContainsParentSelector__closure: function SelectorList__complexContainsParentSelector__closure() {
+    },
+    SelectorList__resolveParentSelectorsCompound_closure: function SelectorList__resolveParentSelectorsCompound_closure() {
+    },
+    SelectorList__resolveParentSelectorsCompound_closure0: function SelectorList__resolveParentSelectorsCompound_closure0(t0) {
+      this.parent = t0;
+    },
+    SelectorList__resolveParentSelectorsCompound_closure1: function SelectorList__resolveParentSelectorsCompound_closure1(t0, t1) {
+      this.compound = t0;
+      this.resolvedMembers = t1;
+    },
+    PseudoSelector$: function($name, argument, element, selector) {
+      var t1 = !element,
+        t2 = t1 && !D.PseudoSelector__isFakePseudoElement($name);
+      return new D.PseudoSelector($name, B.unvendor($name), t2, t1, argument, selector);
+    },
+    PseudoSelector__isFakePseudoElement: function($name) {
+      switch (C.JSString_methods._codeUnitAt$1($name, 0)) {
+        case 97:
+        case 65:
+          return B.equalsIgnoreCase($name, "after");
+        case 98:
+        case 66:
+          return B.equalsIgnoreCase($name, "before");
+        case 102:
+        case 70:
+          return B.equalsIgnoreCase($name, "first-line") || B.equalsIgnoreCase($name, "first-letter");
+        default:
+          return false;
+      }
+    },
+    PseudoSelector: function PseudoSelector(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.name = t0;
+      _.normalizedName = t1;
+      _.isClass = t2;
+      _.isSyntacticClass = t3;
+      _.argument = t4;
+      _.selector = t5;
+      _._pseudo$_maxSpecificity = _._pseudo$_minSpecificity = null;
+    },
+    QualifiedName: function QualifiedName(t0, t1) {
+      this.name = t0;
+      this.namespace = t1;
+    },
+    compileStylesheet: function(options, graph, source, destination, ifModified) {
+      return D.compileStylesheet$body(options, graph, source, destination, ifModified);
+    },
+    compileStylesheet$body: function(options, graph, source, destination, ifModified) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], syntax, result, importCache, error, exception, t1, t2, t3, t4, t5, t6, t7, result0, stylesheet, t0, css, buffer, sourceName, destinationName, importer, $async$exception;
+      var $async$compileStylesheet = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              importer = new F.FilesystemImporter(D.absolute("."));
+              if (ifModified)
+                try {
+                  if (source != null && destination != null && !graph.modifiedSince$3($.$get$context().toUri$1(source), B.modificationTime(destination), importer)) {
+                    // goto return
+                    $async$goto = 1;
+                    break;
+                  }
+                } catch (exception) {
+                  if (!(H.unwrapException(exception) instanceof B.FileSystemException))
+                    throw exception;
+                }
+              syntax = null;
+              if (H._asBoolS(options._ifParsed$1("indented")) === true)
+                syntax = C.Syntax_Sass;
+              else if (source != null)
+                syntax = M.Syntax_forPath(source);
+              else
+                syntax = C.Syntax_SCSS;
+              result = null;
+              $async$handler = 4;
+              t1 = options._options;
+              $async$goto = H._asBoolS(t1.$index(0, "async")) ? 7 : 9;
+              break;
+            case 7:
+              // then
+              t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AsyncImporter);
+              t3 = type$.legacy_List_legacy_String._as(t1.$index(0, "load-path"));
+              t4 = H._asBoolS(t1.$index(0, "quiet")) ? $.$get$Logger_quiet() : new S.StderrLogger(options.get$color());
+              t3 = O.AsyncImportCache__toImporters(t2, t3, null);
+              t2 = t4 == null ? C.StderrLogger_false : t4;
+              t4 = type$.legacy_Uri;
+              importCache = new O.AsyncImportCache(t3, t2, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Tuple2_of_legacy_Uri_and_legacy_bool, type$.legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri_2), P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_Stylesheet_2), P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_ImporterResult_2));
+              $async$goto = source == null ? 10 : 12;
+              break;
+            case 10:
+              // then
+              $async$goto = 13;
+              return P._asyncAwait(B.readStdin(), $async$compileStylesheet);
+            case 13:
+              // returning from await.
+              t2 = $async$result;
+              t3 = syntax;
+              t4 = H._asBoolS(t1.$index(0, "quiet")) ? $.$get$Logger_quiet() : new S.StderrLogger(options.get$color());
+              t5 = D.absolute(".");
+              t6 = J.$eq$(t1.$index(0, "style"), "compressed") ? C.OutputStyle_compressed : C.OutputStyle_expanded0;
+              t7 = options.get$emitSourceMap();
+              $async$goto = 14;
+              return P._asyncAwait(X.compileStringAsync(t2, H._asBoolS(t1.$index(0, "charset")), importCache, new F.FilesystemImporter(t5), t4, t7, t6, t3), $async$compileStylesheet);
+            case 14:
+              // returning from await.
+              result0 = $async$result;
+              // goto join
+              $async$goto = 11;
+              break;
+            case 12:
+              // else
+              t2 = syntax;
+              t3 = H._asBoolS(t1.$index(0, "quiet")) ? $.$get$Logger_quiet() : new S.StderrLogger(options.get$color());
+              t4 = J.$eq$(t1.$index(0, "style"), "compressed") ? C.OutputStyle_compressed : C.OutputStyle_expanded0;
+              t5 = options.get$emitSourceMap();
+              $async$goto = 15;
+              return P._asyncAwait(X.compileAsync(source, H._asBoolS(t1.$index(0, "charset")), importCache, t3, t5, t4, t2), $async$compileStylesheet);
+            case 15:
+              // returning from await.
+              result0 = $async$result;
+            case 11:
+              // join
+              result = result0;
+              // goto join
+              $async$goto = 8;
+              break;
+            case 9:
+              // else
+              $async$goto = source == null ? 16 : 18;
+              break;
+            case 16:
+              // then
+              $async$goto = 19;
+              return P._asyncAwait(B.readStdin(), $async$compileStylesheet);
+            case 19:
+              // returning from await.
+              t2 = $async$result;
+              t3 = syntax;
+              t4 = H._asBoolS(t1.$index(0, "quiet")) ? $.$get$Logger_quiet() : new S.StderrLogger(options.get$color());
+              t5 = D.absolute(".");
+              t6 = J.$eq$(t1.$index(0, "style"), "compressed") ? C.OutputStyle_compressed : C.OutputStyle_expanded0;
+              t7 = options.get$emitSourceMap();
+              t1 = H._asBoolS(t1.$index(0, "charset"));
+              stylesheet = V.Stylesheet_Stylesheet$parse(t2, t3 == null ? C.Syntax_SCSS : t3, t4, null);
+              result0 = U._compileStylesheet(stylesheet, t4, graph.importCache, null, new F.FilesystemImporter(t5), null, t6, true, null, null, t7, t1);
+              // goto join
+              $async$goto = 17;
+              break;
+            case 18:
+              // else
+              t2 = syntax;
+              t3 = H._asBoolS(t1.$index(0, "quiet")) ? $.$get$Logger_quiet() : new S.StderrLogger(options.get$color());
+              importCache = graph.importCache;
+              t4 = J.$eq$(t1.$index(0, "style"), "compressed") ? C.OutputStyle_compressed : C.OutputStyle_expanded0;
+              t5 = options.get$emitSourceMap();
+              t1 = H._asBoolS(t1.$index(0, "charset"));
+              t6 = t2 == null || t2 === M.Syntax_forPath(source);
+              if (t6) {
+                t2 = D.absolute(".");
+                if (J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin")) {
+                  t6 = $.$get$context();
+                  t7 = F._realCasePath(D.absolute(t6.normalize$1(source)));
+                  t0 = t7;
+                  t7 = t6;
+                  t6 = t0;
+                } else {
+                  t6 = $.$get$context();
+                  t7 = t6.canonicalize$1(source);
+                  t0 = t7;
+                  t7 = t6;
+                  t6 = t0;
+                }
+                stylesheet = importCache.importCanonical$3(new F.FilesystemImporter(t2), t7.toUri$1(t6), t7.toUri$1(source));
+              } else {
+                t6 = B.readFile(source);
+                if (t2 == null)
+                  t2 = M.Syntax_forPath(source);
+                stylesheet = V.Stylesheet_Stylesheet$parse(t6, t2, t3, $.$get$context().toUri$1(source));
+              }
+              result0 = U._compileStylesheet(stylesheet, t3, importCache, null, new F.FilesystemImporter(D.absolute(".")), null, t4, true, null, null, t5, t1);
+            case 17:
+              // join
+              result = result0;
+            case 8:
+              // join
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (t1 instanceof E.SassException) {
+                error = t1;
+                if (options.get$emitErrorCss())
+                  if (destination == null)
+                    P.print(error.toCssString$0());
+                  else {
+                    B.ensureDir($.$get$context().dirname$1(destination));
+                    B.writeFile(destination, error.toCssString$0() + "\n");
+                  }
+                throw $async$exception;
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 3:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 6:
+              // after finally
+              css = result._serialize.css + D._writeSourceMap(options, result._serialize.sourceMap, destination);
+              if (destination == null) {
+                if (css.length !== 0)
+                  P.print(css);
+              } else {
+                B.ensureDir($.$get$context().dirname$1(destination));
+                B.writeFile(destination, css + "\n");
+              }
+              t1 = options._options;
+              if (!H._asBoolS(t1.$index(0, "quiet")))
+                t1 = !H._asBoolS(t1.$index(0, "update")) && !H._asBoolS(t1.$index(0, "watch"));
+              else
+                t1 = true;
+              if (t1) {
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              buffer = new P.StringBuffer("");
+              t1 = options.get$color() ? buffer._contents = "\x1b[32m" : "";
+              if (source == null)
+                sourceName = "stdin";
+              else {
+                t2 = $.$get$context();
+                sourceName = t2.prettyUri$1(t2.toUri$1(source));
+              }
+              t2 = $.$get$context();
+              destinationName = t2.prettyUri$1(t2.toUri$1(destination));
+              t1 += "Compiled " + H.S(sourceName) + " to " + H.S(destinationName) + ".";
+              buffer._contents = t1;
+              if (options.get$color())
+                buffer._contents = t1 + "\x1b[0m";
+              P.print(buffer);
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$compileStylesheet, $async$completer);
+    },
+    _writeSourceMap: function(options, sourceMap, destination) {
+      var t1, sourceMapText, url, sourceMapPath, t2;
+      if (sourceMap == null)
+        return "";
+      if (destination != null) {
+        t1 = $.$get$context();
+        sourceMap.targetUrl = t1.toUri$1(X.ParsedPath_ParsedPath$parse(destination, t1.style).get$basename()).toString$0(0);
+      }
+      B.mapInPlace(sourceMap.urls, new D._writeSourceMap_closure(options, destination));
+      t1 = options._options;
+      sourceMapText = C.C_JsonCodec.encode$2$toEncodable(sourceMap.toJson$1$includeSourceContents(H._asBoolS(t1.$index(0, "embed-sources"))), null);
+      if (H._asBoolS(t1.$index(0, "embed-source-map")))
+        url = P.Uri_Uri$dataFromString(sourceMapText, C.C_Utf8Codec, "application/json");
+      else {
+        sourceMapPath = J.$add$ansx(destination, ".map");
+        t2 = $.$get$context();
+        B.ensureDir(t2.dirname$1(sourceMapPath));
+        B.writeFile(sourceMapPath, sourceMapText);
+        url = t2.toUri$1(t2.relative$2$from(sourceMapPath, t2.dirname$1(destination)));
+      }
+      t1 = (J.$eq$(t1.$index(0, "style"), "compressed") ? C.OutputStyle_compressed : C.OutputStyle_expanded0) === C.OutputStyle_compressed ? "" : "\n\n";
+      return t1 + ("/*# sourceMappingURL=" + url.toString$0(0) + " */");
+    },
+    _writeSourceMap_closure: function _writeSourceMap_closure(t0, t1) {
+      this.options = t0;
+      this.destination = t1;
+    },
+    _function3: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function($name, $arguments, callback, "sass:list");
+    },
+    closure43: function closure43() {
+    },
+    closure42: function closure42() {
+    },
+    closure41: function closure41() {
+    },
+    closure40: function closure40() {
+    },
+    closure39: function closure39() {
+    },
+    closure38: function closure38() {
+    },
+    _closure5: function _closure5() {
+    },
+    _closure6: function _closure6(t0) {
+      this._box_0 = t0;
+    },
+    _closure7: function _closure7(t0) {
+      this._box_0 = t0;
+    },
+    closure37: function closure37() {
+    },
+    closure35: function closure35() {
+    },
+    closure36: function closure36() {
+    },
+    _codepointForIndex: function(index, lengthInCodepoints, allowNegative) {
+      var result;
+      if (index === 0)
+        return 0;
+      if (index > 0)
+        return Math.min(index - 1, H.checkNum(lengthInCodepoints));
+      result = lengthInCodepoints + index;
+      if (result < 0 && !allowNegative)
+        return 0;
+      return result;
+    },
+    _function: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function($name, $arguments, callback, "sass:string");
+    },
+    closure8: function closure8() {
+    },
+    closure7: function closure7() {
+    },
+    closure3: function closure3() {
+    },
+    closure2: function closure2() {
+    },
+    closure1: function closure1() {
+    },
+    closure0: function closure0() {
+    },
+    closure6: function closure6() {
+    },
+    closure5: function closure5() {
+    },
+    closure4: function closure4() {
+    },
+    SourceMapBuffer0: function SourceMapBuffer0(t0, t1, t2) {
+      var _ = this;
+      _._source_map_buffer0$_buffer = t0;
+      _._source_map_buffer0$_entries = t1;
+      _._sourceFiles = t2;
+      _._source_map_buffer0$_column = _._source_map_buffer0$_line = 0;
+      _._source_map_buffer0$_inSpan = false;
+    },
+    SourceMapBuffer__addEntry_closure: function SourceMapBuffer__addEntry_closure(t0) {
+      this.source = t0;
+    },
+    SourceMapBuffer_buildSourceMap_closure: function SourceMapBuffer_buildSourceMap_closure(t0, t1) {
+      this._box_0 = t0;
+      this.prefixLength = t1;
+    },
+    SassArgumentList$: function(contents, keywords, separator) {
+      var t1 = type$.legacy_Value;
+      t1 = new D.SassArgumentList(H.ConstantMap_ConstantMap$from(keywords, type$.legacy_String, t1), P.List_List$unmodifiable(contents, t1), separator, false);
+      t1.SassList$3$brackets(contents, separator, false);
+      return t1;
+    },
+    SassArgumentList: function SassArgumentList(t0, t1, t2, t3) {
+      var _ = this;
+      _._keywords = t0;
+      _._wereKeywordsAccessed = false;
+      _._list$_contents = t1;
+      _.separator = t2;
+      _.hasBrackets = t3;
+    },
+    SassList$: function(contents, separator, brackets) {
+      var t1 = new D.SassList(P.List_List$unmodifiable(contents, type$.legacy_Value), separator, brackets);
+      t1.SassList$3$brackets(contents, separator, brackets);
+      return t1;
+    },
+    SassList: function SassList(t0, t1, t2) {
+      this._list$_contents = t0;
+      this.separator = t1;
+      this.hasBrackets = t2;
+    },
+    SassList_isBlank_closure: function SassList_isBlank_closure() {
+    },
+    ListSeparator: function ListSeparator(t0) {
+      this._list$_name = t0;
+    },
+    SassString$: function(text, quotes) {
+      return new D.SassString(text, quotes);
+    },
+    SassString: function SassString(t0, t1) {
+      this.text = t0;
+      this.hasQuotes = t1;
+      this._sassLength = null;
+    },
+    RecursiveStatementVisitor: function RecursiveStatementVisitor() {
+    },
+    SourceLocationMixin: function SourceLocationMixin() {
+    },
+    SassArgumentList$0: function(contents, keywords, separator) {
+      var t1 = type$.legacy_Value_2;
+      t1 = new D.SassArgumentList0(H.ConstantMap_ConstantMap$from(keywords, type$.legacy_String, t1), P.List_List$unmodifiable(contents, t1), separator, false);
+      t1.SassList$3$brackets0(contents, separator, false);
+      return t1;
+    },
+    SassArgumentList0: function SassArgumentList0(t0, t1, t2, t3) {
+      var _ = this;
+      _._argument_list$_keywords = t0;
+      _._argument_list$_wereKeywordsAccessed = false;
+      _._list1$_contents = t1;
+      _.separator = t2;
+      _.hasBrackets = t3;
+    },
+    ErrorRule0: function ErrorRule0(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    Exports: function Exports() {
+    },
+    ListExpression$0: function(contents, separator, brackets, span) {
+      var t1 = P.List_List$unmodifiable(contents, type$.legacy_Expression_2);
+      return new D.ListExpression0(t1, separator, brackets, span == null ? B.spanForList0(t1) : span);
+    },
+    ListExpression0: function ListExpression0(t0, t1, t2, t3) {
+      var _ = this;
+      _.contents = t0;
+      _.separator = t1;
+      _.hasBrackets = t2;
+      _.span = t3;
+    },
+    ListExpression_toString_closure0: function ListExpression_toString_closure0(t0) {
+      this.$this = t0;
+    },
+    _function10: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function0($name, $arguments, callback, "sass:list");
+    },
+    closure158: function closure158() {
+    },
+    closure157: function closure157() {
+    },
+    closure156: function closure156() {
+    },
+    closure155: function closure155() {
+    },
+    closure154: function closure154() {
+    },
+    closure153: function closure153() {
+    },
+    _closure20: function _closure20() {
+    },
+    _closure21: function _closure21(t0) {
+      this._box_0 = t0;
+    },
+    _closure22: function _closure22(t0) {
+      this._box_0 = t0;
+    },
+    closure152: function closure152() {
+    },
+    closure150: function closure150() {
+    },
+    closure151: function closure151() {
+    },
+    SelectorList$0: function(components) {
+      var t1 = P.List_List$unmodifiable(components, type$.legacy_ComplexSelector_2);
+      if (t1.length === 0)
+        H.throwExpression(P.ArgumentError$("components may not be empty."));
+      return new D.SelectorList0(t1);
+    },
+    SelectorList_SelectorList$parse0: function(contents, allowParent, allowPlaceholder, logger) {
+      return T.SelectorParser$0(contents, allowParent, allowPlaceholder, logger, null).parse$0();
+    },
+    SelectorList0: function SelectorList0(t0) {
+      this.components = t0;
+    },
+    SelectorList_isInvisible_closure0: function SelectorList_isInvisible_closure0() {
+    },
+    SelectorList_asSassList_closure0: function SelectorList_asSassList_closure0() {
+    },
+    SelectorList_asSassList__closure0: function SelectorList_asSassList__closure0() {
+    },
+    SelectorList_unify_closure0: function SelectorList_unify_closure0(t0) {
+      this.other = t0;
+    },
+    SelectorList_unify__closure0: function SelectorList_unify__closure0(t0) {
+      this.complex1 = t0;
+    },
+    SelectorList_unify___closure0: function SelectorList_unify___closure0() {
+    },
+    SelectorList_resolveParentSelectors_closure0: function SelectorList_resolveParentSelectors_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.implicitParent = t1;
+      this.parent = t2;
+    },
+    SelectorList_resolveParentSelectors__closure1: function SelectorList_resolveParentSelectors__closure1(t0) {
+      this.complex = t0;
+    },
+    SelectorList_resolveParentSelectors__closure2: function SelectorList_resolveParentSelectors__closure2(t0) {
+      this._box_0 = t0;
+    },
+    SelectorList__complexContainsParentSelector_closure0: function SelectorList__complexContainsParentSelector_closure0() {
+    },
+    SelectorList__complexContainsParentSelector__closure0: function SelectorList__complexContainsParentSelector__closure0() {
+    },
+    SelectorList__resolveParentSelectorsCompound_closure2: function SelectorList__resolveParentSelectorsCompound_closure2() {
+    },
+    SelectorList__resolveParentSelectorsCompound_closure3: function SelectorList__resolveParentSelectorsCompound_closure3(t0) {
+      this.parent = t0;
+    },
+    SelectorList__resolveParentSelectorsCompound_closure4: function SelectorList__resolveParentSelectorsCompound_closure4(t0, t1) {
+      this.compound = t0;
+      this.resolvedMembers = t1;
+    },
+    _NodeSassList: function _NodeSassList() {
+    },
+    closure246: function closure246() {
+    },
+    _closure33: function _closure33() {
+    },
+    closure247: function closure247() {
+    },
+    closure248: function closure248() {
+    },
+    closure249: function closure249() {
+    },
+    closure250: function closure250() {
+    },
+    closure251: function closure251() {
+    },
+    closure252: function closure252() {
+    },
+    SassList$0: function(contents, separator, brackets) {
+      var t1 = new D.SassList0(P.List_List$unmodifiable(contents, type$.legacy_Value_2), separator, brackets);
+      t1.SassList$3$brackets0(contents, separator, brackets);
+      return t1;
+    },
+    SassList0: function SassList0(t0, t1, t2) {
+      this._list1$_contents = t0;
+      this.separator = t1;
+      this.hasBrackets = t2;
+    },
+    SassList_isBlank_closure0: function SassList_isBlank_closure0() {
+    },
+    ListSeparator0: function ListSeparator0(t0) {
+      this._list1$_name = t0;
+    },
+    PseudoSelector$0: function($name, argument, element, selector) {
+      var t1 = !element,
+        t2 = t1 && !D.PseudoSelector__isFakePseudoElement0($name);
+      return new D.PseudoSelector0($name, B.unvendor0($name), t2, t1, argument, selector);
+    },
+    PseudoSelector__isFakePseudoElement0: function($name) {
+      switch (C.JSString_methods._codeUnitAt$1($name, 0)) {
+        case 97:
+        case 65:
+          return B.equalsIgnoreCase0($name, "after");
+        case 98:
+        case 66:
+          return B.equalsIgnoreCase0($name, "before");
+        case 102:
+        case 70:
+          return B.equalsIgnoreCase0($name, "first-line") || B.equalsIgnoreCase0($name, "first-letter");
+        default:
+          return false;
+      }
+    },
+    PseudoSelector0: function PseudoSelector0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.name = t0;
+      _.normalizedName = t1;
+      _.isClass = t2;
+      _.isSyntacticClass = t3;
+      _.argument = t4;
+      _.selector = t5;
+      _._pseudo0$_maxSpecificity = _._pseudo0$_minSpecificity = null;
+    },
+    QualifiedName0: function QualifiedName0(t0, t1) {
+      this.name = t0;
+      this.namespace = t1;
+    },
+    SourceMapBuffer: function SourceMapBuffer(t0, t1, t2) {
+      var _ = this;
+      _._source_map_buffer$_buffer = t0;
+      _._entries = t1;
+      _._source_map_buffer$_sourceFiles = t2;
+      _._column = _._line = 0;
+      _._inSpan = false;
+    },
+    SourceMapBuffer__addEntry_closure0: function SourceMapBuffer__addEntry_closure0(t0) {
+      this.source = t0;
+    },
+    SourceMapBuffer_buildSourceMap_closure0: function SourceMapBuffer_buildSourceMap_closure0(t0, t1) {
+      this._box_0 = t0;
+      this.prefixLength = t1;
+    },
+    StringExpression0: function StringExpression0(t0, t1) {
+      this.text = t0;
+      this.hasQuotes = t1;
+    },
+    _codepointForIndex0: function(index, lengthInCodepoints, allowNegative) {
+      var result;
+      if (index === 0)
+        return 0;
+      if (index > 0)
+        return Math.min(index - 1, H.checkNum(lengthInCodepoints));
+      result = lengthInCodepoints + index;
+      if (result < 0 && !allowNegative)
+        return 0;
+      return result;
+    },
+    _function6: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function0($name, $arguments, callback, "sass:string");
+    },
+    closure123: function closure123() {
+    },
+    closure122: function closure122() {
+    },
+    closure118: function closure118() {
+    },
+    closure117: function closure117() {
+    },
+    closure116: function closure116() {
+    },
+    closure115: function closure115() {
+    },
+    closure121: function closure121() {
+    },
+    closure120: function closure120() {
+    },
+    closure119: function closure119() {
+    },
+    _NodeSassString: function _NodeSassString() {
+    },
+    closure228: function closure228() {
+    },
+    closure229: function closure229() {
+    },
+    closure230: function closure230() {
+    },
+    closure231: function closure231() {
+    },
+    SassString$0: function(text, quotes) {
+      return new D.SassString0(text, quotes);
+    },
+    SassString0: function SassString0(t0, t1) {
+      this.text = t0;
+      this.hasQuotes = t1;
+      this._string$_sassLength = null;
+    },
+    current: function() {
+      var exception, t1, path, lastIndex, uri = null;
+      try {
+        uri = P.Uri_base();
+      } catch (exception) {
+        if (type$.legacy_Exception._is(H.unwrapException(exception))) {
+          t1 = $._current;
+          if (t1 != null)
+            return t1;
+          throw exception;
+        } else
+          throw exception;
+      }
+      if (J.$eq$(uri, $._currentUriBase))
+        return $._current;
+      $._currentUriBase = uri;
+      if ($.$get$Style_platform() == $.$get$Style_url())
+        t1 = $._current = uri.resolve$1(".").toString$0(0);
+      else {
+        path = uri.toFilePath$0();
+        lastIndex = path.length - 1;
+        t1 = $._current = lastIndex === 0 ? path : C.JSString_methods.substring$2(path, 0, lastIndex);
+      }
+      return t1;
+    },
+    absolute: function(part1) {
+      var _null = null;
+      return $.$get$context().absolute$7(part1, _null, _null, _null, _null, _null, _null);
+    },
+    dirname: function(path) {
+      return $.$get$context().dirname$1(path);
+    },
+    join: function(part1, part2, part3) {
+      var _null = null;
+      return $.$get$context().join$8(0, part1, part2, part3, _null, _null, _null, _null, _null);
+    }
+  },
+  E = {Promise: function Promise() {
+    }, Date: function Date() {
+    }, JsError: function JsError() {
+    }, Atomics: function Atomics() {
+    }, PosixStyle: function PosixStyle(t0, t1, t2) {
+      this.separatorPattern = t0;
+      this.needsSeparatorPattern = t1;
+      this.rootPattern = t2;
+    }, UserDefinedCallable: function UserDefinedCallable(t0, t1, t2) {
+      this.declaration = t0;
+      this.environment = t1;
+      this.$ti = t2;
+    },
+    SassException$: function(message, span) {
+      return new E.SassException(message, span);
+    },
+    MultiSpanSassException$: function(message, span, primaryLabel, secondarySpans) {
+      return new E.MultiSpanSassException(primaryLabel, H.ConstantMap_ConstantMap$from(secondarySpans, type$.legacy_FileSpan, type$.legacy_String), message, span);
+    },
+    SassRuntimeException$: function(message, span, trace) {
+      return new E.SassRuntimeException(trace, message, span);
+    },
+    MultiSpanSassRuntimeException$: function(message, span, primaryLabel, secondarySpans, trace) {
+      return new E.MultiSpanSassRuntimeException(trace, primaryLabel, H.ConstantMap_ConstantMap$from(secondarySpans, type$.legacy_FileSpan, type$.legacy_String), message, span);
+    },
+    SassFormatException$: function(message, span) {
+      return new E.SassFormatException(message, span);
+    },
+    SassScriptException$: function(message) {
+      return new E.SassScriptException(message);
+    },
+    MultiSpanSassScriptException$: function(message, primaryLabel, secondarySpans) {
+      return new E.MultiSpanSassScriptException(primaryLabel, H.ConstantMap_ConstantMap$from(secondarySpans, type$.legacy_FileSpan, type$.legacy_String), message);
+    },
+    SassException: function SassException(t0, t1) {
+      this._span_exception$_message = t0;
+      this._span = t1;
+    },
+    MultiSpanSassException: function MultiSpanSassException(t0, t1, t2, t3) {
+      var _ = this;
+      _.primaryLabel = t0;
+      _.secondarySpans = t1;
+      _._span_exception$_message = t2;
+      _._span = t3;
+    },
+    SassRuntimeException: function SassRuntimeException(t0, t1, t2) {
+      this.trace = t0;
+      this._span_exception$_message = t1;
+      this._span = t2;
+    },
+    MultiSpanSassRuntimeException: function MultiSpanSassRuntimeException(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.trace = t0;
+      _.primaryLabel = t1;
+      _.secondarySpans = t2;
+      _._span_exception$_message = t3;
+      _._span = t4;
+    },
+    SassFormatException: function SassFormatException(t0, t1) {
+      this._span_exception$_message = t0;
+      this._span = t1;
+    },
+    SassScriptException: function SassScriptException(t0) {
+      this.message = t0;
+    },
+    MultiSpanSassScriptException: function MultiSpanSassScriptException(t0, t1, t2) {
+      this.primaryLabel = t0;
+      this.secondarySpans = t1;
+      this.message = t2;
+    },
+    ImporterResult: function ImporterResult(t0, t1, t2) {
+      this.contents = t0;
+      this._sourceMapUrl = t1;
+      this.syntax = t2;
+    },
+    KeyframeSelectorParser$: function(contents, logger) {
+      var t1 = S.SpanScanner$(contents, null);
+      return new E.KeyframeSelectorParser(t1, logger);
+    },
+    KeyframeSelectorParser: function KeyframeSelectorParser(t0, t1) {
+      this.scanner = t0;
+      this.logger = t1;
+    },
+    KeyframeSelectorParser_parse_closure: function KeyframeSelectorParser_parse_closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor$0: function(functions, importCache, logger, nodeImporter, sourceMap) {
+      var t1 = type$.legacy_String,
+        t2 = type$.legacy_Uri,
+        t3 = type$.legacy_Module_legacy_AsyncCallable,
+        t4 = type$.legacy_AstNode,
+        t5 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Tuple2_of_legacy_String_and_legacy_AstNode),
+        t6 = logger == null ? C.StderrLogger_false : logger;
+      t5 = new E._EvaluateVisitor0(importCache, nodeImporter, P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_AsyncCallable), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), P.LinkedHashMap_LinkedHashMap$_empty(t2, t4), t6, sourceMap, Q.AsyncEnvironment$(sourceMap), P.LinkedHashSet_LinkedHashSet$_empty(t1), P.LinkedHashMap_LinkedHashMap$_empty(t2, t4), t5, C.Configuration_Map_empty_null_true);
+      t5._EvaluateVisitor$5$functions$importCache$logger$nodeImporter$sourceMap0(functions, importCache, logger, nodeImporter, sourceMap);
+      return t5;
+    },
+    _EvaluateVisitor0: function _EvaluateVisitor0(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
+      var _ = this;
+      _._async_evaluate$_importCache = t0;
+      _._async_evaluate$_nodeImporter = t1;
+      _._async_evaluate$_builtInFunctions = t2;
+      _._async_evaluate$_builtInModules = t3;
+      _._async_evaluate$_modules = t4;
+      _._async_evaluate$_moduleNodes = t5;
+      _._async_evaluate$_logger = t6;
+      _._async_evaluate$_sourceMap = t7;
+      _._async_evaluate$_environment = t8;
+      _._async_evaluate$_declarationName = _._async_evaluate$_parent = _._async_evaluate$_mediaQueries = _._async_evaluate$_styleRule = null;
+      _._async_evaluate$_member = "root stylesheet";
+      _._async_evaluate$_importSpan = _._async_evaluate$_callableNode = null;
+      _._async_evaluate$_inKeyframes = _._async_evaluate$_atRootExcludingStyleRule = _._async_evaluate$_inUnknownAtRule = _._async_evaluate$_inFunction = false;
+      _._async_evaluate$_includedFiles = t9;
+      _._async_evaluate$_activeModules = t10;
+      _._async_evaluate$_stack = t11;
+      _._async_evaluate$_extender = _._async_evaluate$_outOfOrderImports = _._async_evaluate$_endOfImports = _._async_evaluate$_root = _._async_evaluate$_stylesheet = _._async_evaluate$_importer = null;
+      _._async_evaluate$_configuration = t12;
+    },
+    _EvaluateVisitor_closure9: function _EvaluateVisitor_closure9(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure10: function _EvaluateVisitor_closure10(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure11: function _EvaluateVisitor_closure11(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure12: function _EvaluateVisitor_closure12(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure13: function _EvaluateVisitor_closure13(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure14: function _EvaluateVisitor_closure14(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure15: function _EvaluateVisitor_closure15(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure16: function _EvaluateVisitor_closure16(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__closure4: function _EvaluateVisitor__closure4(t0, t1, t2) {
+      this.$this = t0;
+      this.name = t1;
+      this.module = t2;
+    },
+    _EvaluateVisitor_closure17: function _EvaluateVisitor_closure17(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure18: function _EvaluateVisitor_closure18(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__closure2: function _EvaluateVisitor__closure2(t0, t1) {
+      this.values = t0;
+      this.span = t1;
+    },
+    _EvaluateVisitor__closure3: function _EvaluateVisitor__closure3(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_run_closure0: function _EvaluateVisitor_run_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.importer = t2;
+    },
+    _EvaluateVisitor__withWarnCallback_closure0: function _EvaluateVisitor__withWarnCallback_closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__loadModule_closure1: function _EvaluateVisitor__loadModule_closure1(t0, t1) {
+      this.callback = t0;
+      this.builtInModule = t1;
+    },
+    _EvaluateVisitor__loadModule_closure2: function _EvaluateVisitor__loadModule_closure2(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.$this = t0;
+      _.url = t1;
+      _.nodeWithSpan = t2;
+      _.baseUrl = t3;
+      _.namesInErrors = t4;
+      _.configuration = t5;
+      _.callback = t6;
+    },
+    _EvaluateVisitor__execute_closure0: function _EvaluateVisitor__execute_closure0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.importer = t2;
+      _.stylesheet = t3;
+      _.extender = t4;
+      _.configuration = t5;
+    },
+    _EvaluateVisitor__combineCss_closure2: function _EvaluateVisitor__combineCss_closure2() {
+    },
+    _EvaluateVisitor__combineCss_closure3: function _EvaluateVisitor__combineCss_closure3(t0) {
+      this.selectors = t0;
+    },
+    _EvaluateVisitor__combineCss_closure4: function _EvaluateVisitor__combineCss_closure4() {
+    },
+    _EvaluateVisitor__extendModules_closure1: function _EvaluateVisitor__extendModules_closure1(t0) {
+      this.originalSelectors = t0;
+    },
+    _EvaluateVisitor__extendModules_closure2: function _EvaluateVisitor__extendModules_closure2() {
+    },
+    _EvaluateVisitor__topologicalModules_visitModule0: function _EvaluateVisitor__topologicalModules_visitModule0(t0, t1) {
+      this.seen = t0;
+      this.sorted = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure2: function _EvaluateVisitor_visitAtRootRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.resolved = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure3: function _EvaluateVisitor_visitAtRootRule_closure3(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure4: function _EvaluateVisitor_visitAtRootRule_closure4(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure5: function _EvaluateVisitor__scopeForAtRoot_closure5(t0, t1, t2) {
+      this.$this = t0;
+      this.newParent = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure6: function _EvaluateVisitor__scopeForAtRoot_closure6(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure7: function _EvaluateVisitor__scopeForAtRoot_closure7(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot__closure0: function _EvaluateVisitor__scopeForAtRoot__closure0(t0, t1) {
+      this.innerScope = t0;
+      this.callback = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure8: function _EvaluateVisitor__scopeForAtRoot_closure8(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure9: function _EvaluateVisitor__scopeForAtRoot_closure9() {
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure10: function _EvaluateVisitor__scopeForAtRoot_closure10(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor_visitContentRule_closure0: function _EvaluateVisitor_visitContentRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.content = t1;
+    },
+    _EvaluateVisitor_visitDeclaration_closure0: function _EvaluateVisitor_visitDeclaration_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitEachRule_closure2: function _EvaluateVisitor_visitEachRule_closure2(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitEachRule_closure3: function _EvaluateVisitor_visitEachRule_closure3(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitEachRule_closure4: function _EvaluateVisitor_visitEachRule_closure4(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.list = t1;
+      _.setVariables = t2;
+      _.node = t3;
+    },
+    _EvaluateVisitor_visitEachRule__closure0: function _EvaluateVisitor_visitEachRule__closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.setVariables = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitEachRule___closure0: function _EvaluateVisitor_visitEachRule___closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitExtendRule_closure0: function _EvaluateVisitor_visitExtendRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.targetText = t1;
+    },
+    _EvaluateVisitor_visitAtRule_closure1: function _EvaluateVisitor_visitAtRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRule__closure0: function _EvaluateVisitor_visitAtRule__closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRule_closure2: function _EvaluateVisitor_visitAtRule_closure2() {
+    },
+    _EvaluateVisitor_visitForRule_closure4: function _EvaluateVisitor_visitForRule_closure4(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure5: function _EvaluateVisitor_visitForRule_closure5(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure6: function _EvaluateVisitor_visitForRule_closure6(t0) {
+      this.fromNumber = t0;
+    },
+    _EvaluateVisitor_visitForRule_closure7: function _EvaluateVisitor_visitForRule_closure7(t0, t1) {
+      this.toNumber = t0;
+      this.fromNumber = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure8: function _EvaluateVisitor_visitForRule_closure8(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.node = t2;
+      _.from = t3;
+      _.direction = t4;
+      _.fromNumber = t5;
+    },
+    _EvaluateVisitor_visitForRule__closure0: function _EvaluateVisitor_visitForRule__closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitForwardRule_closure1: function _EvaluateVisitor_visitForwardRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForwardRule_closure2: function _EvaluateVisitor_visitForwardRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor__assertConfigurationIsEmpty_closure0: function _EvaluateVisitor__assertConfigurationIsEmpty_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.only = t1;
+      this.nameInError = t2;
+    },
+    _EvaluateVisitor_visitIfRule_closure0: function _EvaluateVisitor_visitIfRule_closure0(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _EvaluateVisitor_visitIfRule__closure0: function _EvaluateVisitor_visitIfRule__closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__visitDynamicImport_closure0: function _EvaluateVisitor__visitDynamicImport_closure0(t0, t1) {
+      this.$this = t0;
+      this.$import = t1;
+    },
+    _EvaluateVisitor__visitDynamicImport__closure0: function _EvaluateVisitor__visitDynamicImport__closure0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.importer = t2;
+      _.stylesheet = t3;
+      _.environment = t4;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure2: function _EvaluateVisitor_visitIncludeRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure3: function _EvaluateVisitor_visitIncludeRule_closure3(t0) {
+      this.node = t0;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure4: function _EvaluateVisitor_visitIncludeRule_closure4(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.contentCallable = t1;
+      _.mixin = t2;
+      _.nodeWithSpan = t3;
+    },
+    _EvaluateVisitor_visitIncludeRule__closure0: function _EvaluateVisitor_visitIncludeRule__closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.mixin = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitIncludeRule___closure0: function _EvaluateVisitor_visitIncludeRule___closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.mixin = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitIncludeRule____closure0: function _EvaluateVisitor_visitIncludeRule____closure0(t0, t1) {
+      this.$this = t0;
+      this.statement = t1;
+    },
+    _EvaluateVisitor_visitMediaRule_closure1: function _EvaluateVisitor_visitMediaRule_closure1(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.mergedQueries = t1;
+      _.queries = t2;
+      _.node = t3;
+    },
+    _EvaluateVisitor_visitMediaRule__closure0: function _EvaluateVisitor_visitMediaRule__closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitMediaRule___closure0: function _EvaluateVisitor_visitMediaRule___closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitMediaRule_closure2: function _EvaluateVisitor_visitMediaRule_closure2(t0) {
+      this.mergedQueries = t0;
+    },
+    _EvaluateVisitor__visitMediaQueries_closure0: function _EvaluateVisitor__visitMediaQueries_closure0(t0, t1) {
+      this.$this = t0;
+      this.resolved = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure6: function _EvaluateVisitor_visitStyleRule_closure6(t0, t1) {
+      this.$this = t0;
+      this.selectorText = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure7: function _EvaluateVisitor_visitStyleRule_closure7(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure8: function _EvaluateVisitor_visitStyleRule_closure8() {
+    },
+    _EvaluateVisitor_visitStyleRule_closure9: function _EvaluateVisitor_visitStyleRule_closure9(t0, t1) {
+      this.$this = t0;
+      this.selectorText = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure10: function _EvaluateVisitor_visitStyleRule_closure10(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure11: function _EvaluateVisitor_visitStyleRule_closure11(t0, t1, t2) {
+      this.$this = t0;
+      this.rule = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitStyleRule__closure0: function _EvaluateVisitor_visitStyleRule__closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure12: function _EvaluateVisitor_visitStyleRule_closure12() {
+    },
+    _EvaluateVisitor_visitSupportsRule_closure1: function _EvaluateVisitor_visitSupportsRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitSupportsRule__closure0: function _EvaluateVisitor_visitSupportsRule__closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitSupportsRule_closure2: function _EvaluateVisitor_visitSupportsRule_closure2() {
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure2: function _EvaluateVisitor_visitVariableDeclaration_closure2(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.override = t2;
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure3: function _EvaluateVisitor_visitVariableDeclaration_closure3(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure4: function _EvaluateVisitor_visitVariableDeclaration_closure4(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.value = t2;
+    },
+    _EvaluateVisitor_visitUseRule_closure0: function _EvaluateVisitor_visitUseRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWarnRule_closure0: function _EvaluateVisitor_visitWarnRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWhileRule_closure0: function _EvaluateVisitor_visitWhileRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWhileRule__closure0: function _EvaluateVisitor_visitWhileRule__closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitBinaryOperationExpression_closure0: function _EvaluateVisitor_visitBinaryOperationExpression_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitVariableExpression_closure0: function _EvaluateVisitor_visitVariableExpression_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitListExpression_closure0: function _EvaluateVisitor_visitListExpression_closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitFunctionExpression_closure1: function _EvaluateVisitor_visitFunctionExpression_closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.plainName = t2;
+    },
+    _EvaluateVisitor_visitFunctionExpression_closure2: function _EvaluateVisitor_visitFunctionExpression_closure2(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor__runUserDefinedCallable_closure0: function _EvaluateVisitor__runUserDefinedCallable_closure0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.callable = t1;
+      _.evaluated = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable__closure0: function _EvaluateVisitor__runUserDefinedCallable__closure0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.evaluated = t1;
+      _.callable = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable___closure0: function _EvaluateVisitor__runUserDefinedCallable___closure0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.evaluated = t1;
+      _.callable = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable____closure0: function _EvaluateVisitor__runUserDefinedCallable____closure0() {
+    },
+    _EvaluateVisitor__runFunctionCallable_closure0: function _EvaluateVisitor__runFunctionCallable_closure0(t0, t1) {
+      this.$this = t0;
+      this.callable = t1;
+    },
+    _EvaluateVisitor__runBuiltInCallable_closure1: function _EvaluateVisitor__runBuiltInCallable_closure1(t0, t1, t2) {
+      this.overload = t0;
+      this.evaluated = t1;
+      this.namedSet = t2;
+    },
+    _EvaluateVisitor__runBuiltInCallable_closure2: function _EvaluateVisitor__runBuiltInCallable_closure2() {
+    },
+    _EvaluateVisitor__evaluateArguments_closure0: function _EvaluateVisitor__evaluateArguments_closure0(t0, t1, t2) {
+      this.named = t0;
+      this.namedNodes = t1;
+      this.restNodeForSpan = t2;
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure3: function _EvaluateVisitor__evaluateMacroArguments_closure3() {
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure4: function _EvaluateVisitor__evaluateMacroArguments_closure4() {
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure5: function _EvaluateVisitor__evaluateMacroArguments_closure5(t0) {
+      this.named = t0;
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure6: function _EvaluateVisitor__evaluateMacroArguments_closure6() {
+    },
+    _EvaluateVisitor__addRestMap_closure1: function _EvaluateVisitor__addRestMap_closure1(t0) {
+      this.T = t0;
+    },
+    _EvaluateVisitor__addRestMap_closure2: function _EvaluateVisitor__addRestMap_closure2(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.values = t2;
+      _.map = t3;
+      _.nodeWithSpan = t4;
+    },
+    _EvaluateVisitor__verifyArguments_closure0: function _EvaluateVisitor__verifyArguments_closure0(t0, t1, t2) {
+      this.$arguments = t0;
+      this.positional = t1;
+      this.named = t2;
+    },
+    _EvaluateVisitor_visitStringExpression_closure0: function _EvaluateVisitor_visitStringExpression_closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitCssAtRule_closure1: function _EvaluateVisitor_visitCssAtRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssAtRule_closure2: function _EvaluateVisitor_visitCssAtRule_closure2() {
+    },
+    _EvaluateVisitor_visitCssKeyframeBlock_closure1: function _EvaluateVisitor_visitCssKeyframeBlock_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssKeyframeBlock_closure2: function _EvaluateVisitor_visitCssKeyframeBlock_closure2() {
+    },
+    _EvaluateVisitor_visitCssMediaRule_closure1: function _EvaluateVisitor_visitCssMediaRule_closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.mergedQueries = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitCssMediaRule__closure0: function _EvaluateVisitor_visitCssMediaRule__closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssMediaRule___closure0: function _EvaluateVisitor_visitCssMediaRule___closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssMediaRule_closure2: function _EvaluateVisitor_visitCssMediaRule_closure2(t0) {
+      this.mergedQueries = t0;
+    },
+    _EvaluateVisitor_visitCssStyleRule_closure1: function _EvaluateVisitor_visitCssStyleRule_closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.rule = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitCssStyleRule__closure0: function _EvaluateVisitor_visitCssStyleRule__closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssStyleRule_closure2: function _EvaluateVisitor_visitCssStyleRule_closure2() {
+    },
+    _EvaluateVisitor_visitCssSupportsRule_closure1: function _EvaluateVisitor_visitCssSupportsRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssSupportsRule__closure0: function _EvaluateVisitor_visitCssSupportsRule__closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssSupportsRule_closure2: function _EvaluateVisitor_visitCssSupportsRule_closure2() {
+    },
+    _EvaluateVisitor__performInterpolation_closure0: function _EvaluateVisitor__performInterpolation_closure0(t0, t1) {
+      this.$this = t0;
+      this.warnForColor = t1;
+    },
+    _EvaluateVisitor__serialize_closure0: function _EvaluateVisitor__serialize_closure0(t0, t1) {
+      this.value = t0;
+      this.quote = t1;
+    },
+    _EvaluateVisitor__stackTrace_closure0: function _EvaluateVisitor__stackTrace_closure0(t0) {
+      this.$this = t0;
+    },
+    _ImportedCssVisitor0: function _ImportedCssVisitor0(t0) {
+      this._async_evaluate$_visitor = t0;
+    },
+    _ImportedCssVisitor_visitCssAtRule_closure0: function _ImportedCssVisitor_visitCssAtRule_closure0() {
+    },
+    _ImportedCssVisitor_visitCssMediaRule_closure0: function _ImportedCssVisitor_visitCssMediaRule_closure0(t0) {
+      this.hasBeenMerged = t0;
+    },
+    _ImportedCssVisitor_visitCssStyleRule_closure0: function _ImportedCssVisitor_visitCssStyleRule_closure0() {
+    },
+    _ImportedCssVisitor_visitCssSupportsRule_closure0: function _ImportedCssVisitor_visitCssSupportsRule_closure0() {
+    },
+    EvaluateResult: function EvaluateResult(t0) {
+      this.stylesheet = t0;
+    },
+    _ArgumentResults0: function _ArgumentResults0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.positional = t0;
+      _.positionalNodes = t1;
+      _.named = t2;
+      _.namedNodes = t3;
+      _.separator = t4;
+    },
+    StringScannerException$: function(message, span, source) {
+      return new E.StringScannerException(source, message, span);
+    },
+    StringScannerException: function StringScannerException(t0, t1, t2) {
+      this.source = t0;
+      this._span_exception$_message = t1;
+      this._span = t2;
+    },
+    WatchEvent: function WatchEvent(t0, t1) {
+      this.type = t0;
+      this.path = t1;
+    },
+    ChangeType: function ChangeType(t0) {
+      this._watch_event$_name = t0;
+    },
+    _EvaluateVisitor$2: function(functions, importCache, logger, nodeImporter, sourceMap) {
+      var t6,
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_Uri,
+        t3 = type$.legacy_Module_legacy_AsyncCallable_2,
+        t4 = type$.legacy_AstNode_2,
+        t5 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Tuple2_of_legacy_String_and_legacy_AstNode_2);
+      if (nodeImporter == null)
+        t6 = importCache == null ? O.AsyncImportCache$none(logger) : importCache;
+      else
+        t6 = null;
+      t1 = new E._EvaluateVisitor2(t6, nodeImporter, P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_AsyncCallable_2), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), P.LinkedHashMap_LinkedHashMap$_empty(t2, t4), C.C_StderrLogger, sourceMap, Q.AsyncEnvironment$0(sourceMap), P.LinkedHashSet_LinkedHashSet$_empty(t1), P.LinkedHashMap_LinkedHashMap$_empty(t2, t4), t5, C.Configuration_Map_empty_null_true0);
+      t1._EvaluateVisitor$5$functions$importCache$logger$nodeImporter$sourceMap2(functions, importCache, logger, nodeImporter, sourceMap);
+      return t1;
+    },
+    _EvaluateVisitor2: function _EvaluateVisitor2(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
+      var _ = this;
+      _._async_evaluate0$_importCache = t0;
+      _._async_evaluate0$_nodeImporter = t1;
+      _._async_evaluate0$_builtInFunctions = t2;
+      _._async_evaluate0$_builtInModules = t3;
+      _._async_evaluate0$_modules = t4;
+      _._async_evaluate0$_moduleNodes = t5;
+      _._async_evaluate0$_logger = t6;
+      _._async_evaluate0$_sourceMap = t7;
+      _._async_evaluate0$_environment = t8;
+      _._async_evaluate0$_declarationName = _._async_evaluate0$_parent = _._async_evaluate0$_mediaQueries = _._async_evaluate0$_styleRule = null;
+      _._async_evaluate0$_member = "root stylesheet";
+      _._async_evaluate0$_importSpan = _._async_evaluate0$_callableNode = null;
+      _._async_evaluate0$_inKeyframes = _._async_evaluate0$_atRootExcludingStyleRule = _._async_evaluate0$_inUnknownAtRule = _._async_evaluate0$_inFunction = false;
+      _._async_evaluate0$_includedFiles = t9;
+      _._async_evaluate0$_activeModules = t10;
+      _._async_evaluate0$_stack = t11;
+      _._async_evaluate0$_extender = _._async_evaluate0$_outOfOrderImports = _._async_evaluate0$_endOfImports = _._async_evaluate0$_root = _._async_evaluate0$_stylesheet = _._async_evaluate0$_importer = null;
+      _._async_evaluate0$_configuration = t12;
+    },
+    _EvaluateVisitor_closure29: function _EvaluateVisitor_closure29(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure30: function _EvaluateVisitor_closure30(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure31: function _EvaluateVisitor_closure31(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure32: function _EvaluateVisitor_closure32(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure33: function _EvaluateVisitor_closure33(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure34: function _EvaluateVisitor_closure34(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure35: function _EvaluateVisitor_closure35(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure36: function _EvaluateVisitor_closure36(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__closure10: function _EvaluateVisitor__closure10(t0, t1, t2) {
+      this.$this = t0;
+      this.name = t1;
+      this.module = t2;
+    },
+    _EvaluateVisitor_closure37: function _EvaluateVisitor_closure37(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure38: function _EvaluateVisitor_closure38(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__closure8: function _EvaluateVisitor__closure8(t0, t1) {
+      this.values = t0;
+      this.span = t1;
+    },
+    _EvaluateVisitor__closure9: function _EvaluateVisitor__closure9(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_run_closure2: function _EvaluateVisitor_run_closure2(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.importer = t2;
+    },
+    _EvaluateVisitor__withWarnCallback_closure2: function _EvaluateVisitor__withWarnCallback_closure2(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__loadModule_closure5: function _EvaluateVisitor__loadModule_closure5(t0, t1) {
+      this.callback = t0;
+      this.builtInModule = t1;
+    },
+    _EvaluateVisitor__loadModule_closure6: function _EvaluateVisitor__loadModule_closure6(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.$this = t0;
+      _.url = t1;
+      _.nodeWithSpan = t2;
+      _.baseUrl = t3;
+      _.namesInErrors = t4;
+      _.configuration = t5;
+      _.callback = t6;
+    },
+    _EvaluateVisitor__execute_closure2: function _EvaluateVisitor__execute_closure2(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.importer = t2;
+      _.stylesheet = t3;
+      _.extender = t4;
+      _.configuration = t5;
+    },
+    _EvaluateVisitor__combineCss_closure8: function _EvaluateVisitor__combineCss_closure8() {
+    },
+    _EvaluateVisitor__combineCss_closure9: function _EvaluateVisitor__combineCss_closure9(t0) {
+      this.selectors = t0;
+    },
+    _EvaluateVisitor__combineCss_closure10: function _EvaluateVisitor__combineCss_closure10() {
+    },
+    _EvaluateVisitor__extendModules_closure5: function _EvaluateVisitor__extendModules_closure5(t0) {
+      this.originalSelectors = t0;
+    },
+    _EvaluateVisitor__extendModules_closure6: function _EvaluateVisitor__extendModules_closure6() {
+    },
+    _EvaluateVisitor__topologicalModules_visitModule2: function _EvaluateVisitor__topologicalModules_visitModule2(t0, t1) {
+      this.seen = t0;
+      this.sorted = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure8: function _EvaluateVisitor_visitAtRootRule_closure8(t0, t1) {
+      this.$this = t0;
+      this.resolved = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure9: function _EvaluateVisitor_visitAtRootRule_closure9(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure10: function _EvaluateVisitor_visitAtRootRule_closure10(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure17: function _EvaluateVisitor__scopeForAtRoot_closure17(t0, t1, t2) {
+      this.$this = t0;
+      this.newParent = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure18: function _EvaluateVisitor__scopeForAtRoot_closure18(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure19: function _EvaluateVisitor__scopeForAtRoot_closure19(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot__closure2: function _EvaluateVisitor__scopeForAtRoot__closure2(t0, t1) {
+      this.innerScope = t0;
+      this.callback = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure20: function _EvaluateVisitor__scopeForAtRoot_closure20(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure21: function _EvaluateVisitor__scopeForAtRoot_closure21() {
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure22: function _EvaluateVisitor__scopeForAtRoot_closure22(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor_visitContentRule_closure2: function _EvaluateVisitor_visitContentRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.content = t1;
+    },
+    _EvaluateVisitor_visitDeclaration_closure2: function _EvaluateVisitor_visitDeclaration_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitEachRule_closure8: function _EvaluateVisitor_visitEachRule_closure8(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitEachRule_closure9: function _EvaluateVisitor_visitEachRule_closure9(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitEachRule_closure10: function _EvaluateVisitor_visitEachRule_closure10(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.list = t1;
+      _.setVariables = t2;
+      _.node = t3;
+    },
+    _EvaluateVisitor_visitEachRule__closure2: function _EvaluateVisitor_visitEachRule__closure2(t0, t1, t2) {
+      this.$this = t0;
+      this.setVariables = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitEachRule___closure2: function _EvaluateVisitor_visitEachRule___closure2(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitExtendRule_closure2: function _EvaluateVisitor_visitExtendRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.targetText = t1;
+    },
+    _EvaluateVisitor_visitAtRule_closure5: function _EvaluateVisitor_visitAtRule_closure5(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRule__closure2: function _EvaluateVisitor_visitAtRule__closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRule_closure6: function _EvaluateVisitor_visitAtRule_closure6() {
+    },
+    _EvaluateVisitor_visitForRule_closure14: function _EvaluateVisitor_visitForRule_closure14(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure15: function _EvaluateVisitor_visitForRule_closure15(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure16: function _EvaluateVisitor_visitForRule_closure16(t0) {
+      this.fromNumber = t0;
+    },
+    _EvaluateVisitor_visitForRule_closure17: function _EvaluateVisitor_visitForRule_closure17(t0, t1) {
+      this.toNumber = t0;
+      this.fromNumber = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure18: function _EvaluateVisitor_visitForRule_closure18(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.node = t2;
+      _.from = t3;
+      _.direction = t4;
+      _.fromNumber = t5;
+    },
+    _EvaluateVisitor_visitForRule__closure2: function _EvaluateVisitor_visitForRule__closure2(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitForwardRule_closure5: function _EvaluateVisitor_visitForwardRule_closure5(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForwardRule_closure6: function _EvaluateVisitor_visitForwardRule_closure6(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor__assertConfigurationIsEmpty_closure2: function _EvaluateVisitor__assertConfigurationIsEmpty_closure2(t0, t1, t2) {
+      this.$this = t0;
+      this.only = t1;
+      this.nameInError = t2;
+    },
+    _EvaluateVisitor_visitIfRule_closure2: function _EvaluateVisitor_visitIfRule_closure2(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _EvaluateVisitor_visitIfRule__closure2: function _EvaluateVisitor_visitIfRule__closure2(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__visitDynamicImport_closure2: function _EvaluateVisitor__visitDynamicImport_closure2(t0, t1) {
+      this.$this = t0;
+      this.$import = t1;
+    },
+    _EvaluateVisitor__visitDynamicImport__closure2: function _EvaluateVisitor__visitDynamicImport__closure2(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.importer = t2;
+      _.stylesheet = t3;
+      _.environment = t4;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure8: function _EvaluateVisitor_visitIncludeRule_closure8(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure9: function _EvaluateVisitor_visitIncludeRule_closure9(t0) {
+      this.node = t0;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure10: function _EvaluateVisitor_visitIncludeRule_closure10(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.contentCallable = t1;
+      _.mixin = t2;
+      _.nodeWithSpan = t3;
+    },
+    _EvaluateVisitor_visitIncludeRule__closure2: function _EvaluateVisitor_visitIncludeRule__closure2(t0, t1, t2) {
+      this.$this = t0;
+      this.mixin = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitIncludeRule___closure2: function _EvaluateVisitor_visitIncludeRule___closure2(t0, t1, t2) {
+      this.$this = t0;
+      this.mixin = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitIncludeRule____closure2: function _EvaluateVisitor_visitIncludeRule____closure2(t0, t1) {
+      this.$this = t0;
+      this.statement = t1;
+    },
+    _EvaluateVisitor_visitMediaRule_closure5: function _EvaluateVisitor_visitMediaRule_closure5(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.mergedQueries = t1;
+      _.queries = t2;
+      _.node = t3;
+    },
+    _EvaluateVisitor_visitMediaRule__closure2: function _EvaluateVisitor_visitMediaRule__closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitMediaRule___closure2: function _EvaluateVisitor_visitMediaRule___closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitMediaRule_closure6: function _EvaluateVisitor_visitMediaRule_closure6(t0) {
+      this.mergedQueries = t0;
+    },
+    _EvaluateVisitor__visitMediaQueries_closure2: function _EvaluateVisitor__visitMediaQueries_closure2(t0, t1) {
+      this.$this = t0;
+      this.resolved = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure20: function _EvaluateVisitor_visitStyleRule_closure20(t0, t1) {
+      this.$this = t0;
+      this.selectorText = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure21: function _EvaluateVisitor_visitStyleRule_closure21(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure22: function _EvaluateVisitor_visitStyleRule_closure22() {
+    },
+    _EvaluateVisitor_visitStyleRule_closure23: function _EvaluateVisitor_visitStyleRule_closure23(t0, t1) {
+      this.$this = t0;
+      this.selectorText = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure24: function _EvaluateVisitor_visitStyleRule_closure24(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure25: function _EvaluateVisitor_visitStyleRule_closure25(t0, t1, t2) {
+      this.$this = t0;
+      this.rule = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitStyleRule__closure2: function _EvaluateVisitor_visitStyleRule__closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure26: function _EvaluateVisitor_visitStyleRule_closure26() {
+    },
+    _EvaluateVisitor_visitSupportsRule_closure5: function _EvaluateVisitor_visitSupportsRule_closure5(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitSupportsRule__closure2: function _EvaluateVisitor_visitSupportsRule__closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitSupportsRule_closure6: function _EvaluateVisitor_visitSupportsRule_closure6() {
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure8: function _EvaluateVisitor_visitVariableDeclaration_closure8(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.override = t2;
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure9: function _EvaluateVisitor_visitVariableDeclaration_closure9(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure10: function _EvaluateVisitor_visitVariableDeclaration_closure10(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.value = t2;
+    },
+    _EvaluateVisitor_visitUseRule_closure2: function _EvaluateVisitor_visitUseRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWarnRule_closure2: function _EvaluateVisitor_visitWarnRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWhileRule_closure2: function _EvaluateVisitor_visitWhileRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWhileRule__closure2: function _EvaluateVisitor_visitWhileRule__closure2(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitBinaryOperationExpression_closure2: function _EvaluateVisitor_visitBinaryOperationExpression_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitVariableExpression_closure2: function _EvaluateVisitor_visitVariableExpression_closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitListExpression_closure2: function _EvaluateVisitor_visitListExpression_closure2(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitFunctionExpression_closure5: function _EvaluateVisitor_visitFunctionExpression_closure5(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.plainName = t2;
+    },
+    _EvaluateVisitor_visitFunctionExpression_closure6: function _EvaluateVisitor_visitFunctionExpression_closure6(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor__runUserDefinedCallable_closure2: function _EvaluateVisitor__runUserDefinedCallable_closure2(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.callable = t1;
+      _.evaluated = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable__closure2: function _EvaluateVisitor__runUserDefinedCallable__closure2(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.evaluated = t1;
+      _.callable = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable___closure2: function _EvaluateVisitor__runUserDefinedCallable___closure2(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.evaluated = t1;
+      _.callable = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable____closure2: function _EvaluateVisitor__runUserDefinedCallable____closure2() {
+    },
+    _EvaluateVisitor__runFunctionCallable_closure2: function _EvaluateVisitor__runFunctionCallable_closure2(t0, t1) {
+      this.$this = t0;
+      this.callable = t1;
+    },
+    _EvaluateVisitor__runBuiltInCallable_closure5: function _EvaluateVisitor__runBuiltInCallable_closure5(t0, t1, t2) {
+      this.overload = t0;
+      this.evaluated = t1;
+      this.namedSet = t2;
+    },
+    _EvaluateVisitor__runBuiltInCallable_closure6: function _EvaluateVisitor__runBuiltInCallable_closure6() {
+    },
+    _EvaluateVisitor__evaluateArguments_closure2: function _EvaluateVisitor__evaluateArguments_closure2(t0, t1, t2) {
+      this.named = t0;
+      this.namedNodes = t1;
+      this.restNodeForSpan = t2;
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure11: function _EvaluateVisitor__evaluateMacroArguments_closure11() {
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure12: function _EvaluateVisitor__evaluateMacroArguments_closure12() {
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure13: function _EvaluateVisitor__evaluateMacroArguments_closure13(t0) {
+      this.named = t0;
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure14: function _EvaluateVisitor__evaluateMacroArguments_closure14() {
+    },
+    _EvaluateVisitor__addRestMap_closure5: function _EvaluateVisitor__addRestMap_closure5(t0) {
+      this.T = t0;
+    },
+    _EvaluateVisitor__addRestMap_closure6: function _EvaluateVisitor__addRestMap_closure6(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.values = t2;
+      _.map = t3;
+      _.nodeWithSpan = t4;
+    },
+    _EvaluateVisitor__verifyArguments_closure2: function _EvaluateVisitor__verifyArguments_closure2(t0, t1, t2) {
+      this.$arguments = t0;
+      this.positional = t1;
+      this.named = t2;
+    },
+    _EvaluateVisitor_visitStringExpression_closure2: function _EvaluateVisitor_visitStringExpression_closure2(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitCssAtRule_closure5: function _EvaluateVisitor_visitCssAtRule_closure5(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssAtRule_closure6: function _EvaluateVisitor_visitCssAtRule_closure6() {
+    },
+    _EvaluateVisitor_visitCssKeyframeBlock_closure5: function _EvaluateVisitor_visitCssKeyframeBlock_closure5(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssKeyframeBlock_closure6: function _EvaluateVisitor_visitCssKeyframeBlock_closure6() {
+    },
+    _EvaluateVisitor_visitCssMediaRule_closure5: function _EvaluateVisitor_visitCssMediaRule_closure5(t0, t1, t2) {
+      this.$this = t0;
+      this.mergedQueries = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitCssMediaRule__closure2: function _EvaluateVisitor_visitCssMediaRule__closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssMediaRule___closure2: function _EvaluateVisitor_visitCssMediaRule___closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssMediaRule_closure6: function _EvaluateVisitor_visitCssMediaRule_closure6(t0) {
+      this.mergedQueries = t0;
+    },
+    _EvaluateVisitor_visitCssStyleRule_closure5: function _EvaluateVisitor_visitCssStyleRule_closure5(t0, t1, t2) {
+      this.$this = t0;
+      this.rule = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitCssStyleRule__closure2: function _EvaluateVisitor_visitCssStyleRule__closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssStyleRule_closure6: function _EvaluateVisitor_visitCssStyleRule_closure6() {
+    },
+    _EvaluateVisitor_visitCssSupportsRule_closure5: function _EvaluateVisitor_visitCssSupportsRule_closure5(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssSupportsRule__closure2: function _EvaluateVisitor_visitCssSupportsRule__closure2(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssSupportsRule_closure6: function _EvaluateVisitor_visitCssSupportsRule_closure6() {
+    },
+    _EvaluateVisitor__performInterpolation_closure2: function _EvaluateVisitor__performInterpolation_closure2(t0, t1) {
+      this.$this = t0;
+      this.warnForColor = t1;
+    },
+    _EvaluateVisitor__serialize_closure2: function _EvaluateVisitor__serialize_closure2(t0, t1) {
+      this.value = t0;
+      this.quote = t1;
+    },
+    _EvaluateVisitor__stackTrace_closure2: function _EvaluateVisitor__stackTrace_closure2(t0) {
+      this.$this = t0;
+    },
+    _ImportedCssVisitor2: function _ImportedCssVisitor2(t0) {
+      this._async_evaluate0$_visitor = t0;
+    },
+    _ImportedCssVisitor_visitCssAtRule_closure2: function _ImportedCssVisitor_visitCssAtRule_closure2() {
+    },
+    _ImportedCssVisitor_visitCssMediaRule_closure2: function _ImportedCssVisitor_visitCssMediaRule_closure2(t0) {
+      this.hasBeenMerged = t0;
+    },
+    _ImportedCssVisitor_visitCssStyleRule_closure2: function _ImportedCssVisitor_visitCssStyleRule_closure2() {
+    },
+    _ImportedCssVisitor_visitCssSupportsRule_closure2: function _ImportedCssVisitor_visitCssSupportsRule_closure2() {
+    },
+    EvaluateResult0: function EvaluateResult0(t0, t1) {
+      this.stylesheet = t0;
+      this.includedFiles = t1;
+    },
+    _ArgumentResults2: function _ArgumentResults2(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.positional = t0;
+      _.positionalNodes = t1;
+      _.named = t2;
+      _.namedNodes = t3;
+      _.separator = t4;
+    },
+    SassException$0: function(message, span) {
+      return new E.SassException0(message, span);
+    },
+    MultiSpanSassException$0: function(message, span, primaryLabel, secondarySpans) {
+      return new E.MultiSpanSassException0(primaryLabel, H.ConstantMap_ConstantMap$from(secondarySpans, type$.legacy_FileSpan, type$.legacy_String), message, span);
+    },
+    SassRuntimeException$0: function(message, span, trace) {
+      return new E.SassRuntimeException0(trace, message, span);
+    },
+    MultiSpanSassRuntimeException$0: function(message, span, primaryLabel, secondarySpans, trace) {
+      return new E.MultiSpanSassRuntimeException0(trace, primaryLabel, H.ConstantMap_ConstantMap$from(secondarySpans, type$.legacy_FileSpan, type$.legacy_String), message, span);
+    },
+    SassFormatException$0: function(message, span) {
+      return new E.SassFormatException0(message, span);
+    },
+    SassScriptException$0: function(message) {
+      return new E.SassScriptException0(message);
+    },
+    MultiSpanSassScriptException$0: function(message, primaryLabel, secondarySpans) {
+      return new E.MultiSpanSassScriptException0(primaryLabel, H.ConstantMap_ConstantMap$from(secondarySpans, type$.legacy_FileSpan, type$.legacy_String), message);
+    },
+    SassException0: function SassException0(t0, t1) {
+      this._span_exception$_message = t0;
+      this._span = t1;
+    },
+    MultiSpanSassException0: function MultiSpanSassException0(t0, t1, t2, t3) {
+      var _ = this;
+      _.primaryLabel = t0;
+      _.secondarySpans = t1;
+      _._span_exception$_message = t2;
+      _._span = t3;
+    },
+    SassRuntimeException0: function SassRuntimeException0(t0, t1, t2) {
+      this.trace = t0;
+      this._span_exception$_message = t1;
+      this._span = t2;
+    },
+    MultiSpanSassRuntimeException0: function MultiSpanSassRuntimeException0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.trace = t0;
+      _.primaryLabel = t1;
+      _.secondarySpans = t2;
+      _._span_exception$_message = t3;
+      _._span = t4;
+    },
+    SassFormatException0: function SassFormatException0(t0, t1) {
+      this._span_exception$_message = t0;
+      this._span = t1;
+    },
+    SassScriptException0: function SassScriptException0(t0) {
+      this.message = t0;
+    },
+    MultiSpanSassScriptException0: function MultiSpanSassScriptException0(t0, t1, t2) {
+      this.primaryLabel = t0;
+      this.secondarySpans = t1;
+      this.message = t2;
+    },
+    FiberClass: function FiberClass() {
+    },
+    Fiber: function Fiber() {
+    },
+    KeyframeSelectorParser$0: function(contents, logger) {
+      var t1 = S.SpanScanner$(contents, null);
+      return new E.KeyframeSelectorParser0(t1, logger);
+    },
+    KeyframeSelectorParser0: function KeyframeSelectorParser0(t0, t1) {
+      this.scanner = t0;
+      this.logger = t1;
+    },
+    KeyframeSelectorParser_parse_closure0: function KeyframeSelectorParser_parse_closure0(t0) {
+      this.$this = t0;
+    },
+    ImporterResult0: function ImporterResult0(t0, t1, t2) {
+      this.contents = t0;
+      this._result$_sourceMapUrl = t1;
+      this.syntax = t2;
+    },
+    UserDefinedCallable0: function UserDefinedCallable0(t0, t1, t2) {
+      this.declaration = t0;
+      this.environment = t1;
+      this.$ti = t2;
+    }
+  },
+  X = {NodeJsError: function NodeJsError() {
+    }, JsAssertionError: function JsAssertionError() {
+    }, JsRangeError: function JsRangeError() {
+    }, JsReferenceError: function JsReferenceError() {
+    }, JsSyntaxError: function JsSyntaxError() {
+    }, JsTypeError: function JsTypeError() {
+    }, JsSystemError: function JsSystemError() {
+    }, Process: function Process() {
+    }, CPUUsage: function CPUUsage() {
+    }, Release: function Release() {
+    },
+    ParsedPath_ParsedPath$parse: function(path, style) {
+      var t1, parts, separators, start, i,
+        root = style.getRoot$1(path),
+        isRootRelative = style.isRootRelative$1(path);
+      if (root != null)
+        path = J.substring$1$s(path, root.length);
+      t1 = type$.JSArray_legacy_String;
+      parts = H.setRuntimeTypeInfo([], t1);
+      separators = H.setRuntimeTypeInfo([], t1);
+      t1 = path.length;
+      if (t1 !== 0 && style.isSeparator$1(C.JSString_methods._codeUnitAt$1(path, 0))) {
+        separators.push(path[0]);
+        start = 1;
+      } else {
+        separators.push("");
+        start = 0;
+      }
+      for (i = start; i < t1; ++i)
+        if (style.isSeparator$1(C.JSString_methods._codeUnitAt$1(path, i))) {
+          parts.push(C.JSString_methods.substring$2(path, start, i));
+          separators.push(path[i]);
+          start = i + 1;
+        }
+      if (start < t1) {
+        parts.push(C.JSString_methods.substring$1(path, start));
+        separators.push("");
+      }
+      return new X.ParsedPath(style, root, isRootRelative, parts, separators);
+    },
+    ParsedPath: function ParsedPath(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.style = t0;
+      _.root = t1;
+      _.isRootRelative = t2;
+      _.parts = t3;
+      _.separators = t4;
+    },
+    ParsedPath_normalize_closure: function ParsedPath_normalize_closure(t0) {
+      this.$this = t0;
+    },
+    ParsedPath__splitExtension_closure: function ParsedPath__splitExtension_closure() {
+    },
+    ParsedPath__splitExtension_closure0: function ParsedPath__splitExtension_closure0() {
+    },
+    PathException$: function(message) {
+      return new X.PathException(message);
+    },
+    PathException: function PathException(t0) {
+      this.message = t0;
+    },
+    ModifiableCssStyleRule$: function(selector, span, originalSelector) {
+      var t1 = originalSelector == null ? selector.value : originalSelector,
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode);
+      return new X.ModifiableCssStyleRule(selector, t1, span, new P.UnmodifiableListView(t2, type$.UnmodifiableListView_legacy_ModifiableCssNode), t2);
+    },
+    ModifiableCssStyleRule: function ModifiableCssStyleRule(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.selector = t0;
+      _.originalSelector = t1;
+      _.span = t2;
+      _.children = t3;
+      _._children = t4;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    ArgumentInvocation$empty: function(span) {
+      return new X.ArgumentInvocation(C.List_empty7, C.Map_empty3, null, null, span);
+    },
+    ArgumentInvocation: function ArgumentInvocation(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.positional = t0;
+      _.named = t1;
+      _.rest = t2;
+      _.keywordRest = t3;
+      _.span = t4;
+    },
+    UnaryOperationExpression: function UnaryOperationExpression(t0, t1, t2) {
+      this.operator = t0;
+      this.operand = t1;
+      this.span = t2;
+    },
+    UnaryOperator: function UnaryOperator(t0, t1) {
+      this.name = t0;
+      this.operator = t1;
+    },
+    Interpolation$: function(contents, span) {
+      var t1 = new X.Interpolation(P.List_List$unmodifiable(contents, type$.legacy_Object), span);
+      t1.Interpolation$2(contents, span);
+      return t1;
+    },
+    Interpolation: function Interpolation(t0, t1) {
+      this.contents = t0;
+      this.span = t1;
+    },
+    Interpolation_toString_closure: function Interpolation_toString_closure() {
+    },
+    ExtendRule: function ExtendRule(t0, t1, t2) {
+      this.selector = t0;
+      this.isOptional = t1;
+      this.span = t2;
+    },
+    StyleRule$: function(selector, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new X.StyleRule(selector, span, t1, t2);
+    },
+    StyleRule: function StyleRule(t0, t1, t2, t3) {
+      var _ = this;
+      _.selector = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    SupportsInterpolation: function SupportsInterpolation(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    ClassSelector: function ClassSelector(t0) {
+      this.name = t0;
+    },
+    CompoundSelector$: function(components) {
+      var t1 = P.List_List$unmodifiable(components, type$.legacy_SimpleSelector);
+      if (t1.length === 0)
+        H.throwExpression(P.ArgumentError$("components may not be empty."));
+      return new X.CompoundSelector(t1);
+    },
+    CompoundSelector: function CompoundSelector(t0) {
+      this.components = t0;
+      this._compound$_maxSpecificity = this._compound$_minSpecificity = null;
+    },
+    CompoundSelector_isInvisible_closure: function CompoundSelector_isInvisible_closure() {
+    },
+    compileAsync: function(path, charset, importCache, logger, sourceMap, style, syntax) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_CompileResult),
+        $async$returnValue, t2, t3, t0, stylesheet, t1;
+      var $async$compileAsync = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = syntax === M.Syntax_forPath(path);
+              $async$goto = t1 ? 3 : 5;
+              break;
+            case 3:
+              // then
+              t1 = D.absolute(".");
+              if (J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin")) {
+                t2 = $.$get$context();
+                t3 = F._realCasePath(D.absolute(t2.normalize$1(path)));
+                t0 = t3;
+                t3 = t2;
+                t2 = t0;
+              } else {
+                t2 = $.$get$context();
+                t3 = t2.canonicalize$1(path);
+                t0 = t3;
+                t3 = t2;
+                t2 = t0;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(importCache.importCanonical$3(new F.FilesystemImporter(t1), t3.toUri$1(t2), t3.toUri$1(path)), $async$compileAsync);
+            case 6:
+              // returning from await.
+              stylesheet = $async$result;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              t1 = B.readFile(path);
+              stylesheet = V.Stylesheet_Stylesheet$parse(t1, syntax, logger, $.$get$context().toUri$1(path));
+            case 4:
+              // join
+              $async$goto = 7;
+              return P._asyncAwait(X._compileStylesheet0(stylesheet, logger, importCache, null, new F.FilesystemImporter(D.absolute(".")), null, style, true, null, null, sourceMap, charset), $async$compileAsync);
+            case 7:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$compileAsync, $async$completer);
+    },
+    compileStringAsync: function(source, charset, importCache, importer, logger, sourceMap, style, syntax) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_CompileResult),
+        $async$returnValue, stylesheet;
+      var $async$compileStringAsync = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              stylesheet = V.Stylesheet_Stylesheet$parse(source, syntax, logger, null);
+              $async$returnValue = X._compileStylesheet0(stylesheet, logger, importCache, null, importer, null, style, true, null, null, sourceMap, charset);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$compileStringAsync, $async$completer);
+    },
+    _compileStylesheet0: function(stylesheet, logger, importCache, nodeImporter, importer, functions, style, useSpaces, indentWidth, lineFeed, sourceMap, charset) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_CompileResult),
+        $async$returnValue, serializeResult, t1, $async$temp1;
+      var $async$_compileStylesheet0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = N;
+              $async$goto = 3;
+              return P._asyncAwait(E._EvaluateVisitor$0(functions, importCache, logger, nodeImporter, sourceMap).run$2(0, importer, stylesheet), $async$_compileStylesheet0);
+            case 3:
+              // returning from await.
+              serializeResult = $async$temp1.serialize($async$result.stylesheet, charset, indentWidth, false, lineFeed, sourceMap, style, true);
+              t1 = serializeResult.sourceMap;
+              if (t1 != null && true)
+                B.mapInPlace(t1.urls, new X._compileStylesheet_closure0(stylesheet, importCache));
+              $async$returnValue = new X.CompileResult(serializeResult);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_compileStylesheet0, $async$completer);
+    },
+    _compileStylesheet_closure0: function _compileStylesheet_closure0(t0, t1) {
+      this.stylesheet = t0;
+      this.importCache = t1;
+    },
+    CompileResult: function CompileResult(t0) {
+      this._serialize = t0;
+    },
+    SourceSpanWithContext$: function(start, end, text, _context) {
+      var t1 = new X.SourceSpanWithContext(_context, start, end, text);
+      t1.SourceSpanBase$3(start, end, text);
+      if (!C.JSString_methods.contains$1(_context, text))
+        H.throwExpression(P.ArgumentError$('The context line "' + _context + '" must contain "' + text + '".'));
+      if (B.findLineStart(_context, text, start.get$column()) == null)
+        H.throwExpression(P.ArgumentError$('The span text "' + text + '" must start at column ' + (start.get$column() + 1) + ' in a line within "' + _context + '".'));
+      return t1;
+    },
+    SourceSpanWithContext: function SourceSpanWithContext(t0, t1, t2, t3) {
+      var _ = this;
+      _._context = t0;
+      _.start = t1;
+      _.end = t2;
+      _.text = t3;
+    },
+    StringScanner$: function(string, position, sourceUrl) {
+      var t1 = typeof sourceUrl == "string" ? P.Uri_parse(sourceUrl) : type$.legacy_Uri._as(sourceUrl);
+      return new X.StringScanner(t1, string);
+    },
+    StringScanner: function StringScanner(t0, t1) {
+      var _ = this;
+      _.sourceUrl = t0;
+      _.string = t1;
+      _._string_scanner$_position = 0;
+      _._lastMatchPosition = _._lastMatch = null;
+    },
+    ArgumentInvocation$empty0: function(span) {
+      return new X.ArgumentInvocation0(C.List_empty19, C.Map_empty9, null, null, span);
+    },
+    ArgumentInvocation0: function ArgumentInvocation0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.positional = t0;
+      _.named = t1;
+      _.rest = t2;
+      _.keywordRest = t3;
+      _.span = t4;
+    },
+    compileAsync0: function(path, functions, indentWidth, lineFeed, nodeImporter, sourceMap, style, syntax, useSpaces) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_CompileResult_2),
+        $async$returnValue, t1, t2, stylesheet;
+      var $async$compileAsync0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = B.readFile0(path);
+              t2 = syntax == null ? M.Syntax_forPath0(path) : syntax;
+              stylesheet = V.Stylesheet_Stylesheet$parse0(t1, t2, null, $.$get$context().toUri$1(path));
+              $async$goto = 3;
+              return P._asyncAwait(X._compileStylesheet2(stylesheet, null, null, nodeImporter, new F.FilesystemImporter0(D.absolute(".")), functions, style, useSpaces, indentWidth, lineFeed, sourceMap, true), $async$compileAsync0);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$compileAsync0, $async$completer);
+    },
+    compileStringAsync0: function(source, functions, indentWidth, lineFeed, nodeImporter, sourceMap, style, syntax, url, useSpaces) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_CompileResult_2),
+        $async$returnValue, stylesheet, t1;
+      var $async$compileStringAsync0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              stylesheet = V.Stylesheet_Stylesheet$parse0(source, syntax == null ? C.Syntax_SCSS0 : syntax, null, url);
+              t1 = D.absolute(".");
+              $async$returnValue = X._compileStylesheet2(stylesheet, null, null, nodeImporter, new F.FilesystemImporter0(t1), functions, style, useSpaces, indentWidth, lineFeed, sourceMap, true);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$compileStringAsync0, $async$completer);
+    },
+    _compileStylesheet2: function(stylesheet, logger, importCache, nodeImporter, importer, functions, style, useSpaces, indentWidth, lineFeed, sourceMap, charset) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_CompileResult_2),
+        $async$returnValue, evaluateResult, serializeResult, t1;
+      var $async$_compileStylesheet2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(E._EvaluateVisitor$2(functions, importCache, logger, nodeImporter, sourceMap).run$2(0, importer, stylesheet), $async$_compileStylesheet2);
+            case 3:
+              // returning from await.
+              evaluateResult = $async$result;
+              serializeResult = N.serialize0(evaluateResult.stylesheet, true, indentWidth, false, lineFeed, sourceMap, style, useSpaces);
+              t1 = serializeResult.sourceMap;
+              if (t1 != null && importCache != null)
+                B.mapInPlace0(t1.urls, new X._compileStylesheet_closure2(stylesheet, importCache));
+              $async$returnValue = new X.CompileResult0(evaluateResult, serializeResult);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_compileStylesheet2, $async$completer);
+    },
+    _compileStylesheet_closure2: function _compileStylesheet_closure2(t0, t1) {
+      this.stylesheet = t0;
+      this.importCache = t1;
+    },
+    CompileResult0: function CompileResult0(t0, t1) {
+      this._evaluate = t0;
+      this._async_compile$_serialize = t1;
+    },
+    ClassSelector0: function ClassSelector0(t0) {
+      this.name = t0;
+    },
+    CompoundSelector$0: function(components) {
+      var t1 = P.List_List$unmodifiable(components, type$.legacy_SimpleSelector_2);
+      if (t1.length === 0)
+        H.throwExpression(P.ArgumentError$("components may not be empty."));
+      return new X.CompoundSelector0(t1);
+    },
+    CompoundSelector0: function CompoundSelector0(t0) {
+      this.components = t0;
+      this._compound0$_maxSpecificity = this._compound0$_minSpecificity = null;
+    },
+    CompoundSelector_isInvisible_closure0: function CompoundSelector_isInvisible_closure0() {
+    },
+    ExtendRule0: function ExtendRule0(t0, t1, t2) {
+      this.selector = t0;
+      this.isOptional = t1;
+      this.span = t2;
+    },
+    Interpolation$0: function(contents, span) {
+      var t1 = new X.Interpolation0(P.List_List$unmodifiable(contents, type$.legacy_Object), span);
+      t1.Interpolation$20(contents, span);
+      return t1;
+    },
+    Interpolation0: function Interpolation0(t0, t1) {
+      this.contents = t0;
+      this.span = t1;
+    },
+    Interpolation_toString_closure0: function Interpolation_toString_closure0() {
+    },
+    SupportsInterpolation0: function SupportsInterpolation0(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    ModifiableCssStyleRule$0: function(selector, span, originalSelector) {
+      var t1 = originalSelector == null ? selector.value : originalSelector,
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssNode_2);
+      return new X.ModifiableCssStyleRule0(selector, t1, span, new P.UnmodifiableListView(t2, type$.UnmodifiableListView_legacy_ModifiableCssNode_2), t2);
+    },
+    ModifiableCssStyleRule0: function ModifiableCssStyleRule0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.selector = t0;
+      _.originalSelector = t1;
+      _.span = t2;
+      _.children = t3;
+      _._node2$_children = t4;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    StyleRule$0: function(selector, children, span) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new X.StyleRule0(selector, span, t1, t2);
+    },
+    StyleRule0: function StyleRule0(t0, t1, t2, t3) {
+      var _ = this;
+      _.selector = t0;
+      _.span = t1;
+      _.children = t2;
+      _.hasDeclarations = t3;
+    },
+    UnaryOperationExpression0: function UnaryOperationExpression0(t0, t1, t2) {
+      this.operator = t0;
+      this.operand = t1;
+      this.span = t2;
+    },
+    UnaryOperator0: function UnaryOperator0(t0, t1) {
+      this.name = t0;
+      this.operator = t1;
+    }
+  },
+  K = {
+    PathMap__create: function(context, $V) {
+      var t1 = {};
+      t1.context = context;
+      t1.context = $.$get$context();
+      return P.LinkedHashMap_LinkedHashMap(new K.PathMap__create_closure(t1), new K.PathMap__create_closure0(t1), new K.PathMap__create_closure1(), type$.legacy_String, $V._eval$1("0*"));
+    },
+    PathMap: function PathMap(t0, t1) {
+      this._collection$_map = t0;
+      this.$ti = t1;
+    },
+    PathMap__create_closure: function PathMap__create_closure(t0) {
+      this._box_0 = t0;
+    },
+    PathMap__create_closure0: function PathMap__create_closure0(t0) {
+      this._box_0 = t0;
+    },
+    PathMap__create_closure1: function PathMap__create_closure1() {
+    },
+    ColorExpression: function ColorExpression(t0) {
+      this.value = t0;
+    },
+    _updateComponents: function($arguments, adjust, change, scale) {
+      var keywords, alpha, red, green, blue, hueNumber, t2, hue, saturation, lightness, whiteness, blackness, hasRgb, hasSL, hasWB, t3, t4, t5, _null = null,
+        t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        argumentList = type$.legacy_SassArgumentList._as(t1.$index($arguments, 1));
+      if (argumentList._list$_contents.length !== 0)
+        throw H.wrapException(E.SassScriptException$(string$.Only_op));
+      argumentList._wereKeywordsAccessed = true;
+      keywords = P.LinkedHashMap_LinkedHashMap$of(argumentList._keywords, type$.legacy_String, type$.legacy_Value);
+      t1 = new K._updateComponents_getParam(keywords, scale, change);
+      alpha = t1.call$2("alpha", 1);
+      red = t1.call$2("red", 255);
+      green = t1.call$2("green", 255);
+      blue = t1.call$2("blue", 255);
+      if (scale)
+        hueNumber = _null;
+      else {
+        t2 = keywords.remove$1(0, "hue");
+        hueNumber = t2 == null ? _null : t2.assertNumber$1("hue");
+      }
+      t2 = hueNumber == null;
+      if (!t2)
+        K._checkAngle(hueNumber, "hue");
+      hue = t2 ? _null : hueNumber.value;
+      saturation = t1.call$3$checkPercent("saturation", 100, true);
+      lightness = t1.call$3$checkPercent("lightness", 100, true);
+      whiteness = t1.call$3$assertPercent("whiteness", 100, true);
+      blackness = t1.call$3$assertPercent("blackness", 100, true);
+      if (keywords.get$isNotEmpty(keywords))
+        throw H.wrapException(E.SassScriptException$("No " + B.pluralize("argument", keywords.get$length(keywords), _null) + " named " + H.S(B.toSentence(keywords.get$keys(keywords).map$1$1(0, new K._updateComponents_closure(), type$.legacy_Object), "or")) + "."));
+      hasRgb = red != null || green != null || blue != null;
+      hasSL = saturation != null || lightness != null;
+      hasWB = whiteness != null || blackness != null;
+      if (hasRgb)
+        t1 = hasSL || hasWB || hue != null;
+      else
+        t1 = false;
+      if (t1)
+        throw H.wrapException(E.SassScriptException$(string$.RGB_pa + (hasWB ? "HWB" : "HSL") + " parameters."));
+      if (hasSL && hasWB)
+        throw H.wrapException(E.SassScriptException$(string$.HSL_pa));
+      t1 = new K._updateComponents_updateValue(change, adjust);
+      t2 = new K._updateComponents_updateRgb(t1);
+      if (hasRgb) {
+        t3 = t2.call$2(color.get$red(), red);
+        t4 = t2.call$2(color.get$green(), green);
+        t2 = t2.call$2(color.get$blue(), blue);
+        return color.changeRgb$4$alpha$blue$green$red(t1.call$3(color.alpha, alpha, 1), t2, t4, t3);
+      } else if (hasWB) {
+        if (change)
+          t2 = hue;
+        else {
+          t2 = color.get$hue();
+          t2 += hue == null ? 0 : hue;
+        }
+        t3 = t1.call$3(color.get$whiteness(), whiteness, 100);
+        t4 = t1.call$3(color.get$blackness(), blackness, 100);
+        t5 = color.alpha;
+        t1 = t1.call$3(t5, alpha, 1);
+        if (t2 == null)
+          t2 = color.get$hue();
+        if (t3 == null)
+          t3 = color.get$whiteness();
+        if (t4 == null)
+          t4 = color.get$blackness();
+        return K.SassColor_SassColor$hwb(t2, t3, t4, t1 == null ? t5 : t1);
+      } else {
+        t2 = hue == null;
+        if (!t2 || hasSL) {
+          if (change)
+            t2 = hue;
+          else {
+            t3 = color.get$hue();
+            t3 += t2 ? 0 : hue;
+            t2 = t3;
+          }
+          t3 = t1.call$3(color.get$saturation(), saturation, 100);
+          t4 = t1.call$3(color.get$lightness(), lightness, 100);
+          return color.changeHsl$4$alpha$hue$lightness$saturation(t1.call$3(color.alpha, alpha, 1), t2, t4, t3);
+        } else if (alpha != null)
+          return color.changeAlpha$1(t1.call$3(color.alpha, alpha, 1));
+        else
+          return color;
+      }
+    },
+    _functionString: function($name, $arguments) {
+      return new D.SassString($name + "(" + J.map$1$1$ax($arguments, new K._functionString_closure(), type$.legacy_String).join$1(0, ", ") + ")", false);
+    },
+    _removedColorFunction: function($name, argument, negative) {
+      return Q.BuiltInCallable$function($name, "$color, $amount", new K._removedColorFunction_closure($name, argument, negative), "sass:color");
+    },
+    _rgb: function($name, $arguments) {
+      var t2, red, green, blue, t3, _null = null,
+        t1 = J.getInterceptor$asx($arguments),
+        alpha = t1.get$length($arguments) > 3 ? t1.$index($arguments, 3) : _null;
+      if (!t1.$index($arguments, 0).get$isSpecialNumber())
+        if (!t1.$index($arguments, 1).get$isSpecialNumber())
+          if (!t1.$index($arguments, 2).get$isSpecialNumber()) {
+            t2 = alpha == null ? _null : alpha.get$isSpecialNumber();
+            t2 = t2 === true;
+          } else
+            t2 = true;
+        else
+          t2 = true;
+      else
+        t2 = true;
+      if (t2)
+        return K._functionString($name, $arguments);
+      red = t1.$index($arguments, 0).assertNumber$1("red");
+      green = t1.$index($arguments, 1).assertNumber$1("green");
+      blue = t1.$index($arguments, 2).assertNumber$1("blue");
+      t1 = T.fuzzyRound(K._percentageOrUnitless(red, 255, "red"));
+      t2 = T.fuzzyRound(K._percentageOrUnitless(green, 255, "green"));
+      t3 = T.fuzzyRound(K._percentageOrUnitless(blue, 255, "blue"));
+      return K.SassColor$rgb(t1, t2, t3, alpha == null ? _null : K._percentageOrUnitless(alpha.assertNumber$1("alpha"), 1, "alpha"), _null);
+    },
+    _rgbTwoArg: function($name, $arguments) {
+      var first, t2, color,
+        t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0).get$isVar())
+        return K._functionString($name, $arguments);
+      else if (t1.$index($arguments, 1).get$isVar()) {
+        first = t1.$index($arguments, 0);
+        if (first instanceof K.SassColor) {
+          t2 = $name + "(" + H.S(first.get$red()) + ", " + H.S(first.get$green()) + ", " + H.S(first.get$blue()) + ", ";
+          t1 = t1.$index($arguments, 1);
+          t1.toString;
+          return new D.SassString(t2 + N.serializeValue0(t1, false, true) + ")", false);
+        } else
+          return K._functionString($name, $arguments);
+      } else if (t1.$index($arguments, 1).get$isSpecialNumber()) {
+        color = t1.$index($arguments, 0).assertColor$1("color");
+        t2 = $name + "(" + H.S(color.get$red()) + ", " + H.S(color.get$green()) + ", " + H.S(color.get$blue()) + ", ";
+        t1 = t1.$index($arguments, 1);
+        t1.toString;
+        return new D.SassString(t2 + N.serializeValue0(t1, false, true) + ")", false);
+      }
+      return t1.$index($arguments, 0).assertColor$1("color").changeAlpha$1(K._percentageOrUnitless(t1.$index($arguments, 1).assertNumber$1("alpha"), 1, "alpha"));
+    },
+    _hsl: function($name, $arguments) {
+      var t2, hue, saturation, lightness, t3,
+        _s10_ = "saturation",
+        _s9_ = "lightness",
+        t1 = J.getInterceptor$asx($arguments),
+        alpha = t1.get$length($arguments) > 3 ? t1.$index($arguments, 3) : null;
+      if (!t1.$index($arguments, 0).get$isSpecialNumber())
+        if (!t1.$index($arguments, 1).get$isSpecialNumber())
+          if (!t1.$index($arguments, 2).get$isSpecialNumber()) {
+            t2 = alpha == null ? null : alpha.get$isSpecialNumber();
+            t2 = t2 === true;
+          } else
+            t2 = true;
+        else
+          t2 = true;
+      else
+        t2 = true;
+      if (t2)
+        return K._functionString($name, $arguments);
+      hue = t1.$index($arguments, 0).assertNumber$1("hue");
+      saturation = t1.$index($arguments, 1).assertNumber$1(_s10_);
+      lightness = t1.$index($arguments, 2).assertNumber$1(_s9_);
+      K._checkAngle(hue, "hue");
+      K._checkPercent(saturation, _s10_);
+      K._checkPercent(lightness, _s9_);
+      t1 = J.clamp$2$n(saturation.value, 0, 100);
+      t2 = J.clamp$2$n(lightness.value, 0, 100);
+      t3 = alpha == null ? null : K._percentageOrUnitless(alpha.assertNumber$1("alpha"), 1, "alpha");
+      return K.SassColor$hsl(hue.value, t1, t2, t3);
+    },
+    _checkAngle: function(angle, $name) {
+      var t1, t2, t3, actualUnit,
+        _s31_ = "To preserve current behavior: $";
+      if (!angle.get$hasUnits() || angle.hasUnit$1("deg"))
+        return;
+      t1 = "$" + H.S($name) + ": Passing a unit other than deg (" + angle.toString$0(0);
+      t1 + ") is deprecated.\n";
+      t1 += ") is deprecated.\n\n";
+      if (angle.compatibleWithUnit$1("deg")) {
+        t2 = "You're passing " + angle.toString$0(0) + string$.x2c_whici;
+        t3 = type$.JSArray_legacy_String;
+        t3 = t1 + (t2 + new L.SingleUnitSassNumber("deg", angle.value, null).toString$0(0) + ".\n") + (string$.Soon__ + angle.coerce$2(H.setRuntimeTypeInfo(["deg"], t3), H.setRuntimeTypeInfo([], t3)).toString$0(0) + ".\n") + "\n";
+        actualUnit = J.get$first$ax(angle.get$numeratorUnits());
+        t3 = t3 + (_s31_ + H.S($name) + " * 1deg/1" + H.S(actualUnit) + "\n") + ("To migrate to new behavior: 0deg + $" + H.S($name) + "\n") + "\n";
+        t1 = t3;
+      } else
+        t1 = t1 + (_s31_ + H.S($name) + K._removeUnits(angle) + "\n") + "\n";
+      t1 += "See https://sass-lang.com/d/color-units";
+      N.warn(t1.charCodeAt(0) == 0 ? t1 : t1, true);
+    },
+    _checkPercent: function(number, $name) {
+      if (number.hasUnit$1("%"))
+        return;
+      N.warn("$" + $name + ": Passing a number without unit % (" + number.toString$0(0) + string$.x29x20is_d + $name + K._removeUnits(number) + " * 1%", true);
+    },
+    _removeUnits: function(number) {
+      var t1 = number.get$denominatorUnits();
+      return new H.MappedListIterable(t1, new K._removeUnits_closure(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0) + J.map$1$1$ax(number.get$numeratorUnits(), new K._removeUnits_closure0(), type$.legacy_String).join$0(0);
+    },
+    _hwb: function($arguments) {
+      var t2, t3,
+        _s9_ = "whiteness",
+        t1 = J.getInterceptor$asx($arguments),
+        alpha = t1.get$length($arguments) > 3 ? t1.$index($arguments, 3) : null,
+        hue = t1.$index($arguments, 0).assertNumber$1("hue"),
+        whiteness = t1.$index($arguments, 1).assertNumber$1(_s9_),
+        blackness = t1.$index($arguments, 2).assertNumber$1("blackness");
+      whiteness.assertUnit$2("%", _s9_);
+      blackness.assertUnit$2("%", _s9_);
+      t1 = whiteness.valueInRange$3(0, 100, _s9_);
+      t2 = blackness.valueInRange$3(0, 100, _s9_);
+      t3 = alpha == null ? null : K._percentageOrUnitless(alpha.assertNumber$1("alpha"), 1, "alpha");
+      return K.SassColor_SassColor$hwb(hue.value, t1, t2, t3);
+    },
+    _parseChannels: function($name, argumentNames, channels) {
+      var isCommaSeparated, isBracketed, buffer, t1, list, maybeSlashSeparated, t2, t3,
+        _s17_ = "$channels must be",
+        _s32_ = "$channels must be an unbracketed";
+      if (channels.get$isVar())
+        return K._functionString($name, H.setRuntimeTypeInfo([channels], type$.JSArray_legacy_Value));
+      isCommaSeparated = channels.get$separator() === C.ListSeparator_comma;
+      isBracketed = channels.get$hasBrackets();
+      if (isCommaSeparated || isBracketed) {
+        buffer = new P.StringBuffer(_s17_);
+        if (isBracketed) {
+          buffer._contents = _s32_;
+          t1 = _s32_;
+        } else
+          t1 = _s17_;
+        if (isCommaSeparated) {
+          t1 += isBracketed ? "," : " a";
+          buffer._contents = t1;
+          t1 = buffer._contents = t1 + " space-separated";
+        }
+        buffer._contents = t1 + " list.";
+        throw H.wrapException(E.SassScriptException$(buffer.toString$0(0)));
+      }
+      list = channels.get$asList();
+      t1 = list.length;
+      if (t1 > 3)
+        throw H.wrapException(E.SassScriptException$("Only 3 elements allowed, but " + t1 + " were passed."));
+      else if (t1 < 3) {
+        if (!C.JSArray_methods.any$1(list, new K._parseChannels_closure()))
+          if (list.length !== 0) {
+            t1 = C.JSArray_methods.get$last(list);
+            if (t1 instanceof D.SassString)
+              if (t1.hasQuotes) {
+                t1 = t1.text;
+                t1 = B.startsWithIgnoreCase(t1, "var(") && J.contains$1$asx(t1, "/");
+              } else
+                t1 = false;
+            else
+              t1 = false;
+          } else
+            t1 = false;
+        else
+          t1 = true;
+        if (t1)
+          return K._functionString($name, H.setRuntimeTypeInfo([channels], type$.JSArray_legacy_Value));
+        else
+          throw H.wrapException(E.SassScriptException$("Missing element " + argumentNames[list.length] + "."));
+      }
+      maybeSlashSeparated = list[2];
+      if (maybeSlashSeparated instanceof T.SassNumber && maybeSlashSeparated.asSlash != null) {
+        t1 = list[0];
+        t2 = list[1];
+        t3 = maybeSlashSeparated.asSlash;
+        return H.setRuntimeTypeInfo([t1, t2, t3.item1, t3.item2], type$.JSArray_legacy_Value);
+      } else if (maybeSlashSeparated instanceof D.SassString && !maybeSlashSeparated.hasQuotes && J.contains$1$asx(maybeSlashSeparated.text, "/"))
+        return K._functionString($name, H.setRuntimeTypeInfo([channels], type$.JSArray_legacy_Value));
+      else
+        return list;
+    },
+    _percentageOrUnitless: function(number, max, $name) {
+      var value;
+      if (!number.get$hasUnits())
+        value = number.value;
+      else if (number.hasUnit$1("%"))
+        value = max * number.value / 100;
+      else
+        throw H.wrapException(E.SassScriptException$("$" + $name + ": Expected " + number.toString$0(0) + ' to have no units or "%".'));
+      return J.clamp$2$n(value, 0, max);
+    },
+    _mixColors: function(color1, color2, weight) {
+      var weightScale = weight.valueInRange$3(0, 100, "weight") / 100,
+        normalizedWeight = weightScale * 2 - 1,
+        t1 = color1.alpha,
+        t2 = color2.alpha,
+        alphaDistance = t1 - t2,
+        t3 = normalizedWeight * alphaDistance,
+        weight1 = ((t3 === -1 ? normalizedWeight : (normalizedWeight + alphaDistance) / (1 + t3)) + 1) / 2,
+        weight2 = 1 - weight1;
+      return K.SassColor$rgb(T.fuzzyRound(color1.get$red() * weight1 + color2.get$red() * weight2), T.fuzzyRound(color1.get$green() * weight1 + color2.get$green() * weight2), T.fuzzyRound(color1.get$blue() * weight1 + color2.get$blue() * weight2), t1 * weightScale + t2 * (1 - weightScale), null);
+    },
+    _opacify: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color");
+      return color.changeAlpha$1(C.JSNumber_methods.clamp$2(color.alpha + t1.$index($arguments, 1).assertNumber$1("amount").valueInRange$3(0, 1, "amount"), 0, 1));
+    },
+    _transparentize: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color");
+      return color.changeAlpha$1(C.JSNumber_methods.clamp$2(color.alpha - t1.$index($arguments, 1).assertNumber$1("amount").valueInRange$3(0, 1, "amount"), 0, 1));
+    },
+    _function4: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function($name, $arguments, callback, "sass:color");
+    },
+    closure44: function closure44() {
+    },
+    closure45: function closure45() {
+    },
+    closure46: function closure46() {
+    },
+    closure47: function closure47() {
+    },
+    closure48: function closure48() {
+    },
+    closure49: function closure49() {
+    },
+    closure50: function closure50() {
+    },
+    closure51: function closure51() {
+    },
+    closure52: function closure52() {
+    },
+    closure53: function closure53() {
+    },
+    closure54: function closure54() {
+    },
+    closure55: function closure55() {
+    },
+    closure56: function closure56() {
+    },
+    closure57: function closure57() {
+    },
+    closure58: function closure58() {
+    },
+    closure59: function closure59() {
+    },
+    closure60: function closure60() {
+    },
+    closure61: function closure61() {
+    },
+    closure62: function closure62() {
+    },
+    closure63: function closure63() {
+    },
+    closure64: function closure64() {
+    },
+    closure65: function closure65() {
+    },
+    closure66: function closure66() {
+    },
+    closure67: function closure67() {
+    },
+    closure68: function closure68() {
+    },
+    closure69: function closure69() {
+    },
+    _closure8: function _closure8() {
+    },
+    closure70: function closure70() {
+    },
+    closure99: function closure99() {
+    },
+    closure100: function closure100() {
+    },
+    closure101: function closure101() {
+    },
+    closure102: function closure102() {
+    },
+    closure103: function closure103() {
+    },
+    closure104: function closure104() {
+    },
+    closure105: function closure105() {
+    },
+    closure106: function closure106() {
+    },
+    _closure13: function _closure13() {
+    },
+    closure107: function closure107() {
+    },
+    closure82: function closure82() {
+    },
+    closure81: function closure81() {
+    },
+    closure80: function closure80() {
+    },
+    closure79: function closure79() {
+    },
+    closure78: function closure78() {
+    },
+    closure77: function closure77() {
+    },
+    closure76: function closure76() {
+    },
+    closure75: function closure75() {
+    },
+    closure73: function closure73() {
+    },
+    closure72: function closure72() {
+    },
+    closure71: function closure71() {
+    },
+    closure74: function closure74() {
+    },
+    closure_hexString: function closure_hexString() {
+    },
+    _updateComponents_getParam: function _updateComponents_getParam(t0, t1, t2) {
+      this.keywords = t0;
+      this.scale = t1;
+      this.change = t2;
+    },
+    _updateComponents_closure: function _updateComponents_closure() {
+    },
+    _updateComponents_updateValue: function _updateComponents_updateValue(t0, t1) {
+      this.change = t0;
+      this.adjust = t1;
+    },
+    _updateComponents_updateRgb: function _updateComponents_updateRgb(t0) {
+      this.updateValue = t0;
+    },
+    _functionString_closure: function _functionString_closure() {
+    },
+    _removedColorFunction_closure: function _removedColorFunction_closure(t0, t1, t2) {
+      this.name = t0;
+      this.argument = t1;
+      this.negative = t2;
+    },
+    _removeUnits_closure: function _removeUnits_closure() {
+    },
+    _removeUnits_closure0: function _removeUnits_closure0() {
+    },
+    _parseChannels_closure: function _parseChannels_closure() {
+    },
+    _fuzzyRoundIfZero: function(number) {
+      if (!(Math.abs(number - 0) < $.$get$epsilon()))
+        return number;
+      return C.JSNumber_methods.get$isNegative(number) ? -0.0 : 0;
+    },
+    _numberFunction: function($name, transform) {
+      return Q.BuiltInCallable$function($name, "$number", new K._numberFunction_closure(transform), "sass:math");
+    },
+    _function1: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function($name, $arguments, callback, "sass:math");
+    },
+    closure25: function closure25() {
+    },
+    closure90: function closure90() {
+    },
+    closure24: function closure24() {
+    },
+    closure23: function closure23() {
+    },
+    closure22: function closure22() {
+    },
+    closure26: function closure26() {
+    },
+    closure88: function closure88() {
+    },
+    _closure9: function _closure9() {
+    },
+    closure87: function closure87() {
+    },
+    closure86: function closure86() {
+    },
+    closure84: function closure84() {
+    },
+    closure94: function closure94() {
+    },
+    closure93: function closure93() {
+    },
+    closure92: function closure92() {
+    },
+    closure91: function closure91() {
+    },
+    closure89: function closure89() {
+    },
+    closure85: function closure85() {
+    },
+    closure83: function closure83() {
+    },
+    closure18: function closure18() {
+    },
+    closure17: function closure17() {
+    },
+    closure19: function closure19() {
+    },
+    closure21: function closure21() {
+    },
+    closure20: function closure20() {
+    },
+    _numberFunction_closure: function _numberFunction_closure(t0) {
+      this.transform = t0;
+    },
+    LimitedMapView$blocklist: function(_map, blocklist, $K, $V) {
+      var t2, key,
+        t1 = P.LinkedHashSet_LinkedHashSet($K._eval$1("0*"));
+      for (t2 = J.get$iterator$ax(_map.get$keys(_map)); t2.moveNext$0();) {
+        key = t2.get$current(t2);
+        if (!blocklist.contains$1(0, key))
+          t1.add$1(0, key);
+      }
+      return new K.LimitedMapView(_map, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("LimitedMapView<1,2>"));
+    },
+    LimitedMapView: function LimitedMapView(t0, t1, t2) {
+      this._limited_map_view$_map = t0;
+      this._limited_map_view$_keys = t1;
+      this.$ti = t2;
+    },
+    SassColor$rgb: function(_red, _green, _blue, alpha, originalSpan) {
+      var t1 = new K.SassColor(_red, _green, _blue, null, null, null, alpha == null ? 1 : T.fuzzyAssertRange(alpha, 0, 1, "alpha"), originalSpan);
+      P.RangeError_checkValueInInterval(t1.get$red(), 0, 255, "red");
+      P.RangeError_checkValueInInterval(t1.get$green(), 0, 255, "green");
+      P.RangeError_checkValueInInterval(t1.get$blue(), 0, 255, "blue");
+      return t1;
+    },
+    SassColor$hsl: function(hue, saturation, lightness, alpha) {
+      var _null = null,
+        t1 = C.JSNumber_methods.$mod(hue, 360),
+        t2 = T.fuzzyAssertRange(saturation, 0, 100, "saturation"),
+        t3 = T.fuzzyAssertRange(lightness, 0, 100, "lightness");
+      return new K.SassColor(_null, _null, _null, t1, t2, t3, alpha == null ? 1 : T.fuzzyAssertRange(alpha, 0, 1, "alpha"), _null);
+    },
+    SassColor_SassColor$hwb: function(hue, whiteness, blackness, alpha) {
+      var t2, t1 = {},
+        scaledHue = C.JSNumber_methods.$mod(hue, 360) / 360,
+        scaledWhiteness = t1.scaledWhiteness = T.fuzzyAssertRange(whiteness, 0, 100, "whiteness") / 100,
+        scaledBlackness = T.fuzzyAssertRange(blackness, 0, 100, "blackness") / 100,
+        sum = scaledWhiteness + scaledBlackness;
+      if (sum > 1) {
+        t2 = t1.scaledWhiteness = scaledWhiteness / sum;
+        scaledBlackness /= sum;
+      } else
+        t2 = scaledWhiteness;
+      t2 = new K.SassColor_SassColor$hwb_toRgb(t1, 1 - t2 - scaledBlackness);
+      return K.SassColor$rgb(t2.call$1(scaledHue + 0.3333333333333333), t2.call$1(scaledHue), t2.call$1(scaledHue - 0.3333333333333333), alpha, null);
+    },
+    SassColor__hueToRgb: function(m1, m2, hue) {
+      if (hue < 0)
+        ++hue;
+      if (hue > 1)
+        --hue;
+      if (hue < 0.16666666666666666)
+        return m1 + (m2 - m1) * hue * 6;
+      else if (hue < 0.5)
+        return m2;
+      else if (hue < 0.6666666666666666)
+        return m1 + (m2 - m1) * (0.6666666666666666 - hue) * 6;
+      else
+        return m1;
+    },
+    SassColor: function SassColor(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _._red = t0;
+      _._green = t1;
+      _._blue = t2;
+      _._hue = t3;
+      _._saturation = t4;
+      _._lightness = t5;
+      _.alpha = t6;
+      _.originalSpan = t7;
+    },
+    SassColor_SassColor$hwb_toRgb: function SassColor_SassColor$hwb_toRgb(t0, t1) {
+      this._box_0 = t0;
+      this.factor = t1;
+    },
+    UnicodeGlyphSet: function UnicodeGlyphSet() {
+    },
+    ColorExpression0: function ColorExpression0(t0) {
+      this.value = t0;
+    },
+    _updateComponents0: function($arguments, adjust, change, scale) {
+      var keywords, alpha, red, green, blue, hueNumber, t2, hue, saturation, lightness, whiteness, blackness, hasRgb, hasSL, hasWB, t3, t4, t5, _null = null,
+        t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        argumentList = type$.legacy_SassArgumentList_2._as(t1.$index($arguments, 1));
+      if (argumentList._list1$_contents.length !== 0)
+        throw H.wrapException(E.SassScriptException$0(string$.Only_op));
+      argumentList._argument_list$_wereKeywordsAccessed = true;
+      keywords = P.LinkedHashMap_LinkedHashMap$of(argumentList._argument_list$_keywords, type$.legacy_String, type$.legacy_Value_2);
+      t1 = new K._updateComponents_getParam0(keywords, scale, change);
+      alpha = t1.call$2("alpha", 1);
+      red = t1.call$2("red", 255);
+      green = t1.call$2("green", 255);
+      blue = t1.call$2("blue", 255);
+      if (scale)
+        hueNumber = _null;
+      else {
+        t2 = keywords.remove$1(0, "hue");
+        hueNumber = t2 == null ? _null : t2.assertNumber$1("hue");
+      }
+      t2 = hueNumber == null;
+      if (!t2)
+        K._checkAngle0(hueNumber, "hue");
+      hue = t2 ? _null : hueNumber.value;
+      saturation = t1.call$3$checkPercent("saturation", 100, true);
+      lightness = t1.call$3$checkPercent("lightness", 100, true);
+      whiteness = t1.call$3$assertPercent("whiteness", 100, true);
+      blackness = t1.call$3$assertPercent("blackness", 100, true);
+      if (keywords.get$isNotEmpty(keywords))
+        throw H.wrapException(E.SassScriptException$0("No " + B.pluralize0("argument", keywords.get$length(keywords), _null) + " named " + H.S(B.toSentence0(keywords.get$keys(keywords).map$1$1(0, new K._updateComponents_closure0(), type$.legacy_Object), "or")) + "."));
+      hasRgb = red != null || green != null || blue != null;
+      hasSL = saturation != null || lightness != null;
+      hasWB = whiteness != null || blackness != null;
+      if (hasRgb)
+        t1 = hasSL || hasWB || hue != null;
+      else
+        t1 = false;
+      if (t1)
+        throw H.wrapException(E.SassScriptException$0(string$.RGB_pa + (hasWB ? "HWB" : "HSL") + " parameters."));
+      if (hasSL && hasWB)
+        throw H.wrapException(E.SassScriptException$0(string$.HSL_pa));
+      t1 = new K._updateComponents_updateValue0(change, adjust);
+      t2 = new K._updateComponents_updateRgb0(t1);
+      if (hasRgb) {
+        t3 = t2.call$2(color.get$red(), red);
+        t4 = t2.call$2(color.get$green(), green);
+        t2 = t2.call$2(color.get$blue(), blue);
+        return color.changeRgb$4$alpha$blue$green$red(t1.call$3(color.alpha, alpha, 1), t2, t4, t3);
+      } else if (hasWB) {
+        if (change)
+          t2 = hue;
+        else {
+          t2 = color.get$hue();
+          t2 += hue == null ? 0 : hue;
+        }
+        t3 = t1.call$3(color.get$whiteness(), whiteness, 100);
+        t4 = t1.call$3(color.get$blackness(), blackness, 100);
+        t5 = color.alpha;
+        t1 = t1.call$3(t5, alpha, 1);
+        if (t2 == null)
+          t2 = color.get$hue();
+        if (t3 == null)
+          t3 = color.get$whiteness();
+        if (t4 == null)
+          t4 = color.get$blackness();
+        return K.SassColor_SassColor$hwb0(t2, t3, t4, t1 == null ? t5 : t1);
+      } else {
+        t2 = hue == null;
+        if (!t2 || hasSL) {
+          if (change)
+            t2 = hue;
+          else {
+            t3 = color.get$hue();
+            t3 += t2 ? 0 : hue;
+            t2 = t3;
+          }
+          t3 = t1.call$3(color.get$saturation(), saturation, 100);
+          t4 = t1.call$3(color.get$lightness(), lightness, 100);
+          return color.changeHsl$4$alpha$hue$lightness$saturation(t1.call$3(color.alpha, alpha, 1), t2, t4, t3);
+        } else if (alpha != null)
+          return color.changeAlpha$1(t1.call$3(color.alpha, alpha, 1));
+        else
+          return color;
+      }
+    },
+    _functionString0: function($name, $arguments) {
+      return new D.SassString0($name + "(" + J.map$1$1$ax($arguments, new K._functionString_closure0(), type$.legacy_String).join$1(0, ", ") + ")", false);
+    },
+    _removedColorFunction0: function($name, argument, negative) {
+      return Q.BuiltInCallable$function0($name, "$color, $amount", new K._removedColorFunction_closure0($name, argument, negative), "sass:color");
+    },
+    _rgb0: function($name, $arguments) {
+      var t2, red, green, blue, t3, _null = null,
+        t1 = J.getInterceptor$asx($arguments),
+        alpha = t1.get$length($arguments) > 3 ? t1.$index($arguments, 3) : _null;
+      if (!t1.$index($arguments, 0).get$isSpecialNumber())
+        if (!t1.$index($arguments, 1).get$isSpecialNumber())
+          if (!t1.$index($arguments, 2).get$isSpecialNumber()) {
+            t2 = alpha == null ? _null : alpha.get$isSpecialNumber();
+            t2 = t2 === true;
+          } else
+            t2 = true;
+        else
+          t2 = true;
+      else
+        t2 = true;
+      if (t2)
+        return K._functionString0($name, $arguments);
+      red = t1.$index($arguments, 0).assertNumber$1("red");
+      green = t1.$index($arguments, 1).assertNumber$1("green");
+      blue = t1.$index($arguments, 2).assertNumber$1("blue");
+      t1 = T.fuzzyRound0(K._percentageOrUnitless0(red, 255, "red"));
+      t2 = T.fuzzyRound0(K._percentageOrUnitless0(green, 255, "green"));
+      t3 = T.fuzzyRound0(K._percentageOrUnitless0(blue, 255, "blue"));
+      return K.SassColor$rgb0(t1, t2, t3, alpha == null ? _null : K._percentageOrUnitless0(alpha.assertNumber$1("alpha"), 1, "alpha"), _null);
+    },
+    _rgbTwoArg0: function($name, $arguments) {
+      var first, t2, color,
+        t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0).get$isVar())
+        return K._functionString0($name, $arguments);
+      else if (t1.$index($arguments, 1).get$isVar()) {
+        first = t1.$index($arguments, 0);
+        if (first instanceof K.SassColor0) {
+          t2 = $name + "(" + H.S(first.get$red()) + ", " + H.S(first.get$green()) + ", " + H.S(first.get$blue()) + ", ";
+          t1 = t1.$index($arguments, 1);
+          t1.toString;
+          return new D.SassString0(t2 + N.serializeValue(t1, false, true) + ")", false);
+        } else
+          return K._functionString0($name, $arguments);
+      } else if (t1.$index($arguments, 1).get$isSpecialNumber()) {
+        color = t1.$index($arguments, 0).assertColor$1("color");
+        t2 = $name + "(" + H.S(color.get$red()) + ", " + H.S(color.get$green()) + ", " + H.S(color.get$blue()) + ", ";
+        t1 = t1.$index($arguments, 1);
+        t1.toString;
+        return new D.SassString0(t2 + N.serializeValue(t1, false, true) + ")", false);
+      }
+      return t1.$index($arguments, 0).assertColor$1("color").changeAlpha$1(K._percentageOrUnitless0(t1.$index($arguments, 1).assertNumber$1("alpha"), 1, "alpha"));
+    },
+    _hsl0: function($name, $arguments) {
+      var t2, hue, saturation, lightness, t3,
+        _s10_ = "saturation",
+        _s9_ = "lightness",
+        t1 = J.getInterceptor$asx($arguments),
+        alpha = t1.get$length($arguments) > 3 ? t1.$index($arguments, 3) : null;
+      if (!t1.$index($arguments, 0).get$isSpecialNumber())
+        if (!t1.$index($arguments, 1).get$isSpecialNumber())
+          if (!t1.$index($arguments, 2).get$isSpecialNumber()) {
+            t2 = alpha == null ? null : alpha.get$isSpecialNumber();
+            t2 = t2 === true;
+          } else
+            t2 = true;
+        else
+          t2 = true;
+      else
+        t2 = true;
+      if (t2)
+        return K._functionString0($name, $arguments);
+      hue = t1.$index($arguments, 0).assertNumber$1("hue");
+      saturation = t1.$index($arguments, 1).assertNumber$1(_s10_);
+      lightness = t1.$index($arguments, 2).assertNumber$1(_s9_);
+      K._checkAngle0(hue, "hue");
+      K._checkPercent0(saturation, _s10_);
+      K._checkPercent0(lightness, _s9_);
+      t1 = J.clamp$2$n(saturation.value, 0, 100);
+      t2 = J.clamp$2$n(lightness.value, 0, 100);
+      t3 = alpha == null ? null : K._percentageOrUnitless0(alpha.assertNumber$1("alpha"), 1, "alpha");
+      return K.SassColor$hsl0(hue.value, t1, t2, t3);
+    },
+    _checkAngle0: function(angle, $name) {
+      var t1, t2, t3, actualUnit,
+        _s31_ = "To preserve current behavior: $";
+      if (!angle.get$hasUnits() || angle.hasUnit$1("deg"))
+        return;
+      t1 = "$" + H.S($name) + ": Passing a unit other than deg (" + angle.toString$0(0);
+      t1 + ") is deprecated.\n";
+      t1 += ") is deprecated.\n\n";
+      if (angle.compatibleWithUnit$1("deg")) {
+        t2 = "You're passing " + angle.toString$0(0) + string$.x2c_whici;
+        t3 = type$.JSArray_legacy_String;
+        t3 = t1 + (t2 + new L.SingleUnitSassNumber0("deg", angle.value, null).toString$0(0) + ".\n") + (string$.Soon__ + angle.coerce$2(H.setRuntimeTypeInfo(["deg"], t3), H.setRuntimeTypeInfo([], t3)).toString$0(0) + ".\n") + "\n";
+        actualUnit = J.get$first$ax(angle.get$numeratorUnits());
+        t3 = t3 + (_s31_ + H.S($name) + " * 1deg/1" + H.S(actualUnit) + "\n") + ("To migrate to new behavior: 0deg + $" + H.S($name) + "\n") + "\n";
+        t1 = t3;
+      } else
+        t1 = t1 + (_s31_ + H.S($name) + K._removeUnits0(angle) + "\n") + "\n";
+      t1 += "See https://sass-lang.com/d/color-units";
+      N.warn0(t1.charCodeAt(0) == 0 ? t1 : t1, true);
+    },
+    _checkPercent0: function(number, $name) {
+      if (number.hasUnit$1("%"))
+        return;
+      N.warn0("$" + $name + ": Passing a number without unit % (" + number.toString$0(0) + string$.x29x20is_d + $name + K._removeUnits0(number) + " * 1%", true);
+    },
+    _removeUnits0: function(number) {
+      var t1 = number.get$denominatorUnits();
+      return new H.MappedListIterable(t1, new K._removeUnits_closure1(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0) + J.map$1$1$ax(number.get$numeratorUnits(), new K._removeUnits_closure2(), type$.legacy_String).join$0(0);
+    },
+    _hwb0: function($arguments) {
+      var t2, t3,
+        _s9_ = "whiteness",
+        t1 = J.getInterceptor$asx($arguments),
+        alpha = t1.get$length($arguments) > 3 ? t1.$index($arguments, 3) : null,
+        hue = t1.$index($arguments, 0).assertNumber$1("hue"),
+        whiteness = t1.$index($arguments, 1).assertNumber$1(_s9_),
+        blackness = t1.$index($arguments, 2).assertNumber$1("blackness");
+      whiteness.assertUnit$2("%", _s9_);
+      blackness.assertUnit$2("%", _s9_);
+      t1 = whiteness.valueInRange$3(0, 100, _s9_);
+      t2 = blackness.valueInRange$3(0, 100, _s9_);
+      t3 = alpha == null ? null : K._percentageOrUnitless0(alpha.assertNumber$1("alpha"), 1, "alpha");
+      return K.SassColor_SassColor$hwb0(hue.value, t1, t2, t3);
+    },
+    _parseChannels0: function($name, argumentNames, channels) {
+      var isCommaSeparated, isBracketed, buffer, t1, list, maybeSlashSeparated, t2, t3,
+        _s17_ = "$channels must be",
+        _s32_ = "$channels must be an unbracketed";
+      if (channels.get$isVar())
+        return K._functionString0($name, H.setRuntimeTypeInfo([channels], type$.JSArray_legacy_Value_2));
+      isCommaSeparated = channels.get$separator() === C.ListSeparator_comma0;
+      isBracketed = channels.get$hasBrackets();
+      if (isCommaSeparated || isBracketed) {
+        buffer = new P.StringBuffer(_s17_);
+        if (isBracketed) {
+          buffer._contents = _s32_;
+          t1 = _s32_;
+        } else
+          t1 = _s17_;
+        if (isCommaSeparated) {
+          t1 += isBracketed ? "," : " a";
+          buffer._contents = t1;
+          t1 = buffer._contents = t1 + " space-separated";
+        }
+        buffer._contents = t1 + " list.";
+        throw H.wrapException(E.SassScriptException$0(buffer.toString$0(0)));
+      }
+      list = channels.get$asList();
+      t1 = list.length;
+      if (t1 > 3)
+        throw H.wrapException(E.SassScriptException$0("Only 3 elements allowed, but " + t1 + " were passed."));
+      else if (t1 < 3) {
+        if (!C.JSArray_methods.any$1(list, new K._parseChannels_closure0()))
+          if (list.length !== 0) {
+            t1 = C.JSArray_methods.get$last(list);
+            if (t1 instanceof D.SassString0)
+              if (t1.hasQuotes) {
+                t1 = t1.text;
+                t1 = B.startsWithIgnoreCase0(t1, "var(") && J.contains$1$asx(t1, "/");
+              } else
+                t1 = false;
+            else
+              t1 = false;
+          } else
+            t1 = false;
+        else
+          t1 = true;
+        if (t1)
+          return K._functionString0($name, H.setRuntimeTypeInfo([channels], type$.JSArray_legacy_Value_2));
+        else
+          throw H.wrapException(E.SassScriptException$0("Missing element " + argumentNames[list.length] + "."));
+      }
+      maybeSlashSeparated = list[2];
+      if (maybeSlashSeparated instanceof T.SassNumber0 && maybeSlashSeparated.asSlash != null) {
+        t1 = list[0];
+        t2 = list[1];
+        t3 = maybeSlashSeparated.asSlash;
+        return H.setRuntimeTypeInfo([t1, t2, t3.item1, t3.item2], type$.JSArray_legacy_Value_2);
+      } else if (maybeSlashSeparated instanceof D.SassString0 && !maybeSlashSeparated.hasQuotes && J.contains$1$asx(maybeSlashSeparated.text, "/"))
+        return K._functionString0($name, H.setRuntimeTypeInfo([channels], type$.JSArray_legacy_Value_2));
+      else
+        return list;
+    },
+    _percentageOrUnitless0: function(number, max, $name) {
+      var value;
+      if (!number.get$hasUnits())
+        value = number.value;
+      else if (number.hasUnit$1("%"))
+        value = max * number.value / 100;
+      else
+        throw H.wrapException(E.SassScriptException$0("$" + $name + ": Expected " + number.toString$0(0) + ' to have no units or "%".'));
+      return J.clamp$2$n(value, 0, max);
+    },
+    _mixColors0: function(color1, color2, weight) {
+      var weightScale = weight.valueInRange$3(0, 100, "weight") / 100,
+        normalizedWeight = weightScale * 2 - 1,
+        t1 = color1.alpha,
+        t2 = color2.alpha,
+        alphaDistance = t1 - t2,
+        t3 = normalizedWeight * alphaDistance,
+        weight1 = ((t3 === -1 ? normalizedWeight : (normalizedWeight + alphaDistance) / (1 + t3)) + 1) / 2,
+        weight2 = 1 - weight1;
+      return K.SassColor$rgb0(T.fuzzyRound0(color1.get$red() * weight1 + color2.get$red() * weight2), T.fuzzyRound0(color1.get$green() * weight1 + color2.get$green() * weight2), T.fuzzyRound0(color1.get$blue() * weight1 + color2.get$blue() * weight2), t1 * weightScale + t2 * (1 - weightScale), null);
+    },
+    _opacify0: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color");
+      return color.changeAlpha$1(C.JSNumber_methods.clamp$2(color.alpha + t1.$index($arguments, 1).assertNumber$1("amount").valueInRange$3(0, 1, "amount"), 0, 1));
+    },
+    _transparentize0: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color");
+      return color.changeAlpha$1(C.JSNumber_methods.clamp$2(color.alpha - t1.$index($arguments, 1).assertNumber$1("amount").valueInRange$3(0, 1, "amount"), 0, 1));
+    },
+    _function11: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function0($name, $arguments, callback, "sass:color");
+    },
+    closure159: function closure159() {
+    },
+    closure160: function closure160() {
+    },
+    closure161: function closure161() {
+    },
+    closure162: function closure162() {
+    },
+    closure163: function closure163() {
+    },
+    closure164: function closure164() {
+    },
+    closure165: function closure165() {
+    },
+    closure166: function closure166() {
+    },
+    closure167: function closure167() {
+    },
+    closure168: function closure168() {
+    },
+    closure169: function closure169() {
+    },
+    closure170: function closure170() {
+    },
+    closure171: function closure171() {
+    },
+    closure172: function closure172() {
+    },
+    closure173: function closure173() {
+    },
+    closure174: function closure174() {
+    },
+    closure175: function closure175() {
+    },
+    closure176: function closure176() {
+    },
+    closure177: function closure177() {
+    },
+    closure178: function closure178() {
+    },
+    closure179: function closure179() {
+    },
+    closure180: function closure180() {
+    },
+    closure181: function closure181() {
+    },
+    closure182: function closure182() {
+    },
+    closure183: function closure183() {
+    },
+    closure184: function closure184() {
+    },
+    _closure23: function _closure23() {
+    },
+    closure185: function closure185() {
+    },
+    closure214: function closure214() {
+    },
+    closure215: function closure215() {
+    },
+    closure216: function closure216() {
+    },
+    closure217: function closure217() {
+    },
+    closure218: function closure218() {
+    },
+    closure219: function closure219() {
+    },
+    closure220: function closure220() {
+    },
+    closure221: function closure221() {
+    },
+    _closure28: function _closure28() {
+    },
+    closure222: function closure222() {
+    },
+    closure197: function closure197() {
+    },
+    closure196: function closure196() {
+    },
+    closure195: function closure195() {
+    },
+    closure194: function closure194() {
+    },
+    closure193: function closure193() {
+    },
+    closure192: function closure192() {
+    },
+    closure191: function closure191() {
+    },
+    closure190: function closure190() {
+    },
+    closure188: function closure188() {
+    },
+    closure187: function closure187() {
+    },
+    closure186: function closure186() {
+    },
+    closure189: function closure189() {
+    },
+    closure_hexString0: function closure_hexString0() {
+    },
+    _updateComponents_getParam0: function _updateComponents_getParam0(t0, t1, t2) {
+      this.keywords = t0;
+      this.scale = t1;
+      this.change = t2;
+    },
+    _updateComponents_closure0: function _updateComponents_closure0() {
+    },
+    _updateComponents_updateValue0: function _updateComponents_updateValue0(t0, t1) {
+      this.change = t0;
+      this.adjust = t1;
+    },
+    _updateComponents_updateRgb0: function _updateComponents_updateRgb0(t0) {
+      this.updateValue = t0;
+    },
+    _functionString_closure0: function _functionString_closure0() {
+    },
+    _removedColorFunction_closure0: function _removedColorFunction_closure0(t0, t1, t2) {
+      this.name = t0;
+      this.argument = t1;
+      this.negative = t2;
+    },
+    _removeUnits_closure1: function _removeUnits_closure1() {
+    },
+    _removeUnits_closure2: function _removeUnits_closure2() {
+    },
+    _parseChannels_closure0: function _parseChannels_closure0() {
+    },
+    _NodeSassColor: function _NodeSassColor() {
+    },
+    closure253: function closure253() {
+    },
+    closure254: function closure254() {
+    },
+    closure255: function closure255() {
+    },
+    closure256: function closure256() {
+    },
+    closure257: function closure257() {
+    },
+    closure258: function closure258() {
+    },
+    closure259: function closure259() {
+    },
+    closure260: function closure260() {
+    },
+    closure261: function closure261() {
+    },
+    closure262: function closure262() {
+    },
+    SassColor$rgb0: function(_red, _green, _blue, alpha, originalSpan) {
+      var t1 = new K.SassColor0(_red, _green, _blue, null, null, null, alpha == null ? 1 : T.fuzzyAssertRange0(alpha, 0, 1, "alpha"), originalSpan);
+      P.RangeError_checkValueInInterval(t1.get$red(), 0, 255, "red");
+      P.RangeError_checkValueInInterval(t1.get$green(), 0, 255, "green");
+      P.RangeError_checkValueInInterval(t1.get$blue(), 0, 255, "blue");
+      return t1;
+    },
+    SassColor$hsl0: function(hue, saturation, lightness, alpha) {
+      var _null = null,
+        t1 = C.JSNumber_methods.$mod(hue, 360),
+        t2 = T.fuzzyAssertRange0(saturation, 0, 100, "saturation"),
+        t3 = T.fuzzyAssertRange0(lightness, 0, 100, "lightness");
+      return new K.SassColor0(_null, _null, _null, t1, t2, t3, alpha == null ? 1 : T.fuzzyAssertRange0(alpha, 0, 1, "alpha"), _null);
+    },
+    SassColor_SassColor$hwb0: function(hue, whiteness, blackness, alpha) {
+      var t2, t1 = {},
+        scaledHue = C.JSNumber_methods.$mod(hue, 360) / 360,
+        scaledWhiteness = t1.scaledWhiteness = T.fuzzyAssertRange0(whiteness, 0, 100, "whiteness") / 100,
+        scaledBlackness = T.fuzzyAssertRange0(blackness, 0, 100, "blackness") / 100,
+        sum = scaledWhiteness + scaledBlackness;
+      if (sum > 1) {
+        t2 = t1.scaledWhiteness = scaledWhiteness / sum;
+        scaledBlackness /= sum;
+      } else
+        t2 = scaledWhiteness;
+      t2 = new K.SassColor_SassColor$hwb_toRgb0(t1, 1 - t2 - scaledBlackness);
+      return K.SassColor$rgb0(t2.call$1(scaledHue + 0.3333333333333333), t2.call$1(scaledHue), t2.call$1(scaledHue - 0.3333333333333333), alpha, null);
+    },
+    SassColor__hueToRgb0: function(m1, m2, hue) {
+      if (hue < 0)
+        ++hue;
+      if (hue > 1)
+        --hue;
+      if (hue < 0.16666666666666666)
+        return m1 + (m2 - m1) * hue * 6;
+      else if (hue < 0.5)
+        return m2;
+      else if (hue < 0.6666666666666666)
+        return m1 + (m2 - m1) * (0.6666666666666666 - hue) * 6;
+      else
+        return m1;
+    },
+    SassColor0: function SassColor0(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _._color0$_red = t0;
+      _._color0$_green = t1;
+      _._color0$_blue = t2;
+      _._color0$_hue = t3;
+      _._color0$_saturation = t4;
+      _._color0$_lightness = t5;
+      _.alpha = t6;
+      _.originalSpan = t7;
+    },
+    SassColor_SassColor$hwb_toRgb0: function SassColor_SassColor$hwb_toRgb0(t0, t1) {
+      this._box_0 = t0;
+      this.factor = t1;
+    },
+    LimitedMapView$blocklist0: function(_map, blocklist, $K, $V) {
+      var t2, key,
+        t1 = P.LinkedHashSet_LinkedHashSet($K._eval$1("0*"));
+      for (t2 = J.get$iterator$ax(_map.get$keys(_map)); t2.moveNext$0();) {
+        key = t2.get$current(t2);
+        if (!blocklist.contains$1(0, key))
+          t1.add$1(0, key);
+      }
+      return new K.LimitedMapView0(_map, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("LimitedMapView0<1,2>"));
+    },
+    LimitedMapView0: function LimitedMapView0(t0, t1, t2) {
+      this._limited_map_view0$_map = t0;
+      this._limited_map_view0$_keys = t1;
+      this.$ti = t2;
+    },
+    _fuzzyRoundIfZero0: function(number) {
+      if (!(Math.abs(number - 0) < $.$get$epsilon0()))
+        return number;
+      return C.JSNumber_methods.get$isNegative(number) ? -0.0 : 0;
+    },
+    _numberFunction0: function($name, transform) {
+      return Q.BuiltInCallable$function0($name, "$number", new K._numberFunction_closure0(transform), "sass:math");
+    },
+    _function8: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function0($name, $arguments, callback, "sass:math");
+    },
+    closure140: function closure140() {
+    },
+    closure205: function closure205() {
+    },
+    closure139: function closure139() {
+    },
+    closure138: function closure138() {
+    },
+    closure137: function closure137() {
+    },
+    closure141: function closure141() {
+    },
+    closure203: function closure203() {
+    },
+    _closure24: function _closure24() {
+    },
+    closure202: function closure202() {
+    },
+    closure201: function closure201() {
+    },
+    closure199: function closure199() {
+    },
+    closure209: function closure209() {
+    },
+    closure208: function closure208() {
+    },
+    closure207: function closure207() {
+    },
+    closure206: function closure206() {
+    },
+    closure204: function closure204() {
+    },
+    closure200: function closure200() {
+    },
+    closure198: function closure198() {
+    },
+    closure133: function closure133() {
+    },
+    closure132: function closure132() {
+    },
+    closure134: function closure134() {
+    },
+    closure136: function closure136() {
+    },
+    closure135: function closure135() {
+    },
+    _numberFunction_closure0: function _numberFunction_closure0(t0) {
+      this.transform = t0;
+    }
+  },
+  R = {ModifiableCssComment: function ModifiableCssComment(t0, t1) {
+      var _ = this;
+      _.text = t0;
+      _.span = t1;
+      _._indexInParent = _._parent = null;
+      _.isGroupEnd = false;
+    },
+    ImportCache$: function(importers, loadPaths, logger) {
+      var t1 = R.ImportCache__toImporters(importers, loadPaths, null),
+        t2 = logger == null ? C.StderrLogger_false : logger,
+        t3 = type$.legacy_Uri;
+      return new R.ImportCache(t1, t2, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Tuple2_of_legacy_Uri_and_legacy_bool, type$.legacy_Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri), P.LinkedHashMap_LinkedHashMap$_empty(t3, type$.legacy_Stylesheet_2), P.LinkedHashMap_LinkedHashMap$_empty(t3, type$.legacy_ImporterResult_2));
+    },
+    ImportCache__toImporters: function(importers, loadPaths, packageResolver) {
+      var _i, t2, t3, path, _null = null,
+        sassPath = H._asStringS(J.get$env$x(self.process).SASS_PATH),
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Importer);
+      for (_i = 0; false; ++_i)
+        t1.push(importers[_i]);
+      if (loadPaths != null)
+        for (t2 = J.get$iterator$ax(loadPaths); t2.moveNext$0();) {
+          t3 = t2.get$current(t2);
+          t1.push(new F.FilesystemImporter($.$get$context().absolute$7(t3, _null, _null, _null, _null, _null, _null)));
+        }
+      if (sassPath != null) {
+        t2 = sassPath.split(J.$eq$(J.get$platform$x(self.process), "win32") ? ";" : ":");
+        t3 = t2.length;
+        _i = 0;
+        for (; _i < t3; ++_i) {
+          path = t2[_i];
+          t1.push(new F.FilesystemImporter($.$get$context().absolute$7(path, _null, _null, _null, _null, _null, _null)));
+        }
+      }
+      return t1;
+    },
+    ImportCache: function ImportCache(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._importers = t0;
+      _._logger = t1;
+      _._canonicalizeCache = t2;
+      _._importCache = t3;
+      _._resultsCache = t4;
+    },
+    ImportCache_canonicalize_closure: function ImportCache_canonicalize_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.url = t1;
+      this.forImport = t2;
+    },
+    ImportCache__canonicalize_closure: function ImportCache__canonicalize_closure(t0, t1) {
+      this.importer = t0;
+      this.url = t1;
+    },
+    ImportCache_importCanonical_closure: function ImportCache_importCanonical_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.importer = t1;
+      _.canonicalUrl = t2;
+      _.originalUrl = t3;
+    },
+    ImportCache_humanize_closure: function ImportCache_humanize_closure(t0) {
+      this.canonicalUrl = t0;
+    },
+    ImportCache_humanize_closure0: function ImportCache_humanize_closure0() {
+    },
+    ImportCache_humanize_closure1: function ImportCache_humanize_closure1() {
+    },
+    ForwardedModuleView_ifNecessary: function(inner, rule, $T) {
+      var t1;
+      if (rule.prefix == null)
+        if (rule.shownMixinsAndFunctions == null)
+          if (rule.shownVariables == null) {
+            t1 = rule.hiddenMixinsAndFunctions;
+            if (t1 != null) {
+              t1 = t1._base;
+              t1 = t1.get$isEmpty(t1);
+            } else
+              t1 = true;
+            if (t1) {
+              t1 = rule.hiddenVariables;
+              if (t1 != null) {
+                t1 = t1._base;
+                t1 = t1.get$isEmpty(t1);
+              } else
+                t1 = true;
+            } else
+              t1 = false;
+          } else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      if (t1)
+        return inner;
+      else
+        return R.ForwardedModuleView$(inner, rule, $T._eval$1("0*"));
+    },
+    ForwardedModuleView$: function(_inner, _rule, $T) {
+      var t5, t6,
+        t1 = _rule.prefix,
+        t2 = _rule.shownVariables,
+        t3 = _rule.hiddenVariables,
+        t4 = R.ForwardedModuleView__forwardedMap(_inner.get$variables(), t1, t2, t3, type$.legacy_Value);
+      t2 = _inner.get$variableNodes() == null ? null : R.ForwardedModuleView__forwardedMap(_inner.get$variableNodes(), t1, t2, t3, type$.legacy_AstNode);
+      t3 = _rule.shownMixinsAndFunctions;
+      t5 = _rule.hiddenMixinsAndFunctions;
+      t6 = $T._eval$1("0*");
+      return new R.ForwardedModuleView(_inner, _rule, t4, t2, R.ForwardedModuleView__forwardedMap(_inner.get$functions(_inner), t1, t3, t5, t6), R.ForwardedModuleView__forwardedMap(_inner.get$mixins(), t1, t3, t5, t6), $T._eval$1("ForwardedModuleView<0>"));
+    },
+    ForwardedModuleView__forwardedMap: function(map, prefix, safelist, blocklist, $V) {
+      var t2,
+        t1 = prefix == null;
+      if (t1)
+        if (safelist == null)
+          if (blocklist != null) {
+            t2 = blocklist._base;
+            t2 = t2.get$isEmpty(t2);
+          } else
+            t2 = true;
+        else
+          t2 = false;
+      else
+        t2 = false;
+      if (t2)
+        return map;
+      if (!t1)
+        map = new F.PrefixedMapView(map, prefix, $V._eval$1("PrefixedMapView<0*>"));
+      if (safelist != null)
+        map = new K.LimitedMapView(map, safelist._base.intersection$1(new M.MapKeySet(map, type$.MapKeySet_legacy_Object)), type$.$env_1_1_legacy_String._bind$1($V._eval$1("0*"))._eval$1("LimitedMapView<1,2>"));
+      else {
+        if (blocklist != null) {
+          t1 = blocklist._base;
+          t1 = t1.get$isNotEmpty(t1);
+        } else
+          t1 = false;
+        if (t1)
+          map = K.LimitedMapView$blocklist(map, blocklist, type$.legacy_String, $V._eval$1("0*"));
+      }
+      return map;
+    },
+    ForwardedModuleView: function ForwardedModuleView(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._forwarded_view$_inner = t0;
+      _._rule = t1;
+      _.variables = t2;
+      _.variableNodes = t3;
+      _.functions = t4;
+      _.mixins = t5;
+      _.$ti = t6;
+    },
+    UnprefixedMapView: function UnprefixedMapView(t0, t1, t2) {
+      this._unprefixed_map_view$_map = t0;
+      this._unprefixed_map_view$_prefix = t1;
+      this.$ti = t2;
+    },
+    _UnprefixedKeys: function _UnprefixedKeys(t0) {
+      this._unprefixed_map_view$_view = t0;
+    },
+    _UnprefixedKeys_iterator_closure: function _UnprefixedKeys_iterator_closure(t0) {
+      this.$this = t0;
+    },
+    _UnprefixedKeys_iterator_closure0: function _UnprefixedKeys_iterator_closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor$: function(functions, importCache, logger, nodeImporter, sourceMap) {
+      var t1 = type$.legacy_String,
+        t2 = type$.legacy_Uri,
+        t3 = type$.legacy_Module_legacy_Callable,
+        t4 = type$.legacy_AstNode,
+        t5 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Tuple2_of_legacy_String_and_legacy_AstNode),
+        t6 = logger == null ? C.StderrLogger_false : logger;
+      t5 = new R._EvaluateVisitor(importCache, nodeImporter, P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Callable), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), P.LinkedHashMap_LinkedHashMap$_empty(t2, t4), t6, sourceMap, O.Environment$(sourceMap), P.LinkedHashSet_LinkedHashSet$_empty(t1), P.LinkedHashMap_LinkedHashMap$_empty(t2, t4), t5, C.Configuration_Map_empty_null_true);
+      t5._EvaluateVisitor$5$functions$importCache$logger$nodeImporter$sourceMap(functions, importCache, logger, nodeImporter, sourceMap);
+      return t5;
+    },
+    Evaluator: function Evaluator(t0, t1) {
+      this._visitor = t0;
+      this._importer = t1;
+    },
+    _EvaluateVisitor: function _EvaluateVisitor(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
+      var _ = this;
+      _._evaluate$_importCache = t0;
+      _._evaluate$_nodeImporter = t1;
+      _._builtInFunctions = t2;
+      _._builtInModules = t3;
+      _._modules = t4;
+      _._moduleNodes = t5;
+      _._evaluate$_logger = t6;
+      _._sourceMap = t7;
+      _._evaluate$_environment = t8;
+      _._declarationName = _._evaluate$_parent = _._mediaQueries = _._styleRule = null;
+      _._member = "root stylesheet";
+      _._importSpan = _._callableNode = null;
+      _._inKeyframes = _._atRootExcludingStyleRule = _._inUnknownAtRule = _._inFunction = false;
+      _._evaluate$_includedFiles = t9;
+      _._activeModules = t10;
+      _._stack = t11;
+      _._extender = _._outOfOrderImports = _._endOfImports = _._root = _._stylesheet = _._importer = null;
+      _._configuration = t12;
+    },
+    _EvaluateVisitor_closure: function _EvaluateVisitor_closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure0: function _EvaluateVisitor_closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure1: function _EvaluateVisitor_closure1(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure2: function _EvaluateVisitor_closure2(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure3: function _EvaluateVisitor_closure3(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure4: function _EvaluateVisitor_closure4(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure5: function _EvaluateVisitor_closure5(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure6: function _EvaluateVisitor_closure6(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__closure1: function _EvaluateVisitor__closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.name = t1;
+      this.module = t2;
+    },
+    _EvaluateVisitor_closure7: function _EvaluateVisitor_closure7(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure8: function _EvaluateVisitor_closure8(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__closure: function _EvaluateVisitor__closure(t0, t1) {
+      this.values = t0;
+      this.span = t1;
+    },
+    _EvaluateVisitor__closure0: function _EvaluateVisitor__closure0(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_run_closure: function _EvaluateVisitor_run_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.importer = t2;
+    },
+    _EvaluateVisitor_runExpression_closure: function _EvaluateVisitor_runExpression_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.importer = t1;
+      this.expression = t2;
+    },
+    _EvaluateVisitor_runExpression__closure: function _EvaluateVisitor_runExpression__closure(t0, t1) {
+      this.$this = t0;
+      this.expression = t1;
+    },
+    _EvaluateVisitor_runStatement_closure: function _EvaluateVisitor_runStatement_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.importer = t1;
+      this.statement = t2;
+    },
+    _EvaluateVisitor_runStatement__closure: function _EvaluateVisitor_runStatement__closure(t0, t1) {
+      this.$this = t0;
+      this.statement = t1;
+    },
+    _EvaluateVisitor__withWarnCallback_closure: function _EvaluateVisitor__withWarnCallback_closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__loadModule_closure: function _EvaluateVisitor__loadModule_closure(t0, t1) {
+      this.callback = t0;
+      this.builtInModule = t1;
+    },
+    _EvaluateVisitor__loadModule_closure0: function _EvaluateVisitor__loadModule_closure0(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.$this = t0;
+      _.url = t1;
+      _.nodeWithSpan = t2;
+      _.baseUrl = t3;
+      _.namesInErrors = t4;
+      _.configuration = t5;
+      _.callback = t6;
+    },
+    _EvaluateVisitor__execute_closure: function _EvaluateVisitor__execute_closure(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.importer = t2;
+      _.stylesheet = t3;
+      _.extender = t4;
+      _.configuration = t5;
+    },
+    _EvaluateVisitor__combineCss_closure: function _EvaluateVisitor__combineCss_closure() {
+    },
+    _EvaluateVisitor__combineCss_closure0: function _EvaluateVisitor__combineCss_closure0(t0) {
+      this.selectors = t0;
+    },
+    _EvaluateVisitor__combineCss_closure1: function _EvaluateVisitor__combineCss_closure1() {
+    },
+    _EvaluateVisitor__extendModules_closure: function _EvaluateVisitor__extendModules_closure(t0) {
+      this.originalSelectors = t0;
+    },
+    _EvaluateVisitor__extendModules_closure0: function _EvaluateVisitor__extendModules_closure0() {
+    },
+    _EvaluateVisitor__topologicalModules_visitModule: function _EvaluateVisitor__topologicalModules_visitModule(t0, t1) {
+      this.seen = t0;
+      this.sorted = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure: function _EvaluateVisitor_visitAtRootRule_closure(t0, t1) {
+      this.$this = t0;
+      this.resolved = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure0: function _EvaluateVisitor_visitAtRootRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure1: function _EvaluateVisitor_visitAtRootRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure: function _EvaluateVisitor__scopeForAtRoot_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.newParent = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure0: function _EvaluateVisitor__scopeForAtRoot_closure0(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure1: function _EvaluateVisitor__scopeForAtRoot_closure1(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot__closure: function _EvaluateVisitor__scopeForAtRoot__closure(t0, t1) {
+      this.innerScope = t0;
+      this.callback = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure2: function _EvaluateVisitor__scopeForAtRoot_closure2(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure3: function _EvaluateVisitor__scopeForAtRoot_closure3() {
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure4: function _EvaluateVisitor__scopeForAtRoot_closure4(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor_visitContentRule_closure: function _EvaluateVisitor_visitContentRule_closure(t0, t1) {
+      this.$this = t0;
+      this.content = t1;
+    },
+    _EvaluateVisitor_visitDeclaration_closure: function _EvaluateVisitor_visitDeclaration_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitEachRule_closure: function _EvaluateVisitor_visitEachRule_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitEachRule_closure0: function _EvaluateVisitor_visitEachRule_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitEachRule_closure1: function _EvaluateVisitor_visitEachRule_closure1(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.list = t1;
+      _.setVariables = t2;
+      _.node = t3;
+    },
+    _EvaluateVisitor_visitEachRule__closure: function _EvaluateVisitor_visitEachRule__closure(t0, t1, t2) {
+      this.$this = t0;
+      this.setVariables = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitEachRule___closure: function _EvaluateVisitor_visitEachRule___closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitExtendRule_closure: function _EvaluateVisitor_visitExtendRule_closure(t0, t1) {
+      this.$this = t0;
+      this.targetText = t1;
+    },
+    _EvaluateVisitor_visitAtRule_closure: function _EvaluateVisitor_visitAtRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRule__closure: function _EvaluateVisitor_visitAtRule__closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRule_closure0: function _EvaluateVisitor_visitAtRule_closure0() {
+    },
+    _EvaluateVisitor_visitForRule_closure: function _EvaluateVisitor_visitForRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure0: function _EvaluateVisitor_visitForRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure1: function _EvaluateVisitor_visitForRule_closure1(t0) {
+      this.fromNumber = t0;
+    },
+    _EvaluateVisitor_visitForRule_closure2: function _EvaluateVisitor_visitForRule_closure2(t0, t1) {
+      this.toNumber = t0;
+      this.fromNumber = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure3: function _EvaluateVisitor_visitForRule_closure3(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.node = t2;
+      _.from = t3;
+      _.direction = t4;
+      _.fromNumber = t5;
+    },
+    _EvaluateVisitor_visitForRule__closure: function _EvaluateVisitor_visitForRule__closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitForwardRule_closure: function _EvaluateVisitor_visitForwardRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForwardRule_closure0: function _EvaluateVisitor_visitForwardRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor__assertConfigurationIsEmpty_closure: function _EvaluateVisitor__assertConfigurationIsEmpty_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.only = t1;
+      this.nameInError = t2;
+    },
+    _EvaluateVisitor_visitIfRule_closure: function _EvaluateVisitor_visitIfRule_closure(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _EvaluateVisitor_visitIfRule__closure: function _EvaluateVisitor_visitIfRule__closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__visitDynamicImport_closure: function _EvaluateVisitor__visitDynamicImport_closure(t0, t1) {
+      this.$this = t0;
+      this.$import = t1;
+    },
+    _EvaluateVisitor__visitDynamicImport__closure: function _EvaluateVisitor__visitDynamicImport__closure(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.importer = t2;
+      _.stylesheet = t3;
+      _.environment = t4;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure: function _EvaluateVisitor_visitIncludeRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure0: function _EvaluateVisitor_visitIncludeRule_closure0(t0) {
+      this.node = t0;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure1: function _EvaluateVisitor_visitIncludeRule_closure1(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.contentCallable = t1;
+      _.mixin = t2;
+      _.nodeWithSpan = t3;
+    },
+    _EvaluateVisitor_visitIncludeRule__closure: function _EvaluateVisitor_visitIncludeRule__closure(t0, t1, t2) {
+      this.$this = t0;
+      this.mixin = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitIncludeRule___closure: function _EvaluateVisitor_visitIncludeRule___closure(t0, t1, t2) {
+      this.$this = t0;
+      this.mixin = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitIncludeRule____closure: function _EvaluateVisitor_visitIncludeRule____closure(t0, t1) {
+      this.$this = t0;
+      this.statement = t1;
+    },
+    _EvaluateVisitor_visitMediaRule_closure: function _EvaluateVisitor_visitMediaRule_closure(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.mergedQueries = t1;
+      _.queries = t2;
+      _.node = t3;
+    },
+    _EvaluateVisitor_visitMediaRule__closure: function _EvaluateVisitor_visitMediaRule__closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitMediaRule___closure: function _EvaluateVisitor_visitMediaRule___closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitMediaRule_closure0: function _EvaluateVisitor_visitMediaRule_closure0(t0) {
+      this.mergedQueries = t0;
+    },
+    _EvaluateVisitor__visitMediaQueries_closure: function _EvaluateVisitor__visitMediaQueries_closure(t0, t1) {
+      this.$this = t0;
+      this.resolved = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure: function _EvaluateVisitor_visitStyleRule_closure(t0, t1) {
+      this.$this = t0;
+      this.selectorText = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure0: function _EvaluateVisitor_visitStyleRule_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure1: function _EvaluateVisitor_visitStyleRule_closure1() {
+    },
+    _EvaluateVisitor_visitStyleRule_closure2: function _EvaluateVisitor_visitStyleRule_closure2(t0, t1) {
+      this.$this = t0;
+      this.selectorText = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure3: function _EvaluateVisitor_visitStyleRule_closure3(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure4: function _EvaluateVisitor_visitStyleRule_closure4(t0, t1, t2) {
+      this.$this = t0;
+      this.rule = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitStyleRule__closure: function _EvaluateVisitor_visitStyleRule__closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure5: function _EvaluateVisitor_visitStyleRule_closure5() {
+    },
+    _EvaluateVisitor_visitSupportsRule_closure: function _EvaluateVisitor_visitSupportsRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitSupportsRule__closure: function _EvaluateVisitor_visitSupportsRule__closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitSupportsRule_closure0: function _EvaluateVisitor_visitSupportsRule_closure0() {
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure: function _EvaluateVisitor_visitVariableDeclaration_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.override = t2;
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure0: function _EvaluateVisitor_visitVariableDeclaration_closure0(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure1: function _EvaluateVisitor_visitVariableDeclaration_closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.value = t2;
+    },
+    _EvaluateVisitor_visitUseRule_closure: function _EvaluateVisitor_visitUseRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWarnRule_closure: function _EvaluateVisitor_visitWarnRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWhileRule_closure: function _EvaluateVisitor_visitWhileRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWhileRule__closure: function _EvaluateVisitor_visitWhileRule__closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitBinaryOperationExpression_closure: function _EvaluateVisitor_visitBinaryOperationExpression_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitVariableExpression_closure: function _EvaluateVisitor_visitVariableExpression_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitListExpression_closure: function _EvaluateVisitor_visitListExpression_closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitFunctionExpression_closure: function _EvaluateVisitor_visitFunctionExpression_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.plainName = t2;
+    },
+    _EvaluateVisitor_visitFunctionExpression_closure0: function _EvaluateVisitor_visitFunctionExpression_closure0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor__runUserDefinedCallable_closure: function _EvaluateVisitor__runUserDefinedCallable_closure(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.callable = t1;
+      _.evaluated = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable__closure: function _EvaluateVisitor__runUserDefinedCallable__closure(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.evaluated = t1;
+      _.callable = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable___closure: function _EvaluateVisitor__runUserDefinedCallable___closure(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.evaluated = t1;
+      _.callable = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable____closure: function _EvaluateVisitor__runUserDefinedCallable____closure() {
+    },
+    _EvaluateVisitor__runFunctionCallable_closure: function _EvaluateVisitor__runFunctionCallable_closure(t0, t1) {
+      this.$this = t0;
+      this.callable = t1;
+    },
+    _EvaluateVisitor__runBuiltInCallable_closure: function _EvaluateVisitor__runBuiltInCallable_closure(t0, t1, t2) {
+      this.overload = t0;
+      this.evaluated = t1;
+      this.namedSet = t2;
+    },
+    _EvaluateVisitor__runBuiltInCallable_closure0: function _EvaluateVisitor__runBuiltInCallable_closure0() {
+    },
+    _EvaluateVisitor__evaluateArguments_closure: function _EvaluateVisitor__evaluateArguments_closure(t0, t1, t2) {
+      this.named = t0;
+      this.namedNodes = t1;
+      this.restNodeForSpan = t2;
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure: function _EvaluateVisitor__evaluateMacroArguments_closure() {
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure0: function _EvaluateVisitor__evaluateMacroArguments_closure0() {
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure1: function _EvaluateVisitor__evaluateMacroArguments_closure1(t0) {
+      this.named = t0;
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure2: function _EvaluateVisitor__evaluateMacroArguments_closure2() {
+    },
+    _EvaluateVisitor__addRestMap_closure: function _EvaluateVisitor__addRestMap_closure(t0) {
+      this.T = t0;
+    },
+    _EvaluateVisitor__addRestMap_closure0: function _EvaluateVisitor__addRestMap_closure0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.values = t2;
+      _.map = t3;
+      _.nodeWithSpan = t4;
+    },
+    _EvaluateVisitor__verifyArguments_closure: function _EvaluateVisitor__verifyArguments_closure(t0, t1, t2) {
+      this.$arguments = t0;
+      this.positional = t1;
+      this.named = t2;
+    },
+    _EvaluateVisitor_visitStringExpression_closure: function _EvaluateVisitor_visitStringExpression_closure(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitCssAtRule_closure: function _EvaluateVisitor_visitCssAtRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssAtRule_closure0: function _EvaluateVisitor_visitCssAtRule_closure0() {
+    },
+    _EvaluateVisitor_visitCssKeyframeBlock_closure: function _EvaluateVisitor_visitCssKeyframeBlock_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssKeyframeBlock_closure0: function _EvaluateVisitor_visitCssKeyframeBlock_closure0() {
+    },
+    _EvaluateVisitor_visitCssMediaRule_closure: function _EvaluateVisitor_visitCssMediaRule_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.mergedQueries = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitCssMediaRule__closure: function _EvaluateVisitor_visitCssMediaRule__closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssMediaRule___closure: function _EvaluateVisitor_visitCssMediaRule___closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssMediaRule_closure0: function _EvaluateVisitor_visitCssMediaRule_closure0(t0) {
+      this.mergedQueries = t0;
+    },
+    _EvaluateVisitor_visitCssStyleRule_closure: function _EvaluateVisitor_visitCssStyleRule_closure(t0, t1, t2) {
+      this.$this = t0;
+      this.rule = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitCssStyleRule__closure: function _EvaluateVisitor_visitCssStyleRule__closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssStyleRule_closure0: function _EvaluateVisitor_visitCssStyleRule_closure0() {
+    },
+    _EvaluateVisitor_visitCssSupportsRule_closure: function _EvaluateVisitor_visitCssSupportsRule_closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssSupportsRule__closure: function _EvaluateVisitor_visitCssSupportsRule__closure(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssSupportsRule_closure0: function _EvaluateVisitor_visitCssSupportsRule_closure0() {
+    },
+    _EvaluateVisitor__performInterpolation_closure: function _EvaluateVisitor__performInterpolation_closure(t0, t1) {
+      this.$this = t0;
+      this.warnForColor = t1;
+    },
+    _EvaluateVisitor__serialize_closure: function _EvaluateVisitor__serialize_closure(t0, t1) {
+      this.value = t0;
+      this.quote = t1;
+    },
+    _EvaluateVisitor__stackTrace_closure: function _EvaluateVisitor__stackTrace_closure(t0) {
+      this.$this = t0;
+    },
+    _ImportedCssVisitor: function _ImportedCssVisitor(t0) {
+      this._visitor = t0;
+    },
+    _ImportedCssVisitor_visitCssAtRule_closure: function _ImportedCssVisitor_visitCssAtRule_closure() {
+    },
+    _ImportedCssVisitor_visitCssMediaRule_closure: function _ImportedCssVisitor_visitCssMediaRule_closure(t0) {
+      this.hasBeenMerged = t0;
+    },
+    _ImportedCssVisitor_visitCssStyleRule_closure: function _ImportedCssVisitor_visitCssStyleRule_closure() {
+    },
+    _ImportedCssVisitor_visitCssSupportsRule_closure: function _ImportedCssVisitor_visitCssSupportsRule_closure() {
+    },
+    _ArgumentResults: function _ArgumentResults(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.positional = t0;
+      _.positionalNodes = t1;
+      _.named = t2;
+      _.namedNodes = t3;
+      _.separator = t4;
+    },
+    _collectToList: function(element, soFar, $T) {
+      if (soFar == null)
+        soFar = H.setRuntimeTypeInfo([], $T._eval$1("JSArray<0*>"));
+      J.add$1$ax(soFar, element);
+      return soFar;
+    },
+    _debounceAggregate: function(duration, collect, leading, trailing, $T, $R) {
+      var t2, t1 = {};
+      t1.soFar = t1.timer = null;
+      t1.emittedLatestAsLeading = t1.shouldClose = false;
+      t2 = $R._eval$1("0*");
+      return new L._StreamTransformer(new R._debounceAggregate_closure(t1, collect, false, duration, true, $T, $R), new R._debounceAggregate_closure0(t1, true, $R), H.instantiate1(L.from_handlers__StreamTransformer__defaultHandleError$closure(), t2), $T._eval$1("@<0*>")._bind$1(t2)._eval$1("_StreamTransformer<1,2>"));
+    },
+    _debounceAggregate_closure: function _debounceAggregate_closure(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._box_0 = t0;
+      _.collect = t1;
+      _.leading = t2;
+      _.duration = t3;
+      _.trailing = t4;
+      _.T = t5;
+      _.R = t6;
+    },
+    _debounceAggregate__closure: function _debounceAggregate__closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.trailing = t1;
+      this.sink = t2;
+    },
+    _debounceAggregate_closure0: function _debounceAggregate_closure0(t0, t1, t2) {
+      this._box_0 = t0;
+      this.trailing = t1;
+      this.R = t2;
+    },
+    ModifiableCssComment0: function ModifiableCssComment0(t0, t1) {
+      var _ = this;
+      _.text = t0;
+      _.span = t1;
+      _._node2$_indexInParent = _._node2$_parent = null;
+      _.isGroupEnd = false;
+    },
+    _EvaluateVisitor$1: function(functions, importCache, logger, nodeImporter, sourceMap) {
+      var t6,
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_Uri,
+        t3 = type$.legacy_Module_legacy_Callable_2,
+        t4 = type$.legacy_AstNode_2,
+        t5 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Tuple2_of_legacy_String_and_legacy_AstNode_2);
+      if (nodeImporter == null)
+        t6 = importCache == null ? R.ImportCache$none(logger) : importCache;
+      else
+        t6 = null;
+      t1 = new R._EvaluateVisitor1(t6, nodeImporter, P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Callable_2), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), P.LinkedHashMap_LinkedHashMap$_empty(t2, t4), C.C_StderrLogger, sourceMap, O.Environment$0(sourceMap), P.LinkedHashSet_LinkedHashSet$_empty(t1), P.LinkedHashMap_LinkedHashMap$_empty(t2, t4), t5, C.Configuration_Map_empty_null_true0);
+      t1._EvaluateVisitor$5$functions$importCache$logger$nodeImporter$sourceMap1(functions, importCache, logger, nodeImporter, sourceMap);
+      return t1;
+    },
+    _EvaluateVisitor1: function _EvaluateVisitor1(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
+      var _ = this;
+      _._evaluate0$_importCache = t0;
+      _._nodeImporter = t1;
+      _._evaluate0$_builtInFunctions = t2;
+      _._evaluate0$_builtInModules = t3;
+      _._evaluate0$_modules = t4;
+      _._evaluate0$_moduleNodes = t5;
+      _._evaluate0$_logger = t6;
+      _._evaluate0$_sourceMap = t7;
+      _._evaluate0$_environment = t8;
+      _._evaluate0$_declarationName = _._evaluate0$_parent = _._evaluate0$_mediaQueries = _._evaluate0$_styleRule = null;
+      _._evaluate0$_member = "root stylesheet";
+      _._evaluate0$_importSpan = _._evaluate0$_callableNode = null;
+      _._evaluate0$_inKeyframes = _._evaluate0$_atRootExcludingStyleRule = _._evaluate0$_inUnknownAtRule = _._evaluate0$_inFunction = false;
+      _._includedFiles = t9;
+      _._evaluate0$_activeModules = t10;
+      _._evaluate0$_stack = t11;
+      _._evaluate0$_extender = _._evaluate0$_outOfOrderImports = _._evaluate0$_endOfImports = _._evaluate0$_root = _._evaluate0$_stylesheet = _._evaluate0$_importer = null;
+      _._evaluate0$_configuration = t12;
+    },
+    _EvaluateVisitor_closure19: function _EvaluateVisitor_closure19(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure20: function _EvaluateVisitor_closure20(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure21: function _EvaluateVisitor_closure21(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure22: function _EvaluateVisitor_closure22(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure23: function _EvaluateVisitor_closure23(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure24: function _EvaluateVisitor_closure24(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure25: function _EvaluateVisitor_closure25(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure26: function _EvaluateVisitor_closure26(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__closure7: function _EvaluateVisitor__closure7(t0, t1, t2) {
+      this.$this = t0;
+      this.name = t1;
+      this.module = t2;
+    },
+    _EvaluateVisitor_closure27: function _EvaluateVisitor_closure27(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_closure28: function _EvaluateVisitor_closure28(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__closure5: function _EvaluateVisitor__closure5(t0, t1) {
+      this.values = t0;
+      this.span = t1;
+    },
+    _EvaluateVisitor__closure6: function _EvaluateVisitor__closure6(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_run_closure1: function _EvaluateVisitor_run_closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.importer = t2;
+    },
+    _EvaluateVisitor__withWarnCallback_closure1: function _EvaluateVisitor__withWarnCallback_closure1(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__loadModule_closure3: function _EvaluateVisitor__loadModule_closure3(t0, t1) {
+      this.callback = t0;
+      this.builtInModule = t1;
+    },
+    _EvaluateVisitor__loadModule_closure4: function _EvaluateVisitor__loadModule_closure4(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.$this = t0;
+      _.url = t1;
+      _.nodeWithSpan = t2;
+      _.baseUrl = t3;
+      _.namesInErrors = t4;
+      _.configuration = t5;
+      _.callback = t6;
+    },
+    _EvaluateVisitor__execute_closure1: function _EvaluateVisitor__execute_closure1(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.importer = t2;
+      _.stylesheet = t3;
+      _.extender = t4;
+      _.configuration = t5;
+    },
+    _EvaluateVisitor__combineCss_closure5: function _EvaluateVisitor__combineCss_closure5() {
+    },
+    _EvaluateVisitor__combineCss_closure6: function _EvaluateVisitor__combineCss_closure6(t0) {
+      this.selectors = t0;
+    },
+    _EvaluateVisitor__combineCss_closure7: function _EvaluateVisitor__combineCss_closure7() {
+    },
+    _EvaluateVisitor__extendModules_closure3: function _EvaluateVisitor__extendModules_closure3(t0) {
+      this.originalSelectors = t0;
+    },
+    _EvaluateVisitor__extendModules_closure4: function _EvaluateVisitor__extendModules_closure4() {
+    },
+    _EvaluateVisitor__topologicalModules_visitModule1: function _EvaluateVisitor__topologicalModules_visitModule1(t0, t1) {
+      this.seen = t0;
+      this.sorted = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure5: function _EvaluateVisitor_visitAtRootRule_closure5(t0, t1) {
+      this.$this = t0;
+      this.resolved = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure6: function _EvaluateVisitor_visitAtRootRule_closure6(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRootRule_closure7: function _EvaluateVisitor_visitAtRootRule_closure7(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure11: function _EvaluateVisitor__scopeForAtRoot_closure11(t0, t1, t2) {
+      this.$this = t0;
+      this.newParent = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure12: function _EvaluateVisitor__scopeForAtRoot_closure12(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure13: function _EvaluateVisitor__scopeForAtRoot_closure13(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot__closure1: function _EvaluateVisitor__scopeForAtRoot__closure1(t0, t1) {
+      this.innerScope = t0;
+      this.callback = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure14: function _EvaluateVisitor__scopeForAtRoot_closure14(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure15: function _EvaluateVisitor__scopeForAtRoot_closure15() {
+    },
+    _EvaluateVisitor__scopeForAtRoot_closure16: function _EvaluateVisitor__scopeForAtRoot_closure16(t0, t1) {
+      this.$this = t0;
+      this.innerScope = t1;
+    },
+    _EvaluateVisitor_visitContentRule_closure1: function _EvaluateVisitor_visitContentRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.content = t1;
+    },
+    _EvaluateVisitor_visitDeclaration_closure1: function _EvaluateVisitor_visitDeclaration_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitEachRule_closure5: function _EvaluateVisitor_visitEachRule_closure5(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitEachRule_closure6: function _EvaluateVisitor_visitEachRule_closure6(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitEachRule_closure7: function _EvaluateVisitor_visitEachRule_closure7(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.list = t1;
+      _.setVariables = t2;
+      _.node = t3;
+    },
+    _EvaluateVisitor_visitEachRule__closure1: function _EvaluateVisitor_visitEachRule__closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.setVariables = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitEachRule___closure1: function _EvaluateVisitor_visitEachRule___closure1(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitExtendRule_closure1: function _EvaluateVisitor_visitExtendRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.targetText = t1;
+    },
+    _EvaluateVisitor_visitAtRule_closure3: function _EvaluateVisitor_visitAtRule_closure3(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRule__closure1: function _EvaluateVisitor_visitAtRule__closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitAtRule_closure4: function _EvaluateVisitor_visitAtRule_closure4() {
+    },
+    _EvaluateVisitor_visitForRule_closure9: function _EvaluateVisitor_visitForRule_closure9(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure10: function _EvaluateVisitor_visitForRule_closure10(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure11: function _EvaluateVisitor_visitForRule_closure11(t0) {
+      this.fromNumber = t0;
+    },
+    _EvaluateVisitor_visitForRule_closure12: function _EvaluateVisitor_visitForRule_closure12(t0, t1) {
+      this.toNumber = t0;
+      this.fromNumber = t1;
+    },
+    _EvaluateVisitor_visitForRule_closure13: function _EvaluateVisitor_visitForRule_closure13(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.node = t2;
+      _.from = t3;
+      _.direction = t4;
+      _.fromNumber = t5;
+    },
+    _EvaluateVisitor_visitForRule__closure1: function _EvaluateVisitor_visitForRule__closure1(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitForwardRule_closure3: function _EvaluateVisitor_visitForwardRule_closure3(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitForwardRule_closure4: function _EvaluateVisitor_visitForwardRule_closure4(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor__assertConfigurationIsEmpty_closure1: function _EvaluateVisitor__assertConfigurationIsEmpty_closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.only = t1;
+      this.nameInError = t2;
+    },
+    _EvaluateVisitor_visitIfRule_closure1: function _EvaluateVisitor_visitIfRule_closure1(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _EvaluateVisitor_visitIfRule__closure1: function _EvaluateVisitor_visitIfRule__closure1(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor__visitDynamicImport_closure1: function _EvaluateVisitor__visitDynamicImport_closure1(t0, t1) {
+      this.$this = t0;
+      this.$import = t1;
+    },
+    _EvaluateVisitor__visitDynamicImport__closure1: function _EvaluateVisitor__visitDynamicImport__closure1(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.importer = t2;
+      _.stylesheet = t3;
+      _.environment = t4;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure5: function _EvaluateVisitor_visitIncludeRule_closure5(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure6: function _EvaluateVisitor_visitIncludeRule_closure6(t0) {
+      this.node = t0;
+    },
+    _EvaluateVisitor_visitIncludeRule_closure7: function _EvaluateVisitor_visitIncludeRule_closure7(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.contentCallable = t1;
+      _.mixin = t2;
+      _.nodeWithSpan = t3;
+    },
+    _EvaluateVisitor_visitIncludeRule__closure1: function _EvaluateVisitor_visitIncludeRule__closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.mixin = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitIncludeRule___closure1: function _EvaluateVisitor_visitIncludeRule___closure1(t0, t1, t2) {
+      this.$this = t0;
+      this.mixin = t1;
+      this.nodeWithSpan = t2;
+    },
+    _EvaluateVisitor_visitIncludeRule____closure1: function _EvaluateVisitor_visitIncludeRule____closure1(t0, t1) {
+      this.$this = t0;
+      this.statement = t1;
+    },
+    _EvaluateVisitor_visitMediaRule_closure3: function _EvaluateVisitor_visitMediaRule_closure3(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.mergedQueries = t1;
+      _.queries = t2;
+      _.node = t3;
+    },
+    _EvaluateVisitor_visitMediaRule__closure1: function _EvaluateVisitor_visitMediaRule__closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitMediaRule___closure1: function _EvaluateVisitor_visitMediaRule___closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitMediaRule_closure4: function _EvaluateVisitor_visitMediaRule_closure4(t0) {
+      this.mergedQueries = t0;
+    },
+    _EvaluateVisitor__visitMediaQueries_closure1: function _EvaluateVisitor__visitMediaQueries_closure1(t0, t1) {
+      this.$this = t0;
+      this.resolved = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure13: function _EvaluateVisitor_visitStyleRule_closure13(t0, t1) {
+      this.$this = t0;
+      this.selectorText = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure14: function _EvaluateVisitor_visitStyleRule_closure14(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure15: function _EvaluateVisitor_visitStyleRule_closure15() {
+    },
+    _EvaluateVisitor_visitStyleRule_closure16: function _EvaluateVisitor_visitStyleRule_closure16(t0, t1) {
+      this.$this = t0;
+      this.selectorText = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure17: function _EvaluateVisitor_visitStyleRule_closure17(t0, t1) {
+      this._box_0 = t0;
+      this.$this = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure18: function _EvaluateVisitor_visitStyleRule_closure18(t0, t1, t2) {
+      this.$this = t0;
+      this.rule = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitStyleRule__closure1: function _EvaluateVisitor_visitStyleRule__closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitStyleRule_closure19: function _EvaluateVisitor_visitStyleRule_closure19() {
+    },
+    _EvaluateVisitor_visitSupportsRule_closure3: function _EvaluateVisitor_visitSupportsRule_closure3(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitSupportsRule__closure1: function _EvaluateVisitor_visitSupportsRule__closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitSupportsRule_closure4: function _EvaluateVisitor_visitSupportsRule_closure4() {
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure5: function _EvaluateVisitor_visitVariableDeclaration_closure5(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.override = t2;
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure6: function _EvaluateVisitor_visitVariableDeclaration_closure6(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitVariableDeclaration_closure7: function _EvaluateVisitor_visitVariableDeclaration_closure7(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.value = t2;
+    },
+    _EvaluateVisitor_visitUseRule_closure1: function _EvaluateVisitor_visitUseRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWarnRule_closure1: function _EvaluateVisitor_visitWarnRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWhileRule_closure1: function _EvaluateVisitor_visitWhileRule_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitWhileRule__closure1: function _EvaluateVisitor_visitWhileRule__closure1(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitBinaryOperationExpression_closure1: function _EvaluateVisitor_visitBinaryOperationExpression_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitVariableExpression_closure1: function _EvaluateVisitor_visitVariableExpression_closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitListExpression_closure1: function _EvaluateVisitor_visitListExpression_closure1(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitFunctionExpression_closure3: function _EvaluateVisitor_visitFunctionExpression_closure3(t0, t1, t2) {
+      this.$this = t0;
+      this.node = t1;
+      this.plainName = t2;
+    },
+    _EvaluateVisitor_visitFunctionExpression_closure4: function _EvaluateVisitor_visitFunctionExpression_closure4(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor__runUserDefinedCallable_closure1: function _EvaluateVisitor__runUserDefinedCallable_closure1(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.callable = t1;
+      _.evaluated = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable__closure1: function _EvaluateVisitor__runUserDefinedCallable__closure1(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.evaluated = t1;
+      _.callable = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable___closure1: function _EvaluateVisitor__runUserDefinedCallable___closure1(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.$this = t0;
+      _.evaluated = t1;
+      _.callable = t2;
+      _.nodeWithSpan = t3;
+      _.run = t4;
+    },
+    _EvaluateVisitor__runUserDefinedCallable____closure1: function _EvaluateVisitor__runUserDefinedCallable____closure1() {
+    },
+    _EvaluateVisitor__runFunctionCallable_closure1: function _EvaluateVisitor__runFunctionCallable_closure1(t0, t1) {
+      this.$this = t0;
+      this.callable = t1;
+    },
+    _EvaluateVisitor__runBuiltInCallable_closure3: function _EvaluateVisitor__runBuiltInCallable_closure3(t0, t1, t2) {
+      this.overload = t0;
+      this.evaluated = t1;
+      this.namedSet = t2;
+    },
+    _EvaluateVisitor__runBuiltInCallable_closure4: function _EvaluateVisitor__runBuiltInCallable_closure4() {
+    },
+    _EvaluateVisitor__evaluateArguments_closure1: function _EvaluateVisitor__evaluateArguments_closure1(t0, t1, t2) {
+      this.named = t0;
+      this.namedNodes = t1;
+      this.restNodeForSpan = t2;
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure7: function _EvaluateVisitor__evaluateMacroArguments_closure7() {
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure8: function _EvaluateVisitor__evaluateMacroArguments_closure8() {
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure9: function _EvaluateVisitor__evaluateMacroArguments_closure9(t0) {
+      this.named = t0;
+    },
+    _EvaluateVisitor__evaluateMacroArguments_closure10: function _EvaluateVisitor__evaluateMacroArguments_closure10() {
+    },
+    _EvaluateVisitor__addRestMap_closure3: function _EvaluateVisitor__addRestMap_closure3(t0) {
+      this.T = t0;
+    },
+    _EvaluateVisitor__addRestMap_closure4: function _EvaluateVisitor__addRestMap_closure4(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _._box_0 = t0;
+      _.$this = t1;
+      _.values = t2;
+      _.map = t3;
+      _.nodeWithSpan = t4;
+    },
+    _EvaluateVisitor__verifyArguments_closure1: function _EvaluateVisitor__verifyArguments_closure1(t0, t1, t2) {
+      this.$arguments = t0;
+      this.positional = t1;
+      this.named = t2;
+    },
+    _EvaluateVisitor_visitStringExpression_closure1: function _EvaluateVisitor_visitStringExpression_closure1(t0) {
+      this.$this = t0;
+    },
+    _EvaluateVisitor_visitCssAtRule_closure3: function _EvaluateVisitor_visitCssAtRule_closure3(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssAtRule_closure4: function _EvaluateVisitor_visitCssAtRule_closure4() {
+    },
+    _EvaluateVisitor_visitCssKeyframeBlock_closure3: function _EvaluateVisitor_visitCssKeyframeBlock_closure3(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssKeyframeBlock_closure4: function _EvaluateVisitor_visitCssKeyframeBlock_closure4() {
+    },
+    _EvaluateVisitor_visitCssMediaRule_closure3: function _EvaluateVisitor_visitCssMediaRule_closure3(t0, t1, t2) {
+      this.$this = t0;
+      this.mergedQueries = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitCssMediaRule__closure1: function _EvaluateVisitor_visitCssMediaRule__closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssMediaRule___closure1: function _EvaluateVisitor_visitCssMediaRule___closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssMediaRule_closure4: function _EvaluateVisitor_visitCssMediaRule_closure4(t0) {
+      this.mergedQueries = t0;
+    },
+    _EvaluateVisitor_visitCssStyleRule_closure3: function _EvaluateVisitor_visitCssStyleRule_closure3(t0, t1, t2) {
+      this.$this = t0;
+      this.rule = t1;
+      this.node = t2;
+    },
+    _EvaluateVisitor_visitCssStyleRule__closure1: function _EvaluateVisitor_visitCssStyleRule__closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssStyleRule_closure4: function _EvaluateVisitor_visitCssStyleRule_closure4() {
+    },
+    _EvaluateVisitor_visitCssSupportsRule_closure3: function _EvaluateVisitor_visitCssSupportsRule_closure3(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssSupportsRule__closure1: function _EvaluateVisitor_visitCssSupportsRule__closure1(t0, t1) {
+      this.$this = t0;
+      this.node = t1;
+    },
+    _EvaluateVisitor_visitCssSupportsRule_closure4: function _EvaluateVisitor_visitCssSupportsRule_closure4() {
+    },
+    _EvaluateVisitor__performInterpolation_closure1: function _EvaluateVisitor__performInterpolation_closure1(t0, t1) {
+      this.$this = t0;
+      this.warnForColor = t1;
+    },
+    _EvaluateVisitor__serialize_closure1: function _EvaluateVisitor__serialize_closure1(t0, t1) {
+      this.value = t0;
+      this.quote = t1;
+    },
+    _EvaluateVisitor__stackTrace_closure1: function _EvaluateVisitor__stackTrace_closure1(t0) {
+      this.$this = t0;
+    },
+    _ImportedCssVisitor1: function _ImportedCssVisitor1(t0) {
+      this._evaluate0$_visitor = t0;
+    },
+    _ImportedCssVisitor_visitCssAtRule_closure1: function _ImportedCssVisitor_visitCssAtRule_closure1() {
+    },
+    _ImportedCssVisitor_visitCssMediaRule_closure1: function _ImportedCssVisitor_visitCssMediaRule_closure1(t0) {
+      this.hasBeenMerged = t0;
+    },
+    _ImportedCssVisitor_visitCssStyleRule_closure1: function _ImportedCssVisitor_visitCssStyleRule_closure1() {
+    },
+    _ImportedCssVisitor_visitCssSupportsRule_closure1: function _ImportedCssVisitor_visitCssSupportsRule_closure1() {
+    },
+    _ArgumentResults1: function _ArgumentResults1(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.positional = t0;
+      _.positionalNodes = t1;
+      _.named = t2;
+      _.namedNodes = t3;
+      _.separator = t4;
+    },
+    ForwardedModuleView_ifNecessary0: function(inner, rule, $T) {
+      var t1;
+      if (rule.prefix == null)
+        if (rule.shownMixinsAndFunctions == null)
+          if (rule.shownVariables == null) {
+            t1 = rule.hiddenMixinsAndFunctions;
+            if (t1 != null) {
+              t1 = t1._base;
+              t1 = t1.get$isEmpty(t1);
+            } else
+              t1 = true;
+            if (t1) {
+              t1 = rule.hiddenVariables;
+              if (t1 != null) {
+                t1 = t1._base;
+                t1 = t1.get$isEmpty(t1);
+              } else
+                t1 = true;
+            } else
+              t1 = false;
+          } else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      if (t1)
+        return inner;
+      else
+        return R.ForwardedModuleView$0(inner, rule, $T._eval$1("0*"));
+    },
+    ForwardedModuleView$0: function(_inner, _rule, $T) {
+      var t5, t6,
+        t1 = _rule.prefix,
+        t2 = _rule.shownVariables,
+        t3 = _rule.hiddenVariables,
+        t4 = R.ForwardedModuleView__forwardedMap0(_inner.get$variables(), t1, t2, t3, type$.legacy_Value_2);
+      t2 = _inner.get$variableNodes() == null ? null : R.ForwardedModuleView__forwardedMap0(_inner.get$variableNodes(), t1, t2, t3, type$.legacy_AstNode_2);
+      t3 = _rule.shownMixinsAndFunctions;
+      t5 = _rule.hiddenMixinsAndFunctions;
+      t6 = $T._eval$1("0*");
+      return new R.ForwardedModuleView0(_inner, _rule, t4, t2, R.ForwardedModuleView__forwardedMap0(_inner.get$functions(_inner), t1, t3, t5, t6), R.ForwardedModuleView__forwardedMap0(_inner.get$mixins(), t1, t3, t5, t6), $T._eval$1("ForwardedModuleView0<0>"));
+    },
+    ForwardedModuleView__forwardedMap0: function(map, prefix, safelist, blocklist, $V) {
+      var t2,
+        t1 = prefix == null;
+      if (t1)
+        if (safelist == null)
+          if (blocklist != null) {
+            t2 = blocklist._base;
+            t2 = t2.get$isEmpty(t2);
+          } else
+            t2 = true;
+        else
+          t2 = false;
+      else
+        t2 = false;
+      if (t2)
+        return map;
+      if (!t1)
+        map = new F.PrefixedMapView0(map, prefix, $V._eval$1("PrefixedMapView0<0*>"));
+      if (safelist != null)
+        map = new K.LimitedMapView0(map, safelist._base.intersection$1(new M.MapKeySet(map, type$.MapKeySet_legacy_Object)), type$.$env_1_1_legacy_String._bind$1($V._eval$1("0*"))._eval$1("LimitedMapView0<1,2>"));
+      else {
+        if (blocklist != null) {
+          t1 = blocklist._base;
+          t1 = t1.get$isNotEmpty(t1);
+        } else
+          t1 = false;
+        if (t1)
+          map = K.LimitedMapView$blocklist0(map, blocklist, type$.legacy_String, $V._eval$1("0*"));
+      }
+      return map;
+    },
+    ForwardedModuleView0: function ForwardedModuleView0(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _._forwarded_view0$_inner = t0;
+      _._forwarded_view0$_rule = t1;
+      _.variables = t2;
+      _.variableNodes = t3;
+      _.functions = t4;
+      _.mixins = t5;
+      _.$ti = t6;
+    },
+    ImportCache$none: function(logger) {
+      var t1 = type$.legacy_Uri;
+      return new R.ImportCache0(C.C_StderrLogger, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Tuple2_of_legacy_Uri_and_legacy_bool, type$.legacy_Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri_2), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Stylesheet), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_ImporterResult));
+    },
+    ImportCache0: function ImportCache0(t0, t1, t2, t3) {
+      var _ = this;
+      _._import_cache$_logger = t0;
+      _._import_cache$_canonicalizeCache = t1;
+      _._import_cache$_importCache = t2;
+      _._import_cache$_resultsCache = t3;
+    },
+    ImportCache_canonicalize_closure0: function ImportCache_canonicalize_closure0(t0, t1, t2) {
+      this.$this = t0;
+      this.url = t1;
+      this.forImport = t2;
+    },
+    ImportCache__canonicalize_closure0: function ImportCache__canonicalize_closure0(t0, t1) {
+      this.importer = t0;
+      this.url = t1;
+    },
+    ImportCache_importCanonical_closure0: function ImportCache_importCanonical_closure0(t0, t1, t2, t3) {
+      var _ = this;
+      _.$this = t0;
+      _.importer = t1;
+      _.canonicalUrl = t2;
+      _.originalUrl = t3;
+    },
+    ImportCache_humanize_closure2: function ImportCache_humanize_closure2(t0) {
+      this.canonicalUrl = t0;
+    },
+    ImportCache_humanize_closure3: function ImportCache_humanize_closure3() {
+    },
+    ImportCache_humanize_closure4: function ImportCache_humanize_closure4() {
+    },
+    RenderOptions: function RenderOptions() {
+    },
+    _translateReturnValue: function(val) {
+      if (type$.legacy_Future_dynamic._is(val))
+        return M.futureToPromise(val);
+      else
+        return val;
+    },
+    main0: function() {
+      new Uint8Array(0);
+      J.set$render$x(self.exports, P.allowInterop(B.node___render$closure()));
+      J.set$renderSync$x(self.exports, P.allowInterop(B.node___renderSync$closure()));
+      J.set$info$x(self.exports, "dart-sass\t1.32.8\t(Sass Compiler)\t[Dart]\ndart2js\t2.10.5\t(Dart Compiler)\t[Dart]");
+      J.set$types$x(self.exports, {Boolean: $.$get$booleanConstructor(), Color: $.$get$colorConstructor(), List: $.$get$listConstructor(), Map: $.$get$mapConstructor(), Null: $.$get$nullConstructor(), Number: $.$get$numberConstructor(), String: $.$get$stringConstructor(), Error: self.Error});
+      J.set$NULL$x(self.exports, C.C_SassNull);
+      J.set$TRUE$x(self.exports, C.SassBoolean_true);
+      J.set$FALSE$x(self.exports, C.SassBoolean_false);
+      J.set$cli_pkg_main_0_$x(self.exports, R._wrapMain(U.sass__main$closure()));
+    },
+    _wrapMain: function(main) {
+      if (type$.legacy_legacy_Object_Function._is(main))
+        return P.allowInterop(new R._wrapMain_closure(main));
+      else
+        return P.allowInterop(new R._wrapMain_closure0(main));
+    },
+    _Exports: function _Exports() {
+    },
+    _wrapMain_closure: function _wrapMain_closure(t0) {
+      this.main = t0;
+    },
+    _wrapMain_closure0: function _wrapMain_closure0(t0) {
+      this.main = t0;
+    },
+    UnprefixedMapView0: function UnprefixedMapView0(t0, t1, t2) {
+      this._unprefixed_map_view0$_map = t0;
+      this._unprefixed_map_view0$_prefix = t1;
+      this.$ti = t2;
+    },
+    _UnprefixedKeys0: function _UnprefixedKeys0(t0) {
+      this._unprefixed_map_view0$_view = t0;
+    },
+    _UnprefixedKeys_iterator_closure1: function _UnprefixedKeys_iterator_closure1(t0) {
+      this.$this = t0;
+    },
+    _UnprefixedKeys_iterator_closure2: function _UnprefixedKeys_iterator_closure2(t0) {
+      this.$this = t0;
+    }
+  },
+  A = {MapExpression: function MapExpression(t0, t1) {
+      this.pairs = t0;
+      this.span = t1;
+    }, MapExpression_toString_closure: function MapExpression_toString_closure() {
+    }, IncludeRule: function IncludeRule(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.namespace = t0;
+      _.name = t1;
+      _.$arguments = t2;
+      _.content = t3;
+      _.span = t4;
+    }, Configuration: function Configuration(t0, t1, t2) {
+      this._values = t0;
+      this.nodeWithSpan = t1;
+      this.isImplicit = t2;
+    },
+    watch: function(options, graph) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, t2, t3, t4, t5, t6, dirWatcher, watcher, destination, t1;
+      var $async$watch = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+              for (options._ensureSources$0(), t2 = options._sourceDirectoriesToDestinations, t2 = J.get$iterator$ax(t2.get$keys(t2)); t2.moveNext$0();)
+                t1.push(t2.get$current(t2));
+              for (options._ensureSources$0(), t2 = options._sourcesToDestinations, t3 = type$.legacy_String, t2 = J.map$1$1$ax(t2.get$keys(t2), D.path__dirname$closure(), t3), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+                t1.push(t2.get$current(t2));
+              for (t2 = options._options, t4 = J.get$iterator$ax(type$.legacy_List_legacy_String._as(t2.$index(0, "load-path"))); t4.moveNext$0();)
+                t1.push(t4.get$current(t4));
+              t4 = H._asBoolS(t2.$index(0, "poll"));
+              t5 = type$.legacy_Stream_legacy_WatchEvent;
+              t6 = new L.StreamGroup(C._StreamGroupState_dormant, P.LinkedHashMap_LinkedHashMap$_empty(t5, type$.legacy_StreamSubscription_legacy_WatchEvent), type$.StreamGroup_legacy_WatchEvent);
+              t6._controller = P.StreamController_StreamController(t6.get$_onCancel(), t6.get$_onListen(), t6.get$_onPause(), t6.get$_onResume(), true, type$.legacy_WatchEvent);
+              dirWatcher = new U.MultiDirWatcher(P.LinkedHashMap_LinkedHashMap$_empty(t3, t5), t6, t4);
+              $async$goto = 3;
+              return P._asyncAwait(P.Future_wait(new H.MappedListIterable(t1, new A.watch_closure(dirWatcher), type$.MappedListIterable_of_legacy_String_and_legacy_Future_void), type$.void), $async$watch);
+            case 3:
+              // returning from await.
+              watcher = new A._Watcher(options, graph);
+              options._ensureSources$0(), t1 = options._sourcesToDestinations, t1 = J.get$iterator$ax(t1.get$keys(t1));
+            case 4:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              t3 = t1.get$current(t1);
+              options._ensureSources$0();
+              destination = options._sourcesToDestinations.$index(0, t3);
+              t4 = $.$get$context();
+              t5 = t4.absolute$7(".", null, null, null, null, null, null);
+              graph.addCanonical$4$recanonicalize(new F.FilesystemImporter(t5), t4.toUri$1(J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin") ? F._realCasePath(t4.absolute$7(t4.normalize$1(t3), null, null, null, null, null, null)) : t4.canonicalize$1(t3)), t4.toUri$1(t3), false);
+              $async$goto = 6;
+              return P._asyncAwait(watcher.compile$3$ifModified(t3, destination, true), $async$watch);
+            case 6:
+              // returning from await.
+              if (!$async$result && H._asBoolS(t2.$index(0, "stop-on-error"))) {
+                t1 = dirWatcher._group._controller;
+                t1._subscribe$4(null, null, null, false).cancel$0();
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              // goto for condition
+              $async$goto = 4;
+              break;
+            case 5:
+              // after for
+              P.print("Sass is watching for changes. Press Ctrl-C to stop.\n");
+              $async$goto = 7;
+              return P._asyncAwait(watcher.watch$1(0, dirWatcher), $async$watch);
+            case 7:
+              // returning from await.
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$watch, $async$completer);
+    },
+    watch_closure: function watch_closure(t0) {
+      this.dirWatcher = t0;
+    },
+    _Watcher: function _Watcher(t0, t1) {
+      this._watch$_options = t0;
+      this._graph = t1;
+    },
+    _Watcher__debounceEvents_closure: function _Watcher__debounceEvents_closure() {
+    },
+    _Watcher__debounceEvents__closure: function _Watcher__debounceEvents__closure(t0) {
+      this.typeForPath = t0;
+    },
+    MergedExtension_merge: function(left, right) {
+      var t2, t3, t4,
+        t1 = left.extender;
+      if (!J.$eq$(t1, right.extender) || !J.$eq$(left.target, right.target))
+        throw H.wrapException(P.ArgumentError$(left.toString$0(0) + " and " + right.toString$0(0) + " aren't the same extension."));
+      t2 = left.mediaContext;
+      t3 = t2 == null;
+      if (!t3) {
+        t4 = right.mediaContext;
+        t4 = t4 != null && !C.C_ListEquality.equals$2(0, t2, t4);
+      } else
+        t4 = false;
+      if (t4)
+        throw H.wrapException(E.SassException$("From " + left.span.message$1(0, "") + string$.x0aYou_m, right.span));
+      if (right.isOptional && right.mediaContext == null)
+        return left;
+      if (left.isOptional && t3)
+        return right;
+      if (t3)
+        t2 = right.mediaContext;
+      t3 = left.specificity;
+      if (t3 == null)
+        t3 = t1.get$maxSpecificity();
+      return new A.MergedExtension(left, right, t1, left.target, t3, true, false, t2, left.extenderSpan, left.span);
+    },
+    MergedExtension: function MergedExtension(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) {
+      var _ = this;
+      _.left = t0;
+      _.right = t1;
+      _.extender = t2;
+      _.target = t3;
+      _.specificity = t4;
+      _.isOptional = t5;
+      _.isOriginal = t6;
+      _.mediaContext = t7;
+      _.extenderSpan = t8;
+      _.span = t9;
+    },
+    _modify: function(map, keys, modify) {
+      var keyIterator = J.get$iterator$ax(keys);
+      return keyIterator.moveNext$0() ? new A._modify__modifyNestedMap(keyIterator, modify).call$1(map) : modify.call$1(map);
+    },
+    _deepMergeImpl: function(map1, map2) {
+      var t1 = {},
+        t2 = map2.contents;
+      if (t2.get$isEmpty(t2))
+        return map1;
+      t1.mutable = false;
+      t1.result = t2;
+      map1.contents.forEach$1(0, new A._deepMergeImpl_closure(t1, new A._deepMergeImpl__ensureMutable(t1)));
+      if (t1.mutable) {
+        t2 = type$.legacy_Value;
+        t2 = new A.SassMap(H.ConstantMap_ConstantMap$from(t1.result, t2, t2));
+        t1 = t2;
+      } else
+        t1 = map2;
+      return t1;
+    },
+    _function2: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function($name, $arguments, callback, "sass:map");
+    },
+    closure34: function closure34() {
+    },
+    closure97: function closure97() {
+    },
+    _closure12: function _closure12(t0) {
+      this.$arguments = t0;
+    },
+    closure98: function closure98() {
+    },
+    _closure11: function _closure11(t0) {
+      this.args = t0;
+    },
+    closure32: function closure32() {
+    },
+    closure33: function closure33() {
+    },
+    _closure4: function _closure4(t0) {
+      this.map2 = t0;
+    },
+    closure96: function closure96() {
+    },
+    closure95: function closure95() {
+    },
+    _closure10: function _closure10(t0) {
+      this.keys = t0;
+    },
+    closure30: function closure30() {
+    },
+    closure31: function closure31() {
+    },
+    closure29: function closure29() {
+    },
+    closure28: function closure28() {
+    },
+    closure27: function closure27() {
+    },
+    _modify__modifyNestedMap: function _modify__modifyNestedMap(t0, t1) {
+      this.keyIterator = t0;
+      this.modify = t1;
+    },
+    _deepMergeImpl__ensureMutable: function _deepMergeImpl__ensureMutable(t0) {
+      this._box_0 = t0;
+    },
+    _deepMergeImpl_closure: function _deepMergeImpl_closure(t0, t1) {
+      this._box_0 = t0;
+      this._ensureMutable = t1;
+    },
+    SassMap: function SassMap(t0) {
+      this.contents = t0;
+    },
+    SassMap_asList_closure: function SassMap_asList_closure(t0) {
+      this.result = t0;
+    },
+    Frame_Frame$parseVM: function(frame) {
+      return A.Frame__catchFormatException(frame, new A.Frame_Frame$parseVM_closure(frame));
+    },
+    Frame_Frame$parseV8: function(frame) {
+      return A.Frame__catchFormatException(frame, new A.Frame_Frame$parseV8_closure(frame));
+    },
+    Frame_Frame$_parseFirefoxEval: function(frame) {
+      return A.Frame__catchFormatException(frame, new A.Frame_Frame$_parseFirefoxEval_closure(frame));
+    },
+    Frame_Frame$parseFirefox: function(frame) {
+      return A.Frame__catchFormatException(frame, new A.Frame_Frame$parseFirefox_closure(frame));
+    },
+    Frame_Frame$parseFriendly: function(frame) {
+      return A.Frame__catchFormatException(frame, new A.Frame_Frame$parseFriendly_closure(frame));
+    },
+    Frame__uriOrPathToUri: function(uriOrPath) {
+      if (J.getInterceptor$asx(uriOrPath).contains$1(uriOrPath, $.$get$Frame__uriRegExp()))
+        return P.Uri_parse(uriOrPath);
+      else if (C.JSString_methods.contains$1(uriOrPath, $.$get$Frame__windowsRegExp()))
+        return P._Uri__Uri$file(uriOrPath, true);
+      else if (C.JSString_methods.startsWith$1(uriOrPath, "/"))
+        return P._Uri__Uri$file(uriOrPath, false);
+      if (C.JSString_methods.contains$1(uriOrPath, "\\"))
+        return $.$get$windows().toUri$1(uriOrPath);
+      return P.Uri_parse(uriOrPath);
+    },
+    Frame__catchFormatException: function(text, body) {
+      var t1, exception;
+      try {
+        t1 = body.call$0();
+        return t1;
+      } catch (exception) {
+        if (type$.legacy_FormatException._is(H.unwrapException(exception)))
+          return new N.UnparsedFrame(P._Uri__Uri(null, "unparsed", null, null), text);
+        else
+          throw exception;
+      }
+    },
+    Frame: function Frame(t0, t1, t2, t3) {
+      var _ = this;
+      _.uri = t0;
+      _.line = t1;
+      _.column = t2;
+      _.member = t3;
+    },
+    Frame_Frame$parseVM_closure: function Frame_Frame$parseVM_closure(t0) {
+      this.frame = t0;
+    },
+    Frame_Frame$parseV8_closure: function Frame_Frame$parseV8_closure(t0) {
+      this.frame = t0;
+    },
+    Frame_Frame$parseV8_closure_parseLocation: function Frame_Frame$parseV8_closure_parseLocation(t0) {
+      this.frame = t0;
+    },
+    Frame_Frame$_parseFirefoxEval_closure: function Frame_Frame$_parseFirefoxEval_closure(t0) {
+      this.frame = t0;
+    },
+    Frame_Frame$parseFirefox_closure: function Frame_Frame$parseFirefox_closure(t0) {
+      this.frame = t0;
+    },
+    Frame_Frame$parseFriendly_closure: function Frame_Frame$parseFriendly_closure(t0) {
+      this.frame = t0;
+    },
+    AsciiGlyphSet: function AsciiGlyphSet() {
+    },
+    Configuration0: function Configuration0(t0, t1, t2) {
+      this._configuration$_values = t0;
+      this.nodeWithSpan = t1;
+      this.isImplicit = t2;
+    },
+    IncludeRule0: function IncludeRule0(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.namespace = t0;
+      _.name = t1;
+      _.$arguments = t2;
+      _.content = t3;
+      _.span = t4;
+    },
+    MapExpression0: function MapExpression0(t0, t1) {
+      this.pairs = t0;
+      this.span = t1;
+    },
+    MapExpression_toString_closure0: function MapExpression_toString_closure0() {
+    },
+    _modify0: function(map, keys, modify) {
+      var keyIterator = J.get$iterator$ax(keys);
+      return keyIterator.moveNext$0() ? new A._modify__modifyNestedMap0(keyIterator, modify).call$1(map) : modify.call$1(map);
+    },
+    _deepMergeImpl0: function(map1, map2) {
+      var t1 = {},
+        t2 = map2.contents;
+      if (t2.get$isEmpty(t2))
+        return map1;
+      t1.mutable = false;
+      t1.result = t2;
+      map1.contents.forEach$1(0, new A._deepMergeImpl_closure0(t1, new A._deepMergeImpl__ensureMutable0(t1)));
+      if (t1.mutable) {
+        t2 = type$.legacy_Value_2;
+        t2 = new A.SassMap0(H.ConstantMap_ConstantMap$from(t1.result, t2, t2));
+        t1 = t2;
+      } else
+        t1 = map2;
+      return t1;
+    },
+    _function9: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function0($name, $arguments, callback, "sass:map");
+    },
+    closure149: function closure149() {
+    },
+    closure212: function closure212() {
+    },
+    _closure27: function _closure27(t0) {
+      this.$arguments = t0;
+    },
+    closure213: function closure213() {
+    },
+    _closure26: function _closure26(t0) {
+      this.args = t0;
+    },
+    closure147: function closure147() {
+    },
+    closure148: function closure148() {
+    },
+    _closure19: function _closure19(t0) {
+      this.map2 = t0;
+    },
+    closure211: function closure211() {
+    },
+    closure210: function closure210() {
+    },
+    _closure25: function _closure25(t0) {
+      this.keys = t0;
+    },
+    closure145: function closure145() {
+    },
+    closure146: function closure146() {
+    },
+    closure144: function closure144() {
+    },
+    closure143: function closure143() {
+    },
+    closure142: function closure142() {
+    },
+    _modify__modifyNestedMap0: function _modify__modifyNestedMap0(t0, t1) {
+      this.keyIterator = t0;
+      this.modify = t1;
+    },
+    _deepMergeImpl__ensureMutable0: function _deepMergeImpl__ensureMutable0(t0) {
+      this._box_0 = t0;
+    },
+    _deepMergeImpl_closure0: function _deepMergeImpl_closure0(t0, t1) {
+      this._box_0 = t0;
+      this._ensureMutable = t1;
+    },
+    _NodeSassMap: function _NodeSassMap() {
+    },
+    closure239: function closure239() {
+    },
+    _closure31: function _closure31() {
+    },
+    _closure32: function _closure32() {
+    },
+    closure240: function closure240() {
+    },
+    closure241: function closure241() {
+    },
+    closure242: function closure242() {
+    },
+    closure243: function closure243() {
+    },
+    closure244: function closure244() {
+    },
+    closure245: function closure245() {
+    },
+    SassMap0: function SassMap0(t0) {
+      this.contents = t0;
+    },
+    SassMap_asList_closure0: function SassMap_asList_closure0(t0) {
+      this.result = t0;
+    },
+    MergedExtension_merge0: function(left, right) {
+      var t2, t3, t4,
+        t1 = left.extender;
+      if (!J.$eq$(t1, right.extender) || !J.$eq$(left.target, right.target))
+        throw H.wrapException(P.ArgumentError$(left.toString$0(0) + " and " + right.toString$0(0) + " aren't the same extension."));
+      t2 = left.mediaContext;
+      t3 = t2 == null;
+      if (!t3) {
+        t4 = right.mediaContext;
+        t4 = t4 != null && !C.C_ListEquality.equals$2(0, t2, t4);
+      } else
+        t4 = false;
+      if (t4)
+        throw H.wrapException(E.SassException$0("From " + left.span.message$1(0, "") + string$.x0aYou_m, right.span));
+      if (right.isOptional && right.mediaContext == null)
+        return left;
+      if (left.isOptional && t3)
+        return right;
+      if (t3)
+        t2 = right.mediaContext;
+      t3 = left.specificity;
+      if (t3 == null)
+        t3 = t1.get$maxSpecificity();
+      return new A.MergedExtension0(left, right, t1, left.target, t3, true, false, t2, left.extenderSpan, left.span);
+    },
+    MergedExtension0: function MergedExtension0(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) {
+      var _ = this;
+      _.left = t0;
+      _.right = t1;
+      _.extender = t2;
+      _.target = t3;
+      _.specificity = t4;
+      _.isOptional = t5;
+      _.isOriginal = t6;
+      _.mediaContext = t7;
+      _.extenderSpan = t8;
+      _.span = t9;
+    },
+    _combine: function(hash, value) {
+      hash = 536870911 & hash + value;
+      hash = 536870911 & hash + ((524287 & hash) << 10);
+      return hash ^ hash >>> 6;
+    },
+    _finish: function(hash) {
+      hash = 536870911 & hash + ((67108863 & hash) << 3);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15);
+    }
+  },
+  T = {NumberExpression: function NumberExpression(t0, t1, t2) {
+      this.value = t0;
+      this.unit = t1;
+      this.span = t2;
+    }, ParenthesizedExpression: function ParenthesizedExpression(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    }, SelectorExpression: function SelectorExpression(t0) {
+      this.span = t0;
+    },
+    MixinRule$: function($name, $arguments, children, span, comment, hasContent) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure());
+      return new T.MixinRule(hasContent, $name, $arguments, span, t1, t2);
+    },
+    MixinRule: function MixinRule(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.hasContent = t0;
+      _.name = t1;
+      _.$arguments = t2;
+      _.span = t3;
+      _.children = t4;
+      _.hasDeclarations = t5;
+    },
+    UseRule: function UseRule(t0, t1, t2, t3) {
+      var _ = this;
+      _.url = t0;
+      _.namespace = t1;
+      _.configuration = t2;
+      _.span = t3;
+    },
+    Selector: function Selector() {
+    },
+    EmptyExtender: function EmptyExtender() {
+    },
+    _prependParent: function(compound) {
+      var t2, t3, cur, _i, _null = null,
+        t1 = compound.components,
+        first = C.JSArray_methods.get$first(t1);
+      if (first instanceof N.UniversalSelector)
+        return _null;
+      if (first instanceof F.TypeSelector) {
+        t2 = first.name;
+        if (t2.namespace != null)
+          return _null;
+        t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector);
+        t3.push(new M.ParentSelector(t2.name));
+        for (t1 = H.SubListIterable$(t1, 1, _null, H._arrayInstanceType(t1)._precomputed1), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          t3.push(cur);
+        }
+        return X.CompoundSelector$(t3);
+      } else {
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector);
+        t2.push(new M.ParentSelector(_null));
+        for (t3 = t1.length, _i = 0; _i < t3; ++_i)
+          t2.push(t1[_i]);
+        return X.CompoundSelector$(t2);
+      }
+    },
+    _function0: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function($name, $arguments, callback, "sass:selector");
+    },
+    closure13: function closure13() {
+    },
+    _closure1: function _closure1(t0) {
+      this._box_0 = t0;
+    },
+    _closure2: function _closure2() {
+    },
+    closure12: function closure12() {
+    },
+    _closure: function _closure() {
+    },
+    _closure0: function _closure0() {
+    },
+    __closure: function __closure(t0) {
+      this.parent = t0;
+    },
+    closure11: function closure11() {
+    },
+    closure10: function closure10() {
+    },
+    closure9: function closure9() {
+    },
+    closure16: function closure16() {
+    },
+    closure15: function closure15() {
+    },
+    _closure3: function _closure3() {
+    },
+    closure14: function closure14() {
+    },
+    TrackingLogger: function TrackingLogger(t0) {
+      this._tracking$_logger = t0;
+      this._emittedDebug = this._emittedWarning = false;
+    },
+    SelectorParser$: function(contents, allowParent, allowPlaceholder, logger, url) {
+      var t1 = S.SpanScanner$(contents, url);
+      return new T.SelectorParser(allowParent, allowPlaceholder, t1, logger == null ? C.StderrLogger_false : logger);
+    },
+    SelectorParser: function SelectorParser(t0, t1, t2, t3) {
+      var _ = this;
+      _._allowParent = t0;
+      _._allowPlaceholder = t1;
+      _.scanner = t2;
+      _.logger = t3;
+    },
+    SelectorParser_parse_closure: function SelectorParser_parse_closure(t0) {
+      this.$this = t0;
+    },
+    SelectorParser_parseCompoundSelector_closure: function SelectorParser_parseCompoundSelector_closure(t0) {
+      this.$this = t0;
+    },
+    SassNumber_SassNumber: function(value, unit) {
+      return unit == null ? new N.UnitlessSassNumber(value, null) : new L.SingleUnitSassNumber(unit, value, null);
+    },
+    SassNumber_SassNumber$withUnits: function(value, denominatorUnits, numeratorUnits) {
+      var t2, t3,
+        t1 = J.getInterceptor$asx(numeratorUnits),
+        emptyNumerator = t1.get$isEmpty(numeratorUnits),
+        emptyDenominator = denominatorUnits == null || J.get$isEmpty$asx(denominatorUnits);
+      if (emptyNumerator && emptyDenominator)
+        return new N.UnitlessSassNumber(value, null);
+      if (emptyDenominator && t1.get$length(numeratorUnits) === 1)
+        return new L.SingleUnitSassNumber(t1.$index(numeratorUnits, 0), value, null);
+      else {
+        t1 = emptyNumerator ? C.List_empty : P.List_List$unmodifiable(numeratorUnits, type$.legacy_String);
+        t2 = emptyDenominator ? C.List_empty : P.List_List$unmodifiable(denominatorUnits, type$.legacy_String);
+        t3 = type$.legacy_String;
+        return new S.ComplexSassNumber(P.List_List$unmodifiable(t1, t3), P.List_List$unmodifiable(t2, t3), value, null);
+      }
+    },
+    SassNumber: function SassNumber() {
+    },
+    SassNumber__coerceOrConvertValue__compatibilityException: function SassNumber__coerceOrConvertValue__compatibilityException(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.$this = t0;
+      _.other = t1;
+      _.otherName = t2;
+      _.otherHasUnits = t3;
+      _.name = t4;
+      _.newNumerators = t5;
+      _.newDenominators = t6;
+    },
+    SassNumber__coerceOrConvertValue_closure: function SassNumber__coerceOrConvertValue_closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.newNumerator = t2;
+    },
+    SassNumber__coerceOrConvertValue_closure0: function SassNumber__coerceOrConvertValue_closure0(t0) {
+      this._compatibilityException = t0;
+    },
+    SassNumber__coerceOrConvertValue_closure1: function SassNumber__coerceOrConvertValue_closure1(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.newDenominator = t2;
+    },
+    SassNumber__coerceOrConvertValue_closure2: function SassNumber__coerceOrConvertValue_closure2(t0) {
+      this._compatibilityException = t0;
+    },
+    SassNumber_plus_closure: function SassNumber_plus_closure() {
+    },
+    SassNumber_minus_closure: function SassNumber_minus_closure() {
+    },
+    SassNumber_multiplyUnits_closure: function SassNumber_multiplyUnits_closure(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.numerator = t2;
+    },
+    SassNumber_multiplyUnits_closure0: function SassNumber_multiplyUnits_closure0(t0, t1) {
+      this.newNumerators = t0;
+      this.numerator = t1;
+    },
+    SassNumber_multiplyUnits_closure1: function SassNumber_multiplyUnits_closure1(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.numerator = t2;
+    },
+    SassNumber_multiplyUnits_closure2: function SassNumber_multiplyUnits_closure2(t0, t1) {
+      this.newNumerators = t0;
+      this.numerator = t1;
+    },
+    SassNumber__areAnyConvertible_closure: function SassNumber__areAnyConvertible_closure(t0, t1) {
+      this.$this = t0;
+      this.units2 = t1;
+    },
+    SassNumber__canonicalizeUnitList_closure: function SassNumber__canonicalizeUnitList_closure() {
+    },
+    SassNumber__canonicalMultiplier_closure: function SassNumber__canonicalMultiplier_closure(t0) {
+      this.$this = t0;
+    },
+    SingleMapping_SingleMapping$fromEntries: function(entries) {
+      var lines, t2, t3, urls, names, t4, files, t5, targetEntries, lineNum, _i, sourceEntry, sourceUrl, t6, urlId, _null = null,
+        t1 = type$.dynamic,
+        sourceEntries = P.List_List$from(entries, true, t1);
+      C.JSArray_methods.sort$0(sourceEntries);
+      lines = H.setRuntimeTypeInfo([], type$.JSArray_legacy_TargetLineEntry);
+      t2 = type$.legacy_String;
+      t3 = type$.legacy_int;
+      urls = P.LinkedHashMap_LinkedHashMap$_empty(t2, t3);
+      names = P.LinkedHashMap_LinkedHashMap$_empty(t2, t3);
+      t4 = type$.legacy_SourceFile;
+      files = P.LinkedHashMap_LinkedHashMap$_empty(t3, t4);
+      for (t3 = sourceEntries.length, t5 = type$.JSArray_legacy_TargetEntry, targetEntries = _null, lineNum = targetEntries, _i = 0; _i < sourceEntries.length; sourceEntries.length === t3 || (0, H.throwConcurrentModificationError)(sourceEntries), ++_i) {
+        sourceEntry = sourceEntries[_i];
+        if (lineNum == null || sourceEntry.get$target().get$line() > lineNum) {
+          lineNum = sourceEntry.get$target().get$line();
+          targetEntries = H.setRuntimeTypeInfo([], t5);
+          lines.push(new T.TargetLineEntry(lineNum, targetEntries));
+        }
+        if (sourceEntry.get$source() == null)
+          targetEntries.push(new T.TargetEntry(sourceEntry.get$target().get$column(), _null, _null, _null, _null));
+        else {
+          sourceUrl = J.get$sourceUrl$x(sourceEntry.get$source());
+          t6 = sourceUrl == null ? "" : sourceUrl.toString$0(0);
+          urlId = urls.putIfAbsent$2(t6, new T.SingleMapping_SingleMapping$fromEntries_closure(urls));
+          if (sourceEntry.get$source() instanceof Y.FileLocation)
+            files.putIfAbsent$2(urlId, new T.SingleMapping_SingleMapping$fromEntries_closure0(sourceEntry));
+          sourceEntry.get$identifierName();
+          targetEntries.push(new T.TargetEntry(sourceEntry.get$target().get$column(), urlId, sourceEntry.get$source().get$line(), sourceEntry.get$source().get$column(), _null));
+        }
+      }
+      t3 = urls.get$values(urls);
+      t4 = H.MappedIterable_MappedIterable(t3, new T.SingleMapping_SingleMapping$fromEntries_closure1(files), H._instanceType(t3)._eval$1("Iterable.E"), t4);
+      t4 = P.List_List$from(t4, true, H._instanceType(t4)._eval$1("Iterable.E"));
+      t3 = urls.get$keys(urls);
+      t3 = P.List_List$from(t3, true, H._instanceType(t3)._eval$1("Iterable.E"));
+      t5 = names.get$keys(names);
+      return new T.SingleMapping(t3, P.List_List$from(t5, true, H._instanceType(t5)._eval$1("Iterable.E")), t4, lines, _null, P.LinkedHashMap_LinkedHashMap$_empty(t2, t1));
+    },
+    Mapping: function Mapping() {
+    },
+    SingleMapping: function SingleMapping(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.urls = t0;
+      _.names = t1;
+      _.files = t2;
+      _.lines = t3;
+      _.targetUrl = t4;
+      _.sourceRoot = null;
+      _.extensions = t5;
+    },
+    SingleMapping_SingleMapping$fromEntries_closure: function SingleMapping_SingleMapping$fromEntries_closure(t0) {
+      this.urls = t0;
+    },
+    SingleMapping_SingleMapping$fromEntries_closure0: function SingleMapping_SingleMapping$fromEntries_closure0(t0) {
+      this.sourceEntry = t0;
+    },
+    SingleMapping_SingleMapping$fromEntries_closure1: function SingleMapping_SingleMapping$fromEntries_closure1(t0) {
+      this.files = t0;
+    },
+    SingleMapping_toJson_closure: function SingleMapping_toJson_closure() {
+    },
+    SingleMapping_toJson_closure0: function SingleMapping_toJson_closure0(t0) {
+      this.result = t0;
+    },
+    TargetLineEntry: function TargetLineEntry(t0, t1) {
+      this.line = t0;
+      this.entries = t1;
+    },
+    TargetEntry: function TargetEntry(t0, t1, t2, t3, t4) {
+      var _ = this;
+      _.column = t0;
+      _.sourceUrlId = t1;
+      _.sourceLine = t2;
+      _.sourceColumn = t3;
+      _.sourceNameId = t4;
+    },
+    LazyTrace: function LazyTrace(t0) {
+      this._thunk = t0;
+      this._lazy_trace$_inner = null;
+    },
+    LazyTrace_terse_closure: function LazyTrace_terse_closure(t0) {
+      this.$this = t0;
+    },
+    EmptyExtender0: function EmptyExtender0() {
+    },
+    MixinRule$0: function($name, $arguments, children, span, comment, hasContent) {
+      var t1 = P.List_List$unmodifiable(children, type$.legacy_Statement_2),
+        t2 = C.JSArray_methods.any$1(t1, new M.ParentStatement_closure0());
+      return new T.MixinRule0(hasContent, $name, $arguments, span, t1, t2);
+    },
+    MixinRule0: function MixinRule0(t0, t1, t2, t3, t4, t5) {
+      var _ = this;
+      _.hasContent = t0;
+      _.name = t1;
+      _.$arguments = t2;
+      _.span = t3;
+      _.children = t4;
+      _.hasDeclarations = t5;
+    },
+    NumberExpression0: function NumberExpression0(t0, t1, t2) {
+      this.value = t0;
+      this.unit = t1;
+      this.span = t2;
+    },
+    _parseNumber: function(value, unit) {
+      var invalidUnit, operands, t1, numerator, denominator, numeratorUnits, denominatorUnits;
+      if (unit == null || unit.length === 0)
+        return new N.UnitlessSassNumber0(value, null);
+      if (!J.getInterceptor$asx(unit).contains$1(unit, "*") && !C.JSString_methods.contains$1(unit, "/"))
+        return new L.SingleUnitSassNumber0(unit, value, null);
+      invalidUnit = new P.ArgumentError(true, unit, "unit", "is invalid.");
+      operands = unit.split("/");
+      t1 = operands.length;
+      if (t1 > 2)
+        throw H.wrapException(invalidUnit);
+      numerator = operands[0];
+      denominator = t1 === 1 ? null : operands[1];
+      numeratorUnits = numerator.length === 0 ? H.setRuntimeTypeInfo([], type$.JSArray_legacy_String) : H.setRuntimeTypeInfo(numerator.split("*"), type$.JSArray_String);
+      if (C.JSArray_methods.any$1(numeratorUnits, new T._parseNumber_closure()))
+        throw H.wrapException(invalidUnit);
+      denominatorUnits = denominator == null ? H.setRuntimeTypeInfo([], type$.JSArray_legacy_String) : H.setRuntimeTypeInfo(denominator.split("*"), type$.JSArray_String);
+      if (C.JSArray_methods.any$1(denominatorUnits, new T._parseNumber_closure0()))
+        throw H.wrapException(invalidUnit);
+      return T.SassNumber_SassNumber$withUnits0(value, denominatorUnits, numeratorUnits);
+    },
+    _NodeSassNumber: function _NodeSassNumber() {
+    },
+    closure232: function closure232() {
+    },
+    closure233: function closure233() {
+    },
+    closure234: function closure234() {
+    },
+    closure235: function closure235() {
+    },
+    closure236: function closure236() {
+    },
+    closure237: function closure237() {
+    },
+    _parseNumber_closure: function _parseNumber_closure() {
+    },
+    _parseNumber_closure0: function _parseNumber_closure0() {
+    },
+    SassNumber_SassNumber0: function(value, unit) {
+      return unit == null ? new N.UnitlessSassNumber0(value, null) : new L.SingleUnitSassNumber0(unit, value, null);
+    },
+    SassNumber_SassNumber$withUnits0: function(value, denominatorUnits, numeratorUnits) {
+      var t2, t3,
+        t1 = J.getInterceptor$asx(numeratorUnits),
+        emptyNumerator = t1.get$isEmpty(numeratorUnits),
+        emptyDenominator = denominatorUnits == null || J.get$isEmpty$asx(denominatorUnits);
+      if (emptyNumerator && emptyDenominator)
+        return new N.UnitlessSassNumber0(value, null);
+      if (emptyDenominator && t1.get$length(numeratorUnits) === 1)
+        return new L.SingleUnitSassNumber0(t1.$index(numeratorUnits, 0), value, null);
+      else {
+        t1 = emptyNumerator ? C.List_empty : P.List_List$unmodifiable(numeratorUnits, type$.legacy_String);
+        t2 = emptyDenominator ? C.List_empty : P.List_List$unmodifiable(denominatorUnits, type$.legacy_String);
+        t3 = type$.legacy_String;
+        return new S.ComplexSassNumber0(P.List_List$unmodifiable(t1, t3), P.List_List$unmodifiable(t2, t3), value, null);
+      }
+    },
+    SassNumber0: function SassNumber0() {
+    },
+    SassNumber__coerceOrConvertValue__compatibilityException0: function SassNumber__coerceOrConvertValue__compatibilityException0(t0, t1, t2, t3, t4, t5, t6) {
+      var _ = this;
+      _.$this = t0;
+      _.other = t1;
+      _.otherName = t2;
+      _.otherHasUnits = t3;
+      _.name = t4;
+      _.newNumerators = t5;
+      _.newDenominators = t6;
+    },
+    SassNumber__coerceOrConvertValue_closure3: function SassNumber__coerceOrConvertValue_closure3(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.newNumerator = t2;
+    },
+    SassNumber__coerceOrConvertValue_closure4: function SassNumber__coerceOrConvertValue_closure4(t0) {
+      this._compatibilityException = t0;
+    },
+    SassNumber__coerceOrConvertValue_closure5: function SassNumber__coerceOrConvertValue_closure5(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.newDenominator = t2;
+    },
+    SassNumber__coerceOrConvertValue_closure6: function SassNumber__coerceOrConvertValue_closure6(t0) {
+      this._compatibilityException = t0;
+    },
+    SassNumber_plus_closure0: function SassNumber_plus_closure0() {
+    },
+    SassNumber_minus_closure0: function SassNumber_minus_closure0() {
+    },
+    SassNumber_multiplyUnits_closure3: function SassNumber_multiplyUnits_closure3(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.numerator = t2;
+    },
+    SassNumber_multiplyUnits_closure4: function SassNumber_multiplyUnits_closure4(t0, t1) {
+      this.newNumerators = t0;
+      this.numerator = t1;
+    },
+    SassNumber_multiplyUnits_closure5: function SassNumber_multiplyUnits_closure5(t0, t1, t2) {
+      this._box_0 = t0;
+      this.$this = t1;
+      this.numerator = t2;
+    },
+    SassNumber_multiplyUnits_closure6: function SassNumber_multiplyUnits_closure6(t0, t1) {
+      this.newNumerators = t0;
+      this.numerator = t1;
+    },
+    SassNumber__areAnyConvertible_closure0: function SassNumber__areAnyConvertible_closure0(t0, t1) {
+      this.$this = t0;
+      this.units2 = t1;
+    },
+    SassNumber__canonicalizeUnitList_closure0: function SassNumber__canonicalizeUnitList_closure0() {
+    },
+    SassNumber__canonicalMultiplier_closure0: function SassNumber__canonicalMultiplier_closure0(t0) {
+      this.$this = t0;
+    },
+    ParenthesizedExpression0: function ParenthesizedExpression0(t0, t1) {
+      this.expression = t0;
+      this.span = t1;
+    },
+    Selector0: function Selector0() {
+    },
+    SelectorExpression0: function SelectorExpression0(t0) {
+      this.span = t0;
+    },
+    _prependParent0: function(compound) {
+      var t2, t3, cur, _i, _null = null,
+        t1 = compound.components,
+        first = C.JSArray_methods.get$first(t1);
+      if (first instanceof N.UniversalSelector0)
+        return _null;
+      if (first instanceof F.TypeSelector0) {
+        t2 = first.name;
+        if (t2.namespace != null)
+          return _null;
+        t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector_2);
+        t3.push(new M.ParentSelector0(t2.name));
+        for (t1 = H.SubListIterable$(t1, 1, _null, H._arrayInstanceType(t1)._precomputed1), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          t3.push(cur);
+        }
+        return X.CompoundSelector$0(t3);
+      } else {
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector_2);
+        t2.push(new M.ParentSelector0(_null));
+        for (t3 = t1.length, _i = 0; _i < t3; ++_i)
+          t2.push(t1[_i]);
+        return X.CompoundSelector$0(t2);
+      }
+    },
+    _function7: function($name, $arguments, callback) {
+      return Q.BuiltInCallable$function0($name, $arguments, callback, "sass:selector");
+    },
+    closure128: function closure128() {
+    },
+    _closure16: function _closure16(t0) {
+      this._box_0 = t0;
+    },
+    _closure17: function _closure17() {
+    },
+    closure127: function closure127() {
+    },
+    _closure14: function _closure14() {
+    },
+    _closure15: function _closure15() {
+    },
+    __closure0: function __closure0(t0) {
+      this.parent = t0;
+    },
+    closure126: function closure126() {
+    },
+    closure125: function closure125() {
+    },
+    closure124: function closure124() {
+    },
+    closure131: function closure131() {
+    },
+    closure130: function closure130() {
+    },
+    _closure18: function _closure18() {
+    },
+    closure129: function closure129() {
+    },
+    SelectorParser$0: function(contents, allowParent, allowPlaceholder, logger, url) {
+      var t1 = S.SpanScanner$(contents, url);
+      return new T.SelectorParser0(allowParent, allowPlaceholder, t1, logger == null ? C.C_StderrLogger : logger);
+    },
+    SelectorParser0: function SelectorParser0(t0, t1, t2, t3) {
+      var _ = this;
+      _._selector$_allowParent = t0;
+      _._selector$_allowPlaceholder = t1;
+      _.scanner = t2;
+      _.logger = t3;
+    },
+    SelectorParser_parse_closure0: function SelectorParser_parse_closure0(t0) {
+      this.$this = t0;
+    },
+    SelectorParser_parseCompoundSelector_closure0: function SelectorParser_parseCompoundSelector_closure0(t0) {
+      this.$this = t0;
+    },
+    UseRule0: function UseRule0(t0, t1, t2, t3) {
+      var _ = this;
+      _.url = t0;
+      _.namespace = t1;
+      _.configuration = t2;
+      _.span = t3;
+    },
+    isWhitespace: function(character) {
+      return character === 32 || character === 9 || T.isNewline(character);
+    },
+    isNewline: function(character) {
+      return character === 10 || character === 13 || character === 12;
+    },
+    isAlphabetic0: function(character) {
+      var t1;
+      if (!(character >= 97 && character <= 122))
+        t1 = character >= 65 && character <= 90;
+      else
+        t1 = true;
+      return t1;
+    },
+    isDigit: function(character) {
+      return character != null && character >= 48 && character <= 57;
+    },
+    isHex: function(character) {
+      if (character == null)
+        return false;
+      if (T.isDigit(character))
+        return true;
+      if (character >= 97 && character <= 102)
+        return true;
+      if (character >= 65 && character <= 70)
+        return true;
+      return false;
+    },
+    isPrivate: function(identifier) {
+      var first = C.JSString_methods._codeUnitAt$1(identifier, 0);
+      return first === 45 || first === 95;
+    },
+    asHex: function(character) {
+      if (character <= 57)
+        return character - 48;
+      if (character <= 70)
+        return 10 + character - 65;
+      return 10 + character - 97;
+    },
+    hexCharFor: function(number) {
+      return number < 10 ? 48 + number : 87 + number;
+    },
+    opposite: function(character) {
+      switch (character) {
+        case 40:
+          return 41;
+        case 123:
+          return 125;
+        case 91:
+          return 93;
+        default:
+          return null;
+      }
+    },
+    characterEqualsIgnoreCase: function(character1, character2) {
+      var upperCase1;
+      if (character1 === character2)
+        return true;
+      if ((character1 ^ character2) >>> 0 !== 32)
+        return false;
+      upperCase1 = (character1 & 4294967263) >>> 0;
+      return upperCase1 >= 65 && upperCase1 <= 90;
+    },
+    fuzzyHashCode: function(number) {
+      number.toString;
+      return number == 1 / 0 || number == -1 / 0 || isNaN(number) ? C.JSNumber_methods.get$hashCode(number) : C.JSInt_methods.get$hashCode(C.JSNumber_methods.round$0(number * $.$get$_inverseEpsilon()));
+    },
+    fuzzyLessThan: function(number1, number2) {
+      return number1 < number2 && !(Math.abs(number1 - number2) < $.$get$epsilon());
+    },
+    fuzzyLessThanOrEquals: function(number1, number2) {
+      return number1 < number2 || Math.abs(number1 - number2) < $.$get$epsilon();
+    },
+    fuzzyGreaterThan: function(number1, number2) {
+      return number1 > number2 && !(Math.abs(number1 - number2) < $.$get$epsilon());
+    },
+    fuzzyGreaterThanOrEquals: function(number1, number2) {
+      return number1 > number2 || Math.abs(number1 - number2) < $.$get$epsilon();
+    },
+    fuzzyIsInt: function(number) {
+      number.toString;
+      if (number == 1 / 0 || number == -1 / 0 || isNaN(number))
+        return false;
+      if (H._isInt(number))
+        return true;
+      return Math.abs(C.JSNumber_methods.$mod(Math.abs(number - 0.5), 1) - 0.5) < $.$get$epsilon();
+    },
+    fuzzyRound: function(number) {
+      var t1;
+      if (number > 0) {
+        t1 = C.JSNumber_methods.$mod(number, 1);
+        return t1 < 0.5 && !(Math.abs(t1 - 0.5) < $.$get$epsilon()) ? C.JSNumber_methods.floor$0(number) : C.JSNumber_methods.ceil$0(number);
+      } else {
+        t1 = C.JSNumber_methods.$mod(number, 1);
+        return t1 < 0.5 || Math.abs(t1 - 0.5) < $.$get$epsilon() ? C.JSNumber_methods.floor$0(number) : C.JSNumber_methods.ceil$0(number);
+      }
+    },
+    fuzzyCheckRange: function(number, min, max) {
+      var t1 = $.$get$epsilon();
+      if (Math.abs(number - min) < t1)
+        return min;
+      if (Math.abs(number - max) < t1)
+        return max;
+      if (number > min && number < max)
+        return number;
+      return null;
+    },
+    fuzzyAssertRange: function(number, min, max, $name) {
+      var result = T.fuzzyCheckRange(number, min, max);
+      if (result != null)
+        return result;
+      throw H.wrapException(P.RangeError$range(number, min, max, $name, "must be between " + min + " and " + max));
+    },
+    isWhitespace0: function(character) {
+      return character === 32 || character === 9 || T.isNewline0(character);
+    },
+    isNewline0: function(character) {
+      return character === 10 || character === 13 || character === 12;
+    },
+    isAlphabetic1: function(character) {
+      var t1;
+      if (!(character >= 97 && character <= 122))
+        t1 = character >= 65 && character <= 90;
+      else
+        t1 = true;
+      return t1;
+    },
+    isDigit0: function(character) {
+      return character != null && character >= 48 && character <= 57;
+    },
+    isHex0: function(character) {
+      if (character == null)
+        return false;
+      if (T.isDigit0(character))
+        return true;
+      if (character >= 97 && character <= 102)
+        return true;
+      if (character >= 65 && character <= 70)
+        return true;
+      return false;
+    },
+    isPrivate0: function(identifier) {
+      var first = C.JSString_methods._codeUnitAt$1(identifier, 0);
+      return first === 45 || first === 95;
+    },
+    asHex0: function(character) {
+      if (character <= 57)
+        return character - 48;
+      if (character <= 70)
+        return 10 + character - 65;
+      return 10 + character - 97;
+    },
+    hexCharFor0: function(number) {
+      return number < 10 ? 48 + number : 87 + number;
+    },
+    opposite0: function(character) {
+      switch (character) {
+        case 40:
+          return 41;
+        case 123:
+          return 125;
+        case 91:
+          return 93;
+        default:
+          return null;
+      }
+    },
+    characterEqualsIgnoreCase0: function(character1, character2) {
+      var upperCase1;
+      if (character1 === character2)
+        return true;
+      if ((character1 ^ character2) >>> 0 !== 32)
+        return false;
+      upperCase1 = (character1 & 4294967263) >>> 0;
+      return upperCase1 >= 65 && upperCase1 <= 90;
+    },
+    fuzzyHashCode0: function(number) {
+      number.toString;
+      return number == 1 / 0 || number == -1 / 0 || isNaN(number) ? C.JSNumber_methods.get$hashCode(number) : C.JSInt_methods.get$hashCode(C.JSNumber_methods.round$0(number * $.$get$_inverseEpsilon0()));
+    },
+    fuzzyLessThan0: function(number1, number2) {
+      return number1 < number2 && !(Math.abs(number1 - number2) < $.$get$epsilon0());
+    },
+    fuzzyLessThanOrEquals0: function(number1, number2) {
+      return number1 < number2 || Math.abs(number1 - number2) < $.$get$epsilon0();
+    },
+    fuzzyGreaterThan0: function(number1, number2) {
+      return number1 > number2 && !(Math.abs(number1 - number2) < $.$get$epsilon0());
+    },
+    fuzzyGreaterThanOrEquals0: function(number1, number2) {
+      return number1 > number2 || Math.abs(number1 - number2) < $.$get$epsilon0();
+    },
+    fuzzyIsInt0: function(number) {
+      number.toString;
+      if (number == 1 / 0 || number == -1 / 0 || isNaN(number))
+        return false;
+      if (H._isInt(number))
+        return true;
+      return Math.abs(C.JSNumber_methods.$mod(Math.abs(number - 0.5), 1) - 0.5) < $.$get$epsilon0();
+    },
+    fuzzyRound0: function(number) {
+      var t1;
+      if (number > 0) {
+        t1 = C.JSNumber_methods.$mod(number, 1);
+        return t1 < 0.5 && !(Math.abs(t1 - 0.5) < $.$get$epsilon0()) ? C.JSNumber_methods.floor$0(number) : C.JSNumber_methods.ceil$0(number);
+      } else {
+        t1 = C.JSNumber_methods.$mod(number, 1);
+        return t1 < 0.5 || Math.abs(t1 - 0.5) < $.$get$epsilon0() ? C.JSNumber_methods.floor$0(number) : C.JSNumber_methods.ceil$0(number);
+      }
+    },
+    fuzzyCheckRange0: function(number, min, max) {
+      var t1 = $.$get$epsilon0();
+      if (Math.abs(number - min) < t1)
+        return min;
+      if (Math.abs(number - max) < t1)
+        return max;
+      if (number > min && number < max)
+        return number;
+      return null;
+    },
+    fuzzyAssertRange0: function(number, min, max, $name) {
+      var result = T.fuzzyCheckRange0(number, min, max);
+      if (result != null)
+        return result;
+      throw H.wrapException(P.RangeError$range(number, min, max, $name, "must be between " + min + " and " + max));
+    }
+  },
+  S = {VariableExpression: function VariableExpression(t0, t1, t2) {
+      this.namespace = t0;
+      this.name = t1;
+      this.span = t2;
+    },
+    ComplexSelector$: function(components, lineBreak) {
+      var t1 = P.List_List$unmodifiable(components, type$.legacy_ComplexSelectorComponent);
+      if (t1.length === 0)
+        H.throwExpression(P.ArgumentError$("components may not be empty."));
+      return new S.ComplexSelector(t1, lineBreak);
+    },
+    ComplexSelector: function ComplexSelector(t0, t1) {
+      var _ = this;
+      _.components = t0;
+      _.lineBreak = t1;
+      _._complex$_isInvisible = _._maxSpecificity = _._minSpecificity = null;
+    },
+    ComplexSelector_isInvisible_closure: function ComplexSelector_isInvisible_closure() {
+    },
+    Combinator: function Combinator(t0) {
+      this._complex$_text = t0;
+    },
+    AsyncBuiltInCallable$mixin: function($name, $arguments, callback, url) {
+      return new S.AsyncBuiltInCallable($name, L.ScssParser$("@mixin " + $name + "(" + $arguments + ") {", null, url).parseArgumentDeclaration$0(), new S.AsyncBuiltInCallable$mixin_closure(callback));
+    },
+    AsyncBuiltInCallable: function AsyncBuiltInCallable(t0, t1, t2) {
+      this.name = t0;
+      this._async_built_in$_arguments = t1;
+      this._async_built_in$_callback = t2;
+    },
+    AsyncBuiltInCallable$mixin_closure: function AsyncBuiltInCallable$mixin_closure(t0) {
+      this.callback = t0;
+    },
+    Extension$oneOff: function(extender, isOriginal, specificity) {
+      var _null = null;
+      return new S.Extension(extender, _null, specificity == null ? extender.get$maxSpecificity() : specificity, true, isOriginal, _null, _null, _null);
+    },
+    Extension: function Extension(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _.extender = t0;
+      _.target = t1;
+      _.specificity = t2;
+      _.isOptional = t3;
+      _.isOriginal = t4;
+      _.mediaContext = t5;
+      _.extenderSpan = t6;
+      _.span = t7;
+    },
+    StderrLogger: function StderrLogger(t0) {
+      this.color = t0;
+    },
+    ComplexSassNumber: function ComplexSassNumber(t0, t1, t2, t3) {
+      var _ = this;
+      _.numeratorUnits = t0;
+      _.denominatorUnits = t1;
+      _.value = t2;
+      _.asSlash = t3;
+    },
+    SpanScanner$: function(string, sourceUrl) {
+      var t1 = Y.SourceFile$fromString(string, sourceUrl),
+        t2 = typeof sourceUrl == "string" ? P.Uri_parse(sourceUrl) : type$.legacy_Uri._as(sourceUrl);
+      return new S.SpanScanner(t1, t2, string);
+    },
+    SpanScanner: function SpanScanner(t0, t1, t2) {
+      var _ = this;
+      _._sourceFile = t0;
+      _.sourceUrl = t1;
+      _.string = t2;
+      _._string_scanner$_position = 0;
+      _._lastMatchPosition = _._lastMatch = null;
+    },
+    _SpanScannerState: function _SpanScannerState(t0, t1) {
+      this._scanner = t0;
+      this.position = t1;
+    },
+    Tuple2: function Tuple2(t0, t1, t2) {
+      this.item1 = t0;
+      this.item2 = t1;
+      this.$ti = t2;
+    },
+    Tuple3: function Tuple3(t0, t1, t2, t3) {
+      var _ = this;
+      _.item1 = t0;
+      _.item2 = t1;
+      _.item3 = t2;
+      _.$ti = t3;
+    },
+    AsyncBuiltInCallable$mixin0: function($name, $arguments, callback, url) {
+      return new S.AsyncBuiltInCallable0($name, L.ScssParser$0("@mixin " + $name + "(" + $arguments + ") {", null, url).parseArgumentDeclaration$0(), new S.AsyncBuiltInCallable$mixin_closure0(callback));
+    },
+    AsyncBuiltInCallable0: function AsyncBuiltInCallable0(t0, t1, t2) {
+      this.name = t0;
+      this._async_built_in0$_arguments = t1;
+      this._async_built_in0$_callback = t2;
+    },
+    AsyncBuiltInCallable$mixin_closure0: function AsyncBuiltInCallable$mixin_closure0(t0) {
+      this.callback = t0;
+    },
+    ComplexSassNumber0: function ComplexSassNumber0(t0, t1, t2, t3) {
+      var _ = this;
+      _.numeratorUnits = t0;
+      _.denominatorUnits = t1;
+      _.value = t2;
+      _.asSlash = t3;
+    },
+    ComplexSelector$0: function(components, lineBreak) {
+      var t1 = P.List_List$unmodifiable(components, type$.legacy_ComplexSelectorComponent_2);
+      if (t1.length === 0)
+        H.throwExpression(P.ArgumentError$("components may not be empty."));
+      return new S.ComplexSelector0(t1, lineBreak);
+    },
+    ComplexSelector0: function ComplexSelector0(t0, t1) {
+      var _ = this;
+      _.components = t0;
+      _.lineBreak = t1;
+      _._complex0$_isInvisible = _._complex0$_maxSpecificity = _._complex0$_minSpecificity = null;
+    },
+    ComplexSelector_isInvisible_closure0: function ComplexSelector_isInvisible_closure0() {
+    },
+    Combinator0: function Combinator0(t0) {
+      this._complex0$_text = t0;
+    },
+    Extension$oneOff0: function(extender, isOriginal, specificity) {
+      var _null = null;
+      return new S.Extension0(extender, _null, specificity == null ? extender.get$maxSpecificity() : specificity, true, isOriginal, _null, _null, _null);
+    },
+    Extension0: function Extension0(t0, t1, t2, t3, t4, t5, t6, t7) {
+      var _ = this;
+      _.extender = t0;
+      _.target = t1;
+      _.specificity = t2;
+      _.isOptional = t3;
+      _.isOriginal = t4;
+      _.mediaContext = t5;
+      _.extenderSpan = t6;
+      _.span = t7;
+    },
+    StderrLogger0: function StderrLogger0() {
+    },
+    VariableExpression0: function VariableExpression0(t0, t1, t2) {
+      this.namespace = t0;
+      this.name = t1;
+      this.span = t2;
+    }
+  };
+  var holders = [C, H, J, P, N, Z, V, G, F, Y, L, Q, B, O, U, M, D, E, X, K, R, A, T, S];
+  hunkHelpers.setFunctionNamesIfNecessary(holders);
+  var $ = {};
+  H.JS_CONST.prototype = {};
+  J.Interceptor.prototype = {
+    $eq: function(receiver, other) {
+      return receiver === other;
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    toString$0: function(receiver) {
+      return "Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'";
+    },
+    noSuchMethod$1: function(receiver, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
+    }
+  };
+  J.JSBool.prototype = {
+    toString$0: function(receiver) {
+      return String(receiver);
+    },
+    get$hashCode: function(receiver) {
+      return receiver ? 519018 : 218159;
+    },
+    $isbool: 1
+  };
+  J.JSNull.prototype = {
+    $eq: function(receiver, other) {
+      return null == other;
+    },
+    toString$0: function(receiver) {
+      return "null";
+    },
+    get$hashCode: function(receiver) {
+      return 0;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_Null_Yyn;
+    },
+    noSuchMethod$1: function(receiver, invocation) {
+      return this.super$Interceptor$noSuchMethod(receiver, invocation);
+    },
+    $isNull: 1
+  };
+  J.JavaScriptObject.prototype = {
+    get$hashCode: function(receiver) {
+      return 0;
+    },
+    toString$0: function(receiver) {
+      return String(receiver);
+    },
+    $isJsSystemError: 1,
+    $is_NodeSassColor: 1,
+    $isJSFunction0: 1,
+    $isNodeImporterResult0: 1,
+    $is_NodeSassList: 1,
+    $is_NodeSassMap: 1,
+    $is_NodeSassNumber: 1,
+    $isRenderOptions: 1,
+    $isRenderResult: 1,
+    $is_NodeSassString: 1,
+    get$isTTY: function(obj) {
+      return obj.isTTY;
+    },
+    get$write: function(obj) {
+      return obj.write;
+    },
+    write$1: function(receiver, p0) {
+      return receiver.write(p0);
+    },
+    createInterface$1: function(receiver, p0) {
+      return receiver.createInterface(p0);
+    },
+    on$2: function(receiver, p0, p1) {
+      return receiver.on(p0, p1);
+    },
+    get$close: function(obj) {
+      return obj.close;
+    },
+    close$0: function(receiver) {
+      return receiver.close();
+    },
+    setPrompt$1: function(receiver, p0) {
+      return receiver.setPrompt(p0);
+    },
+    get$length: function(obj) {
+      return obj.length;
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    clear$0: function(receiver) {
+      return receiver.clear();
+    },
+    existsSync$1: function(receiver, p0) {
+      return receiver.existsSync(p0);
+    },
+    mkdirSync$1: function(receiver, p0) {
+      return receiver.mkdirSync(p0);
+    },
+    readdirSync$1: function(receiver, p0) {
+      return receiver.readdirSync(p0);
+    },
+    readFileSync$2: function(receiver, p0, p1) {
+      return receiver.readFileSync(p0, p1);
+    },
+    statSync$1: function(receiver, p0) {
+      return receiver.statSync(p0);
+    },
+    unlinkSync$1: function(receiver, p0) {
+      return receiver.unlinkSync(p0);
+    },
+    watch$2: function(receiver, p0, p1) {
+      return receiver.watch(p0, p1);
+    },
+    writeFileSync$2: function(receiver, p0, p1) {
+      return receiver.writeFileSync(p0, p1);
+    },
+    get$path: function(obj) {
+      return obj.path;
+    },
+    get$start: function(obj) {
+      return obj.start;
+    },
+    get$end: function(obj) {
+      return obj.end;
+    },
+    isDirectory$0: function(receiver) {
+      return receiver.isDirectory();
+    },
+    isFile$0: function(receiver) {
+      return receiver.isFile();
+    },
+    get$mtime: function(obj) {
+      return obj.mtime;
+    },
+    then$1$1: function(receiver, p0) {
+      return receiver.then(p0);
+    },
+    then$1: function(receiver, p0) {
+      return receiver.then(p0);
+    },
+    getTime$0: function(receiver) {
+      return receiver.getTime();
+    },
+    get$message: function(obj) {
+      return obj.message;
+    },
+    message$1: function(receiver, p0) {
+      return receiver.message(p0);
+    },
+    get$code: function(obj) {
+      return obj.code;
+    },
+    get$syscall: function(obj) {
+      return obj.syscall;
+    },
+    get$env: function(obj) {
+      return obj.env;
+    },
+    get$exitCode: function(obj) {
+      return obj.exitCode;
+    },
+    set$exitCode: function(obj, v) {
+      return obj.exitCode = v;
+    },
+    get$platform: function(obj) {
+      return obj.platform;
+    },
+    get$stderr: function(obj) {
+      return obj.stderr;
+    },
+    get$stdin: function(obj) {
+      return obj.stdin;
+    },
+    get$stdout: function(obj) {
+      return obj.stdout;
+    },
+    get$name: function(obj) {
+      return obj.name;
+    },
+    get$sourceUrl: function(obj) {
+      return obj.sourceUrl;
+    },
+    call$2: function(receiver, p0, p1) {
+      return receiver.call(p0, p1);
+    },
+    call$1: function(receiver, p0) {
+      return receiver.call(p0);
+    },
+    call$0: function(receiver) {
+      return receiver.call();
+    },
+    call$3$1: function(receiver, p0) {
+      return receiver.call(p0);
+    },
+    call$2$1: function(receiver, p0) {
+      return receiver.call(p0);
+    },
+    call$1$1: function(receiver, p0) {
+      return receiver.call(p0);
+    },
+    call$3: function(receiver, p0, p1, p2) {
+      return receiver.call(p0, p1, p2);
+    },
+    call$3$3: function(receiver, p0, p1, p2) {
+      return receiver.call(p0, p1, p2);
+    },
+    call$2$2: function(receiver, p0, p1) {
+      return receiver.call(p0, p1);
+    },
+    call$1$3: function(receiver, p0, p1, p2) {
+      return receiver.call(p0, p1, p2);
+    },
+    call$2$3: function(receiver, p0, p1, p2) {
+      return receiver.call(p0, p1, p2);
+    },
+    call$1$2: function(receiver, p0, p1) {
+      return receiver.call(p0, p1);
+    },
+    call$1$0: function(receiver) {
+      return receiver.call();
+    },
+    apply$2: function(receiver, p0, p1) {
+      return receiver.apply(p0, p1);
+    },
+    get$file: function(obj) {
+      return obj.file;
+    },
+    get$contents: function(obj) {
+      return obj.contents;
+    },
+    get$dartValue: function(obj) {
+      return obj.dartValue;
+    },
+    set$dartValue: function(obj, v) {
+      return obj.dartValue = v;
+    },
+    set$render: function(obj, v) {
+      return obj.render = v;
+    },
+    set$renderSync: function(obj, v) {
+      return obj.renderSync = v;
+    },
+    set$info: function(obj, v) {
+      return obj.info = v;
+    },
+    set$types: function(obj, v) {
+      return obj.types = v;
+    },
+    set$NULL: function(obj, v) {
+      return obj.NULL = v;
+    },
+    set$TRUE: function(obj, v) {
+      return obj.TRUE = v;
+    },
+    set$FALSE: function(obj, v) {
+      return obj.FALSE = v;
+    },
+    get$current: function(obj) {
+      return obj.current;
+    },
+    yield$0: function(receiver) {
+      return receiver.yield();
+    },
+    run$1$1: function(receiver, p0) {
+      return receiver.run(p0);
+    },
+    run$1: function(receiver, p0) {
+      return receiver.run(p0);
+    },
+    run$0: function(receiver) {
+      return receiver.run();
+    },
+    get$options: function(obj) {
+      return obj.options;
+    },
+    get$data: function(obj) {
+      return obj.data;
+    },
+    get$includePaths: function(obj) {
+      return obj.includePaths;
+    },
+    get$indentType: function(obj) {
+      return obj.indentType;
+    },
+    get$indentWidth: function(obj) {
+      return obj.indentWidth;
+    },
+    get$linefeed: function(obj) {
+      return obj.linefeed;
+    },
+    set$context: function(obj, v) {
+      return obj.context = v;
+    },
+    get$importer: function(obj) {
+      return obj.importer;
+    },
+    get$functions: function(obj) {
+      return obj.functions;
+    },
+    get$indentedSyntax: function(obj) {
+      return obj.indentedSyntax;
+    },
+    get$omitSourceMapUrl: function(obj) {
+      return obj.omitSourceMapUrl;
+    },
+    get$outFile: function(obj) {
+      return obj.outFile;
+    },
+    get$outputStyle: function(obj) {
+      return obj.outputStyle;
+    },
+    get$fiber: function(obj) {
+      return obj.fiber;
+    },
+    get$sourceMap: function(obj) {
+      return obj.sourceMap;
+    },
+    get$sourceMapContents: function(obj) {
+      return obj.sourceMapContents;
+    },
+    get$sourceMapEmbed: function(obj) {
+      return obj.sourceMapEmbed;
+    },
+    get$sourceMapRoot: function(obj) {
+      return obj.sourceMapRoot;
+    },
+    map$1: function(receiver, p0) {
+      return receiver.map(p0);
+    },
+    map$1$1: function(receiver, p0) {
+      return receiver.map(p0);
+    },
+    set$cli_pkg_main_0_: function(obj, v) {
+      return obj.cli_pkg_main_0_ = v;
+    }
+  };
+  J.PlainJavaScriptObject.prototype = {};
+  J.UnknownJavaScriptObject.prototype = {};
+  J.JavaScriptFunction.prototype = {
+    toString$0: function(receiver) {
+      var dartClosure = receiver[$.$get$DART_CLOSURE_PROPERTY_NAME()];
+      if (dartClosure == null)
+        return this.super$JavaScriptObject$toString(receiver);
+      return "JavaScript function for " + H.S(J.toString$0$(dartClosure));
+    },
+    $isFunction: 1
+  };
+  J.JSArray.prototype = {
+    cast$1$0: function(receiver, $R) {
+      return new H.CastList(receiver, H._arrayInstanceType(receiver)._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
+    },
+    add$1: function(receiver, value) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("add"));
+      receiver.push(value);
+    },
+    removeAt$1: function(receiver, index) {
+      var t1;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeAt"));
+      t1 = receiver.length;
+      if (index >= t1)
+        throw H.wrapException(P.RangeError$value(index, null, null));
+      return receiver.splice(index, 1)[0];
+    },
+    insert$2: function(receiver, index, value) {
+      var t1;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insert"));
+      t1 = receiver.length;
+      if (index > t1)
+        throw H.wrapException(P.RangeError$value(index, null, null));
+      receiver.splice(index, 0, value);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      var insertionLength, end;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insertAll"));
+      P.RangeError_checkValueInInterval(index, 0, receiver.length, "index");
+      if (!type$.EfficientLengthIterable_dynamic._is(iterable))
+        iterable = J.toList$0$ax(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      receiver.length = receiver.length + insertionLength;
+      end = index + insertionLength;
+      this.setRange$4(receiver, end, receiver.length, receiver, index);
+      this.setRange$3(receiver, index, end, iterable);
+    },
+    setAll$2: function(receiver, index, iterable) {
+      var t1, index0;
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("setAll"));
+      P.RangeError_checkValueInInterval(index, 0, receiver.length, "index");
+      for (t1 = J.get$iterator$ax(iterable); t1.moveNext$0(); index = index0) {
+        index0 = index + 1;
+        this.$indexSet(receiver, index, t1.get$current(t1));
+      }
+    },
+    removeLast$0: function(receiver) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeLast"));
+      if (receiver.length === 0)
+        throw H.wrapException(H.diagnoseIndexError(receiver, -1));
+      return receiver.pop();
+    },
+    remove$1: function(receiver, element) {
+      var i;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("remove"));
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq$(receiver[i], element)) {
+          receiver.splice(i, 1);
+          return true;
+        }
+      return false;
+    },
+    _removeWhere$2: function(receiver, test, removeMatching) {
+      var i, element, t1, retained = [],
+        end = receiver.length;
+      for (i = 0; i < end; ++i) {
+        element = receiver[i];
+        if (!test.call$1(element))
+          retained.push(element);
+        if (receiver.length !== end)
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      t1 = retained.length;
+      if (t1 === end)
+        return;
+      this.set$length(receiver, t1);
+      for (i = 0; i < retained.length; ++i)
+        receiver[i] = retained[i];
+    },
+    where$1: function(receiver, f) {
+      return new H.WhereIterable(receiver, f, H._arrayInstanceType(receiver)._eval$1("WhereIterable<1>"));
+    },
+    expand$1$1: function(receiver, f, $T) {
+      return new H.ExpandIterable(receiver, f, H._arrayInstanceType(receiver)._eval$1("@<1>")._bind$1($T)._eval$1("ExpandIterable<1,2>"));
+    },
+    addAll$1: function(receiver, collection) {
+      var t1;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("addAll"));
+      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
+        receiver.push(t1.get$current(t1));
+    },
+    map$1$1: function(receiver, f, $T) {
+      return new H.MappedListIterable(receiver, f, H._arrayInstanceType(receiver)._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
+    },
+    map$1: function($receiver, f) {
+      return this.map$1$1($receiver, f, type$.dynamic);
+    },
+    join$1: function(receiver, separator) {
+      var i,
+        list = P.List_List$filled(receiver.length, "", false, type$.String);
+      for (i = 0; i < receiver.length; ++i)
+        list[i] = H.S(receiver[i]);
+      return list.join(separator);
+    },
+    join$0: function($receiver) {
+      return this.join$1($receiver, "");
+    },
+    take$1: function(receiver, n) {
+      return H.SubListIterable$(receiver, 0, n, H._arrayInstanceType(receiver)._precomputed1);
+    },
+    skip$1: function(receiver, n) {
+      return H.SubListIterable$(receiver, n, null, H._arrayInstanceType(receiver)._precomputed1);
+    },
+    fold$1$2: function(receiver, initialValue, combine) {
+      var value, i,
+        $length = receiver.length;
+      for (value = initialValue, i = 0; i < $length; ++i) {
+        value = combine.call$2(value, receiver[i]);
+        if (receiver.length !== $length)
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return value;
+    },
+    fold$2: function($receiver, initialValue, combine) {
+      return this.fold$1$2($receiver, initialValue, combine, type$.dynamic);
+    },
+    firstWhere$2$orElse: function(receiver, test, orElse) {
+      var i, element,
+        end = receiver.length;
+      for (i = 0; i < end; ++i) {
+        element = receiver[i];
+        if (test.call$1(element))
+          return element;
+        if (receiver.length !== end)
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      if (orElse != null)
+        return orElse.call$0();
+      throw H.wrapException(H.IterableElementError_noElement());
+    },
+    lastWhere$2$orElse: function(receiver, test, orElse) {
+      var i, element,
+        $length = receiver.length;
+      for (i = $length - 1; i >= 0; --i) {
+        element = receiver[i];
+        if (test.call$1(element))
+          return element;
+        if ($length !== receiver.length)
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      if (orElse != null)
+        return orElse.call$0();
+      throw H.wrapException(H.IterableElementError_noElement());
+    },
+    elementAt$1: function(receiver, index) {
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      var end0 = receiver.length;
+      if (start > end0)
+        throw H.wrapException(P.RangeError$range(start, 0, end0, "start", null));
+      if (end == null)
+        end = end0;
+      else if (end < start || end > end0)
+        throw H.wrapException(P.RangeError$range(end, start, end0, "end", null));
+      if (start === end)
+        return H.setRuntimeTypeInfo([], H._arrayInstanceType(receiver));
+      return H.setRuntimeTypeInfo(receiver.slice(start, end), H._arrayInstanceType(receiver));
+    },
+    sublist$1: function($receiver, start) {
+      return this.sublist$2($receiver, start, null);
+    },
+    getRange$2: function(receiver, start, end) {
+      P.RangeError_checkValidRange(start, end, receiver.length);
+      return H.SubListIterable$(receiver, start, end, H._arrayInstanceType(receiver)._precomputed1);
+    },
+    get$first: function(receiver) {
+      if (receiver.length > 0)
+        return receiver[0];
+      throw H.wrapException(H.IterableElementError_noElement());
+    },
+    get$last: function(receiver) {
+      var t1 = receiver.length;
+      if (t1 > 0)
+        return receiver[t1 - 1];
+      throw H.wrapException(H.IterableElementError_noElement());
+    },
+    get$single: function(receiver) {
+      var t1 = receiver.length;
+      if (t1 === 1)
+        return receiver[0];
+      if (t1 === 0)
+        throw H.wrapException(H.IterableElementError_noElement());
+      throw H.wrapException(H.IterableElementError_tooMany());
+    },
+    removeRange$2: function(receiver, start, end) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeRange"));
+      P.RangeError_checkValidRange(start, end, receiver.length);
+      receiver.splice(start, end - start);
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      var $length, otherList, otherStart, t1, i;
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("setRange"));
+      P.RangeError_checkValidRange(start, end, receiver.length);
+      $length = end - start;
+      if ($length === 0)
+        return;
+      P.RangeError_checkNotNegative(skipCount, "skipCount");
+      if (type$.List_dynamic._is(iterable)) {
+        otherList = iterable;
+        otherStart = skipCount;
+      } else {
+        otherList = J.skip$1$ax(iterable, skipCount).toList$1$growable(0, false);
+        otherStart = 0;
+      }
+      t1 = J.getInterceptor$asx(otherList);
+      if (otherStart + $length > t1.get$length(otherList))
+        throw H.wrapException(H.IterableElementError_tooFew());
+      if (otherStart < start)
+        for (i = $length - 1; i >= 0; --i)
+          receiver[start + i] = t1.$index(otherList, otherStart + i);
+      else
+        for (i = 0; i < $length; ++i)
+          receiver[start + i] = t1.$index(otherList, otherStart + i);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    fillRange$3: function(receiver, start, end, fillValue) {
+      var i;
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("fill range"));
+      P.RangeError_checkValidRange(start, end, receiver.length);
+      for (i = start; i < end; ++i)
+        receiver[i] = fillValue;
+    },
+    any$1: function(receiver, test) {
+      var i,
+        end = receiver.length;
+      for (i = 0; i < end; ++i) {
+        if (test.call$1(receiver[i]))
+          return true;
+        if (receiver.length !== end)
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    every$1: function(receiver, test) {
+      var i,
+        end = receiver.length;
+      for (i = 0; i < end; ++i) {
+        if (!test.call$1(receiver[i]))
+          return false;
+        if (receiver.length !== end)
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return true;
+    },
+    get$reversed: function(receiver) {
+      return new H.ReversedListIterable(receiver, H._arrayInstanceType(receiver)._eval$1("ReversedListIterable<1>"));
+    },
+    sort$1: function(receiver, compare) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("sort"));
+      H.Sort_sort(receiver, compare == null ? J._interceptors_JSArray__compareAny$closure() : compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$1: function(receiver, element) {
+      var i,
+        $length = receiver.length;
+      if (0 >= $length)
+        return -1;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq$(receiver[i], element))
+          return i;
+      return -1;
+    },
+    contains$1: function(receiver, other) {
+      var i;
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq$(receiver[i], other))
+          return true;
+      return false;
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    toList$1$growable: function(receiver, growable) {
+      var t1 = H._arrayInstanceType(receiver);
+      return growable ? H.setRuntimeTypeInfo(receiver.slice(0), t1) : J.JSArray_JSArray$markFixed(receiver.slice(0), t1._precomputed1);
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    toSet$0: function(receiver) {
+      return P.LinkedHashSet_LinkedHashSet$from(receiver, H._arrayInstanceType(receiver)._precomputed1);
+    },
+    get$iterator: function(receiver) {
+      return new J.ArrayIterator(receiver, receiver.length);
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    set$length: function(receiver, newLength) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("set length"));
+      if (newLength < 0)
+        throw H.wrapException(P.RangeError$range(newLength, 0, null, "newLength", null));
+      receiver.length = newLength;
+    },
+    $index: function(receiver, index) {
+      if (!H._isInt(index))
+        throw H.wrapException(H.diagnoseIndexError(receiver, index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(H.diagnoseIndexError(receiver, index));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("indexed set"));
+      if (!H._isInt(index))
+        throw H.wrapException(H.diagnoseIndexError(receiver, index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(H.diagnoseIndexError(receiver, index));
+      receiver[index] = value;
+    },
+    $add: function(receiver, other) {
+      var t2, _i,
+        t1 = H.setRuntimeTypeInfo([], H._arrayInstanceType(receiver));
+      for (t2 = receiver.length, _i = 0; _i < receiver.length; receiver.length === t2 || (0, H.throwConcurrentModificationError)(receiver), ++_i)
+        t1.push(receiver[_i]);
+      for (t2 = other.length, _i = 0; _i < other.length; other.length === t2 || (0, H.throwConcurrentModificationError)(other), ++_i)
+        t1.push(other[_i]);
+      return t1;
+    },
+    $isEfficientLengthIterable: 1,
+    $isIterable: 1,
+    $isList: 1
+  };
+  J.JSUnmodifiableArray.prototype = {};
+  J.ArrayIterator.prototype = {
+    get$current: function(_) {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t2, _this = this,
+        t1 = _this._iterable,
+        $length = t1.length;
+      if (_this._length !== $length)
+        throw H.wrapException(H.throwConcurrentModificationError(t1));
+      t2 = _this._index;
+      if (t2 >= $length) {
+        _this._current = null;
+        return false;
+      }
+      _this._current = t1[t2];
+      _this._index = t2 + 1;
+      return true;
+    }
+  };
+  J.JSNumber.prototype = {
+    compareTo$1: function(receiver, b) {
+      var bIsNegative;
+      if (typeof b != "number")
+        throw H.wrapException(H.argumentErrorValue(b));
+      if (receiver < b)
+        return -1;
+      else if (receiver > b)
+        return 1;
+      else if (receiver === b) {
+        if (receiver === 0) {
+          bIsNegative = this.get$isNegative(b);
+          if (this.get$isNegative(receiver) === bIsNegative)
+            return 0;
+          if (this.get$isNegative(receiver))
+            return -1;
+          return 1;
+        }
+        return 0;
+      } else if (isNaN(receiver)) {
+        if (isNaN(b))
+          return 0;
+        return 1;
+      } else
+        return -1;
+    },
+    get$isNegative: function(receiver) {
+      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
+    },
+    ceil$0: function(receiver) {
+      var truncated, d;
+      if (receiver >= 0) {
+        if (receiver <= 2147483647) {
+          truncated = receiver | 0;
+          return receiver === truncated ? truncated : truncated + 1;
+        }
+      } else if (receiver >= -2147483648)
+        return receiver | 0;
+      d = Math.ceil(receiver);
+      if (isFinite(d))
+        return d;
+      throw H.wrapException(P.UnsupportedError$("" + receiver + ".ceil()"));
+    },
+    floor$0: function(receiver) {
+      var truncated, d;
+      if (receiver >= 0) {
+        if (receiver <= 2147483647)
+          return receiver | 0;
+      } else if (receiver >= -2147483648) {
+        truncated = receiver | 0;
+        return receiver === truncated ? truncated : truncated - 1;
+      }
+      d = Math.floor(receiver);
+      if (isFinite(d))
+        return d;
+      throw H.wrapException(P.UnsupportedError$("" + receiver + ".floor()"));
+    },
+    round$0: function(receiver) {
+      if (receiver > 0) {
+        if (receiver !== 1 / 0)
+          return Math.round(receiver);
+      } else if (receiver > -1 / 0)
+        return 0 - Math.round(0 - receiver);
+      throw H.wrapException(P.UnsupportedError$("" + receiver + ".round()"));
+    },
+    clamp$2: function(receiver, lowerLimit, upperLimit) {
+      if (C.JSInt_methods.compareTo$1(lowerLimit, upperLimit) > 0)
+        throw H.wrapException(H.argumentErrorValue(lowerLimit));
+      if (this.compareTo$1(receiver, lowerLimit) < 0)
+        return lowerLimit;
+      if (this.compareTo$1(receiver, upperLimit) > 0)
+        return upperLimit;
+      return receiver;
+    },
+    toRadixString$1: function(receiver, radix) {
+      var result, match, exponent, t1;
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$range(radix, 2, 36, "radix", null));
+      result = receiver.toString(radix);
+      if (C.JSString_methods.codeUnitAt$1(result, result.length - 1) !== 41)
+        return result;
+      match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
+      if (match == null)
+        H.throwExpression(P.UnsupportedError$("Unexpected toString result: " + result));
+      result = match[1];
+      exponent = +match[3];
+      t1 = match[2];
+      if (t1 != null) {
+        result += t1;
+        exponent -= t1.length;
+      }
+      return result + C.JSString_methods.$mul("0", exponent);
+    },
+    toString$0: function(receiver) {
+      if (receiver === 0 && 1 / receiver < 0)
+        return "-0.0";
+      else
+        return "" + receiver;
+    },
+    get$hashCode: function(receiver) {
+      var absolute, floorLog2, factor, scaled,
+        intValue = receiver | 0;
+      if (receiver === intValue)
+        return 536870911 & intValue;
+      absolute = Math.abs(receiver);
+      floorLog2 = Math.log(absolute) / 0.6931471805599453 | 0;
+      factor = Math.pow(2, floorLog2);
+      scaled = absolute < 1 ? absolute / factor : factor / absolute;
+      return 536870911 & ((scaled * 9007199254740992 | 0) + (scaled * 3542243181176521 | 0)) * 599197 + floorLog2 * 1259;
+    },
+    $add: function(receiver, other) {
+      if (typeof other != "number")
+        throw H.wrapException(H.argumentErrorValue(other));
+      return receiver + other;
+    },
+    $mod: function(receiver, other) {
+      var result = receiver % other;
+      if (result === 0)
+        return 0;
+      if (result > 0)
+        return result;
+      if (other < 0)
+        return result - other;
+      else
+        return result + other;
+    },
+    $tdiv: function(receiver, other) {
+      if ((receiver | 0) === receiver)
+        if (other >= 1 || other < -1)
+          return receiver / other | 0;
+      return this._tdivSlow$1(receiver, other);
+    },
+    _tdivFast$1: function(receiver, other) {
+      return (receiver | 0) === receiver ? receiver / other | 0 : this._tdivSlow$1(receiver, other);
+    },
+    _tdivSlow$1: function(receiver, other) {
+      var quotient = receiver / other;
+      if (quotient >= -2147483648 && quotient <= 2147483647)
+        return quotient | 0;
+      if (quotient > 0) {
+        if (quotient !== 1 / 0)
+          return Math.floor(quotient);
+      } else if (quotient > -1 / 0)
+        return Math.ceil(quotient);
+      throw H.wrapException(P.UnsupportedError$("Result of truncating division is " + H.S(quotient) + ": " + H.S(receiver) + " ~/ " + other));
+    },
+    _shrOtherPositive$1: function(receiver, other) {
+      var t1;
+      if (receiver > 0)
+        t1 = this._shrBothPositive$1(receiver, other);
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    _shrReceiverPositive$1: function(receiver, other) {
+      if (other < 0)
+        throw H.wrapException(H.argumentErrorValue(other));
+      return this._shrBothPositive$1(receiver, other);
+    },
+    _shrBothPositive$1: function(receiver, other) {
+      return other > 31 ? 0 : receiver >>> other;
+    },
+    $isComparable: 1,
+    $isdouble: 1,
+    $isnum: 1
+  };
+  J.JSInt.prototype = {$isint: 1};
+  J.JSDouble.prototype = {};
+  J.JSString.prototype = {
+    codeUnitAt$1: function(receiver, index) {
+      if (!H._isInt(index))
+        throw H.wrapException(H.diagnoseIndexError(receiver, index));
+      if (index < 0)
+        throw H.wrapException(H.diagnoseIndexError(receiver, index));
+      if (index >= receiver.length)
+        H.throwExpression(H.diagnoseIndexError(receiver, index));
+      return receiver.charCodeAt(index);
+    },
+    _codeUnitAt$1: function(receiver, index) {
+      if (index >= receiver.length)
+        throw H.wrapException(H.diagnoseIndexError(receiver, index));
+      return receiver.charCodeAt(index);
+    },
+    allMatches$2: function(receiver, string, start) {
+      var t1;
+      if (typeof string != "string")
+        H.throwExpression(H.argumentErrorValue(string));
+      t1 = string.length;
+      if (start > t1)
+        throw H.wrapException(P.RangeError$range(start, 0, t1, null, null));
+      return new H._StringAllMatchesIterable(string, receiver, start);
+    },
+    allMatches$1: function($receiver, string) {
+      return this.allMatches$2($receiver, string, 0);
+    },
+    matchAsPrefix$2: function(receiver, string, start) {
+      var t1, t2, i, _null = null;
+      if (start < 0 || start > string.length)
+        throw H.wrapException(P.RangeError$range(start, 0, string.length, _null, _null));
+      t1 = receiver.length;
+      if (start + t1 > string.length)
+        return _null;
+      for (t2 = J.getInterceptor$s(string), i = 0; i < t1; ++i)
+        if (t2.codeUnitAt$1(string, start + i) !== this._codeUnitAt$1(receiver, i))
+          return _null;
+      return new H.StringMatch(start, receiver);
+    },
+    $add: function(receiver, other) {
+      if (typeof other != "string")
+        throw H.wrapException(P.ArgumentError$value(other, null, null));
+      return receiver + other;
+    },
+    endsWith$1: function(receiver, other) {
+      var otherLength = other.length,
+        t1 = receiver.length;
+      if (otherLength > t1)
+        return false;
+      return other === this.substring$1(receiver, t1 - otherLength);
+    },
+    replaceFirst$2: function(receiver, from, to) {
+      P.RangeError_checkValueInInterval(0, 0, receiver.length, "startIndex");
+      return H.stringReplaceFirstUnchecked(receiver, from, to, 0);
+    },
+    split$1: function(receiver, pattern) {
+      if (pattern == null)
+        H.throwExpression(H.argumentErrorValue(pattern));
+      if (typeof pattern == "string")
+        return H.setRuntimeTypeInfo(receiver.split(pattern), type$.JSArray_String);
+      else if (pattern instanceof H.JSSyntaxRegExp && pattern.get$_nativeAnchoredVersion().exec("").length - 2 === 0)
+        return H.setRuntimeTypeInfo(receiver.split(pattern._nativeRegExp), type$.JSArray_String);
+      else
+        return this._defaultSplit$1(receiver, pattern);
+    },
+    replaceRange$3: function(receiver, start, end, replacement) {
+      var e;
+      if (typeof replacement != "string")
+        H.throwExpression(H.argumentErrorValue(replacement));
+      e = P.RangeError_checkValidRange(start, end, receiver.length);
+      return H.stringReplaceRangeUnchecked(receiver, start, e, replacement);
+    },
+    _defaultSplit$1: function(receiver, pattern) {
+      var t1, start, $length, match, matchStart, matchEnd,
+        result = H.setRuntimeTypeInfo([], type$.JSArray_String);
+      for (t1 = J.allMatches$1$s(pattern, receiver), t1 = t1.get$iterator(t1), start = 0, $length = 1; t1.moveNext$0();) {
+        match = t1.get$current(t1);
+        matchStart = match.get$start(match);
+        matchEnd = match.get$end(match);
+        $length = matchEnd - matchStart;
+        if ($length === 0 && start === matchStart)
+          continue;
+        result.push(this.substring$2(receiver, start, matchStart));
+        start = matchEnd;
+      }
+      if (start < receiver.length || $length > 0)
+        result.push(this.substring$1(receiver, start));
+      return result;
+    },
+    startsWith$2: function(receiver, pattern, index) {
+      var endIndex;
+      if (index < 0 || index > receiver.length)
+        throw H.wrapException(P.RangeError$range(index, 0, receiver.length, null, null));
+      if (typeof pattern == "string") {
+        endIndex = index + pattern.length;
+        if (endIndex > receiver.length)
+          return false;
+        return pattern === receiver.substring(index, endIndex);
+      }
+      return J.matchAsPrefix$2$s(pattern, receiver, index) != null;
+    },
+    startsWith$1: function($receiver, pattern) {
+      return this.startsWith$2($receiver, pattern, 0);
+    },
+    substring$2: function(receiver, startIndex, endIndex) {
+      var _null = null;
+      if (endIndex == null)
+        endIndex = receiver.length;
+      if (startIndex < 0)
+        throw H.wrapException(P.RangeError$value(startIndex, _null, _null));
+      if (startIndex > endIndex)
+        throw H.wrapException(P.RangeError$value(startIndex, _null, _null));
+      if (endIndex > receiver.length)
+        throw H.wrapException(P.RangeError$value(endIndex, _null, _null));
+      return receiver.substring(startIndex, endIndex);
+    },
+    substring$1: function($receiver, startIndex) {
+      return this.substring$2($receiver, startIndex, null);
+    },
+    trim$0: function(receiver) {
+      var startIndex, t1, endIndex0,
+        result = receiver.trim(),
+        endIndex = result.length;
+      if (endIndex === 0)
+        return result;
+      if (this._codeUnitAt$1(result, 0) === 133) {
+        startIndex = J.JSString__skipLeadingWhitespace(result, 1);
+        if (startIndex === endIndex)
+          return "";
+      } else
+        startIndex = 0;
+      t1 = endIndex - 1;
+      endIndex0 = this.codeUnitAt$1(result, t1) === 133 ? J.JSString__skipTrailingWhitespace(result, t1) : endIndex;
+      if (startIndex === 0 && endIndex0 === endIndex)
+        return result;
+      return result.substring(startIndex, endIndex0);
+    },
+    trimRight$0: function(receiver) {
+      var result, endIndex, t1;
+      if (typeof receiver.trimRight != "undefined") {
+        result = receiver.trimRight();
+        endIndex = result.length;
+        if (endIndex === 0)
+          return result;
+        t1 = endIndex - 1;
+        if (this.codeUnitAt$1(result, t1) === 133)
+          endIndex = J.JSString__skipTrailingWhitespace(result, t1);
+      } else {
+        endIndex = J.JSString__skipTrailingWhitespace(receiver, receiver.length);
+        result = receiver;
+      }
+      if (endIndex === result.length)
+        return result;
+      if (endIndex === 0)
+        return "";
+      return result.substring(0, endIndex);
+    },
+    $mul: function(receiver, times) {
+      var s, result;
+      if (0 >= times)
+        return "";
+      if (times === 1 || receiver.length === 0)
+        return receiver;
+      if (times !== times >>> 0)
+        throw H.wrapException(C.C_OutOfMemoryError);
+      for (s = receiver, result = ""; true;) {
+        if ((times & 1) === 1)
+          result = s + result;
+        times = times >>> 1;
+        if (times === 0)
+          break;
+        s += s;
+      }
+      return result;
+    },
+    padLeft$2: function(receiver, width, padding) {
+      var delta = width - receiver.length;
+      if (delta <= 0)
+        return receiver;
+      return this.$mul(padding, delta) + receiver;
+    },
+    padRight$1: function(receiver, width) {
+      var delta = width - receiver.length;
+      if (delta <= 0)
+        return receiver;
+      return receiver + this.$mul(" ", delta);
+    },
+    indexOf$2: function(receiver, pattern, start) {
+      var t1, t2, i;
+      if (pattern == null)
+        H.throwExpression(H.argumentErrorValue(pattern));
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length, null, null));
+      if (typeof pattern == "string")
+        return receiver.indexOf(pattern, start);
+      for (t1 = receiver.length, t2 = J.getInterceptor$s(pattern), i = start; i <= t1; ++i)
+        if (t2.matchAsPrefix$2(pattern, receiver, i) != null)
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, pattern) {
+      return this.indexOf$2($receiver, pattern, 0);
+    },
+    lastIndexOf$2: function(receiver, pattern, start) {
+      var t1, t2, i;
+      if (pattern == null)
+        H.throwExpression(H.argumentErrorValue(pattern));
+      if (start == null)
+        start = receiver.length;
+      else if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length, null, null));
+      if (typeof pattern == "string") {
+        t1 = pattern.length;
+        t2 = receiver.length;
+        if (start + t1 > t2)
+          start = t2 - t1;
+        return receiver.lastIndexOf(pattern, start);
+      }
+      for (t1 = J.getInterceptor$s(pattern), i = start; i >= 0; --i)
+        if (t1.matchAsPrefix$2(pattern, receiver, i) != null)
+          return i;
+      return -1;
+    },
+    lastIndexOf$1: function($receiver, pattern) {
+      return this.lastIndexOf$2($receiver, pattern, null);
+    },
+    contains$2: function(receiver, other, startIndex) {
+      var t1;
+      if (other == null)
+        H.throwExpression(H.argumentErrorValue(other));
+      t1 = receiver.length;
+      if (startIndex > t1)
+        throw H.wrapException(P.RangeError$range(startIndex, 0, t1, null, null));
+      return H.stringContainsUnchecked(receiver, other, startIndex);
+    },
+    contains$1: function($receiver, other) {
+      return this.contains$2($receiver, other, 0);
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    compareTo$1: function(receiver, other) {
+      var t1;
+      if (typeof other != "string")
+        throw H.wrapException(H.argumentErrorValue(other));
+      if (receiver === other)
+        t1 = 0;
+      else
+        t1 = receiver < other ? -1 : 1;
+      return t1;
+    },
+    toString$0: function(receiver) {
+      return receiver;
+    },
+    get$hashCode: function(receiver) {
+      var t1, hash, i;
+      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
+        hash = 536870911 & hash + receiver.charCodeAt(i);
+        hash = 536870911 & hash + ((524287 & hash) << 10);
+        hash ^= hash >> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3);
+      hash ^= hash >> 11;
+      return 536870911 & hash + ((16383 & hash) << 15);
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $isComparable: 1,
+    $isString: 1
+  };
+  H._CastIterableBase.prototype = {
+    get$iterator: function(_) {
+      var t1 = H._instanceType(this);
+      return new H.CastIterator(J.get$iterator$ax(this.get$_source()), t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("CastIterator<1,2>"));
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this.get$_source());
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this.get$_source());
+    },
+    get$isNotEmpty: function(_) {
+      return J.get$isNotEmpty$asx(this.get$_source());
+    },
+    skip$1: function(_, count) {
+      var t1 = H._instanceType(this);
+      return H.CastIterable_CastIterable(J.skip$1$ax(this.get$_source(), count), t1._precomputed1, t1._rest[1]);
+    },
+    take$1: function(_, count) {
+      var t1 = H._instanceType(this);
+      return H.CastIterable_CastIterable(J.take$1$ax(this.get$_source(), count), t1._precomputed1, t1._rest[1]);
+    },
+    elementAt$1: function(_, index) {
+      return H._instanceType(this)._rest[1]._as(J.elementAt$1$ax(this.get$_source(), index));
+    },
+    get$first: function(_) {
+      return H._instanceType(this)._rest[1]._as(J.get$first$ax(this.get$_source()));
+    },
+    get$last: function(_) {
+      return H._instanceType(this)._rest[1]._as(J.get$last$ax(this.get$_source()));
+    },
+    get$single: function(_) {
+      return H._instanceType(this)._rest[1]._as(J.get$single$ax(this.get$_source()));
+    },
+    contains$1: function(_, other) {
+      return J.contains$1$asx(this.get$_source(), other);
+    },
+    toString$0: function(_) {
+      return J.toString$0$(this.get$_source());
+    }
+  };
+  H.CastIterator.prototype = {
+    moveNext$0: function() {
+      return this._source.moveNext$0();
+    },
+    get$current: function(_) {
+      var t1 = this._source;
+      return this.$ti._rest[1]._as(t1.get$current(t1));
+    }
+  };
+  H.CastIterable.prototype = {
+    cast$1$0: function(_, $R) {
+      return H.CastIterable_CastIterable(this._source, H._instanceType(this)._precomputed1, $R);
+    },
+    get$_source: function() {
+      return this._source;
+    }
+  };
+  H._EfficientLengthCastIterable.prototype = {$isEfficientLengthIterable: 1};
+  H._CastListBase.prototype = {
+    $index: function(_, index) {
+      return this.$ti._rest[1]._as(J.$index$asx(this._source, index));
+    },
+    $indexSet: function(_, index, value) {
+      J.$indexSet$ax(this._source, index, this.$ti._precomputed1._as(value));
+    },
+    set$length: function(_, $length) {
+      J.set$length$asx(this._source, $length);
+    },
+    add$1: function(_, value) {
+      J.add$1$ax(this._source, this.$ti._precomputed1._as(value));
+    },
+    addAll$1: function(_, values) {
+      var t1 = this.$ti;
+      J.addAll$1$ax(this._source, H.CastIterable_CastIterable(values, t1._rest[1], t1._precomputed1));
+    },
+    sort$1: function(_, compare) {
+      var t1 = compare == null ? null : new H._CastListBase_sort_closure(this, compare);
+      J.sort$1$ax(this._source, t1);
+    },
+    getRange$2: function(_, start, end) {
+      var t1 = this.$ti;
+      return H.CastIterable_CastIterable(J.getRange$2$ax(this._source, start, end), t1._precomputed1, t1._rest[1]);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      var t1 = this.$ti;
+      J.setRange$4$ax(this._source, start, end, H.CastIterable_CastIterable(iterable, t1._rest[1], t1._precomputed1), skipCount);
+    },
+    fillRange$3: function(_, start, end, fillValue) {
+      J.fillRange$3$ax(this._source, start, end, this.$ti._precomputed1._as(fillValue));
+    },
+    $isEfficientLengthIterable: 1,
+    $isList: 1
+  };
+  H._CastListBase_sort_closure.prototype = {
+    call$2: function(v1, v2) {
+      var t1 = this.$this.$ti._rest[1];
+      return this.compare.call$2(t1._as(v1), t1._as(v2));
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("int(1,1)");
+    }
+  };
+  H.CastList.prototype = {
+    cast$1$0: function(_, $R) {
+      return new H.CastList(this._source, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
+    },
+    get$_source: function() {
+      return this._source;
+    }
+  };
+  H.CastSet.prototype = {
+    cast$1$0: function(_, $R) {
+      return new H.CastSet(this._source, this._emptySet, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastSet<1,2>"));
+    },
+    add$1: function(_, value) {
+      return this._source.add$1(0, this.$ti._precomputed1._as(value));
+    },
+    addAll$1: function(_, elements) {
+      var t1 = this.$ti;
+      this._source.addAll$1(0, H.CastIterable_CastIterable(elements, t1._rest[1], t1._precomputed1));
+    },
+    toSet$0: function(_) {
+      var emptySet = this._emptySet,
+        t1 = this.$ti._rest[1],
+        result = emptySet == null ? P.LinkedHashSet_LinkedHashSet(t1) : emptySet.call$1$0(t1);
+      result.addAll$1(0, this);
+      return result;
+    },
+    $isEfficientLengthIterable: 1,
+    $isSet: 1,
+    get$_source: function() {
+      return this._source;
+    }
+  };
+  H.CastQueue.prototype = {
+    cast$1$0: function(_, $R) {
+      return new H.CastQueue(this._source, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastQueue<1,2>"));
+    },
+    add$1: function(_, value) {
+      this._source._add$1(this.$ti._precomputed1._as(value));
+    },
+    $isEfficientLengthIterable: 1,
+    $isQueue: 1,
+    get$_source: function() {
+      return this._source;
+    }
+  };
+  H.LateInitializationErrorImpl.prototype = {
+    toString$0: function(_) {
+      var t1 = "LateInitializationError: " + this.__internal$_message;
+      return t1;
+    }
+  };
+  H.CodeUnits.prototype = {
+    get$length: function(_) {
+      return this._string.length;
+    },
+    $index: function(_, i) {
+      return C.JSString_methods.codeUnitAt$1(this._string, i);
+    }
+  };
+  H.EfficientLengthIterable.prototype = {};
+  H.ListIterable.prototype = {
+    get$iterator: function(_) {
+      return new H.ListIterator(this, this.get$length(this));
+    },
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$first: function(_) {
+      if (this.get$length(this) === 0)
+        throw H.wrapException(H.IterableElementError_noElement());
+      return this.elementAt$1(0, 0);
+    },
+    get$last: function(_) {
+      var _this = this;
+      if (_this.get$length(_this) === 0)
+        throw H.wrapException(H.IterableElementError_noElement());
+      return _this.elementAt$1(0, _this.get$length(_this) - 1);
+    },
+    get$single: function(_) {
+      var _this = this;
+      if (_this.get$length(_this) === 0)
+        throw H.wrapException(H.IterableElementError_noElement());
+      if (_this.get$length(_this) > 1)
+        throw H.wrapException(H.IterableElementError_tooMany());
+      return _this.elementAt$1(0, 0);
+    },
+    contains$1: function(_, element) {
+      var i, _this = this,
+        $length = _this.get$length(_this);
+      for (i = 0; i < $length; ++i) {
+        if (J.$eq$(_this.elementAt$1(0, i), element))
+          return true;
+        if ($length !== _this.get$length(_this))
+          throw H.wrapException(P.ConcurrentModificationError$(_this));
+      }
+      return false;
+    },
+    any$1: function(_, test) {
+      var i, _this = this,
+        $length = _this.get$length(_this);
+      for (i = 0; i < $length; ++i) {
+        if (test.call$1(_this.elementAt$1(0, i)))
+          return true;
+        if ($length !== _this.get$length(_this))
+          throw H.wrapException(P.ConcurrentModificationError$(_this));
+      }
+      return false;
+    },
+    join$1: function(_, separator) {
+      var first, t1, i, _this = this,
+        $length = _this.get$length(_this);
+      if (separator.length !== 0) {
+        if ($length === 0)
+          return "";
+        first = H.S(_this.elementAt$1(0, 0));
+        if ($length !== _this.get$length(_this))
+          throw H.wrapException(P.ConcurrentModificationError$(_this));
+        for (t1 = first, i = 1; i < $length; ++i) {
+          t1 = t1 + separator + H.S(_this.elementAt$1(0, i));
+          if ($length !== _this.get$length(_this))
+            throw H.wrapException(P.ConcurrentModificationError$(_this));
+        }
+        return t1.charCodeAt(0) == 0 ? t1 : t1;
+      } else {
+        for (i = 0, t1 = ""; i < $length; ++i) {
+          t1 += H.S(_this.elementAt$1(0, i));
+          if ($length !== _this.get$length(_this))
+            throw H.wrapException(P.ConcurrentModificationError$(_this));
+        }
+        return t1.charCodeAt(0) == 0 ? t1 : t1;
+      }
+    },
+    join$0: function($receiver) {
+      return this.join$1($receiver, "");
+    },
+    where$1: function(_, test) {
+      return this.super$Iterable$where(0, test);
+    },
+    map$1$1: function(_, f, $T) {
+      return new H.MappedListIterable(this, f, H._instanceType(this)._eval$1("@<ListIterable.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
+    },
+    reduce$1: function(_, combine) {
+      var value, i, _this = this,
+        $length = _this.get$length(_this);
+      if ($length === 0)
+        throw H.wrapException(H.IterableElementError_noElement());
+      value = _this.elementAt$1(0, 0);
+      for (i = 1; i < $length; ++i) {
+        value = combine.call$2(value, _this.elementAt$1(0, i));
+        if ($length !== _this.get$length(_this))
+          throw H.wrapException(P.ConcurrentModificationError$(_this));
+      }
+      return value;
+    },
+    fold$1$2: function(_, initialValue, combine) {
+      var value, i, _this = this,
+        $length = _this.get$length(_this);
+      for (value = initialValue, i = 0; i < $length; ++i) {
+        value = combine.call$2(value, _this.elementAt$1(0, i));
+        if ($length !== _this.get$length(_this))
+          throw H.wrapException(P.ConcurrentModificationError$(_this));
+      }
+      return value;
+    },
+    fold$2: function($receiver, initialValue, combine) {
+      return this.fold$1$2($receiver, initialValue, combine, type$.dynamic);
+    },
+    skip$1: function(_, count) {
+      return H.SubListIterable$(this, count, null, H._instanceType(this)._eval$1("ListIterable.E"));
+    },
+    take$1: function(_, count) {
+      return H.SubListIterable$(this, 0, count, H._instanceType(this)._eval$1("ListIterable.E"));
+    },
+    toList$1$growable: function(_, growable) {
+      return P.List_List$from(this, growable, H._instanceType(this)._eval$1("ListIterable.E"));
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    toSet$0: function(_) {
+      var i, _this = this,
+        result = P.LinkedHashSet_LinkedHashSet(H._instanceType(_this)._eval$1("ListIterable.E"));
+      for (i = 0; i < _this.get$length(_this); ++i)
+        result.add$1(0, _this.elementAt$1(0, i));
+      return result;
+    }
+  };
+  H.SubListIterable.prototype = {
+    SubListIterable$3: function(_iterable, _start, _endOrLength, $E) {
+      var endOrLength,
+        t1 = this._start;
+      P.RangeError_checkNotNegative(t1, "start");
+      endOrLength = this._endOrLength;
+      if (endOrLength != null) {
+        P.RangeError_checkNotNegative(endOrLength, "end");
+        if (t1 > endOrLength)
+          throw H.wrapException(P.RangeError$range(t1, 0, endOrLength, "start", null));
+      }
+    },
+    get$_endIndex: function() {
+      var $length = J.get$length$asx(this.__internal$_iterable),
+        endOrLength = this._endOrLength;
+      if (endOrLength == null || endOrLength > $length)
+        return $length;
+      return endOrLength;
+    },
+    get$_startIndex: function() {
+      var $length = J.get$length$asx(this.__internal$_iterable),
+        t1 = this._start;
+      if (t1 > $length)
+        return $length;
+      return t1;
+    },
+    get$length: function(_) {
+      var endOrLength,
+        $length = J.get$length$asx(this.__internal$_iterable),
+        t1 = this._start;
+      if (t1 >= $length)
+        return 0;
+      endOrLength = this._endOrLength;
+      if (endOrLength == null || endOrLength >= $length)
+        return $length - t1;
+      return endOrLength - t1;
+    },
+    elementAt$1: function(_, index) {
+      var _this = this,
+        realIndex = _this.get$_startIndex() + index;
+      if (index < 0 || realIndex >= _this.get$_endIndex())
+        throw H.wrapException(P.IndexError$(index, _this, "index", null, null));
+      return J.elementAt$1$ax(_this.__internal$_iterable, realIndex);
+    },
+    skip$1: function(_, count) {
+      var newStart, endOrLength, _this = this;
+      P.RangeError_checkNotNegative(count, "count");
+      newStart = _this._start + count;
+      endOrLength = _this._endOrLength;
+      if (endOrLength != null && newStart >= endOrLength)
+        return new H.EmptyIterable(_this.$ti._eval$1("EmptyIterable<1>"));
+      return H.SubListIterable$(_this.__internal$_iterable, newStart, endOrLength, _this.$ti._precomputed1);
+    },
+    take$1: function(_, count) {
+      var endOrLength, t1, newEnd, _this = this;
+      P.RangeError_checkNotNegative(count, "count");
+      endOrLength = _this._endOrLength;
+      t1 = _this._start;
+      if (endOrLength == null)
+        return H.SubListIterable$(_this.__internal$_iterable, t1, t1 + count, _this.$ti._precomputed1);
+      else {
+        newEnd = t1 + count;
+        if (endOrLength < newEnd)
+          return _this;
+        return H.SubListIterable$(_this.__internal$_iterable, t1, newEnd, _this.$ti._precomputed1);
+      }
+    },
+    toList$1$growable: function(_, growable) {
+      var $length, result, i, _this = this,
+        start = _this._start,
+        t1 = _this.__internal$_iterable,
+        t2 = J.getInterceptor$asx(t1),
+        end = t2.get$length(t1),
+        endOrLength = _this._endOrLength;
+      if (endOrLength != null && endOrLength < end)
+        end = endOrLength;
+      $length = end - start;
+      if ($length <= 0) {
+        t1 = _this.$ti._precomputed1;
+        return growable ? J.JSArray_JSArray$growable(0, t1) : J.JSArray_JSArray$fixed(0, t1);
+      }
+      result = P.List_List$filled($length, t2.elementAt$1(t1, start), growable, _this.$ti._precomputed1);
+      for (i = 1; i < $length; ++i) {
+        result[i] = t2.elementAt$1(t1, start + i);
+        if (t2.get$length(t1) < end)
+          throw H.wrapException(P.ConcurrentModificationError$(_this));
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    }
+  };
+  H.ListIterator.prototype = {
+    get$current: function(_) {
+      var cur = this.__internal$_current;
+      return cur;
+    },
+    moveNext$0: function() {
+      var t3, _this = this,
+        t1 = _this.__internal$_iterable,
+        t2 = J.getInterceptor$asx(t1),
+        $length = t2.get$length(t1);
+      if (_this.__internal$_length !== $length)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t3 = _this.__internal$_index;
+      if (t3 >= $length) {
+        _this.__internal$_current = null;
+        return false;
+      }
+      _this.__internal$_current = t2.elementAt$1(t1, t3);
+      ++_this.__internal$_index;
+      return true;
+    }
+  };
+  H.MappedIterable.prototype = {
+    get$iterator: function(_) {
+      return new H.MappedIterator(J.get$iterator$ax(this.__internal$_iterable), this._f);
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this.__internal$_iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this.__internal$_iterable);
+    },
+    get$first: function(_) {
+      return this._f.call$1(J.get$first$ax(this.__internal$_iterable));
+    },
+    get$last: function(_) {
+      return this._f.call$1(J.get$last$ax(this.__internal$_iterable));
+    },
+    get$single: function(_) {
+      return this._f.call$1(J.get$single$ax(this.__internal$_iterable));
+    },
+    elementAt$1: function(_, index) {
+      return this._f.call$1(J.elementAt$1$ax(this.__internal$_iterable, index));
+    }
+  };
+  H.EfficientLengthMappedIterable.prototype = {$isEfficientLengthIterable: 1};
+  H.MappedIterator.prototype = {
+    moveNext$0: function() {
+      var _this = this,
+        t1 = _this._iterator;
+      if (t1.moveNext$0()) {
+        _this.__internal$_current = _this._f.call$1(t1.get$current(t1));
+        return true;
+      }
+      _this.__internal$_current = null;
+      return false;
+    },
+    get$current: function(_) {
+      var cur = this.__internal$_current;
+      return cur;
+    }
+  };
+  H.MappedListIterable.prototype = {
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      return this._f.call$1(J.elementAt$1$ax(this._source, index));
+    }
+  };
+  H.WhereIterable.prototype = {
+    get$iterator: function(_) {
+      return new H.WhereIterator(J.get$iterator$ax(this.__internal$_iterable), this._f);
+    },
+    map$1$1: function(_, f, $T) {
+      return new H.MappedIterable(this, f, this.$ti._eval$1("@<1>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
+    }
+  };
+  H.WhereIterator.prototype = {
+    moveNext$0: function() {
+      var t1, t2;
+      for (t1 = this._iterator, t2 = this._f; t1.moveNext$0();)
+        if (t2.call$1(t1.get$current(t1)))
+          return true;
+      return false;
+    },
+    get$current: function(_) {
+      var t1 = this._iterator;
+      return t1.get$current(t1);
+    }
+  };
+  H.ExpandIterable.prototype = {
+    get$iterator: function(_) {
+      return new H.ExpandIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, C.C_EmptyIterator);
+    }
+  };
+  H.ExpandIterator.prototype = {
+    get$current: function(_) {
+      var cur = this.__internal$_current;
+      return cur;
+    },
+    moveNext$0: function() {
+      var t2, t3, _this = this,
+        t1 = _this._currentExpansion;
+      if (t1 == null)
+        return false;
+      for (t2 = _this._iterator, t3 = _this._f; !t1.moveNext$0();) {
+        _this.__internal$_current = null;
+        if (t2.moveNext$0()) {
+          _this._currentExpansion = null;
+          t1 = J.get$iterator$ax(t3.call$1(t2.get$current(t2)));
+          _this._currentExpansion = t1;
+        } else
+          return false;
+      }
+      t1 = _this._currentExpansion;
+      _this.__internal$_current = t1.get$current(t1);
+      return true;
+    }
+  };
+  H.TakeIterable.prototype = {
+    get$iterator: function(_) {
+      return new H.TakeIterator(J.get$iterator$ax(this.__internal$_iterable), this._takeCount);
+    }
+  };
+  H.EfficientLengthTakeIterable.prototype = {
+    get$length: function(_) {
+      var iterableLength = J.get$length$asx(this.__internal$_iterable),
+        t1 = this._takeCount;
+      if (iterableLength > t1)
+        return t1;
+      return iterableLength;
+    },
+    $isEfficientLengthIterable: 1
+  };
+  H.TakeIterator.prototype = {
+    moveNext$0: function() {
+      if (--this._remaining >= 0)
+        return this._iterator.moveNext$0();
+      this._remaining = -1;
+      return false;
+    },
+    get$current: function(_) {
+      var t1;
+      if (this._remaining < 0)
+        return null;
+      t1 = this._iterator;
+      return t1.get$current(t1);
+    }
+  };
+  H.SkipIterable.prototype = {
+    skip$1: function(_, count) {
+      P.ArgumentError_checkNotNull(count, "count");
+      P.RangeError_checkNotNegative(count, "count");
+      return new H.SkipIterable(this.__internal$_iterable, this._skipCount + count, H._instanceType(this)._eval$1("SkipIterable<1>"));
+    },
+    get$iterator: function(_) {
+      return new H.SkipIterator(J.get$iterator$ax(this.__internal$_iterable), this._skipCount);
+    }
+  };
+  H.EfficientLengthSkipIterable.prototype = {
+    get$length: function(_) {
+      var $length = J.get$length$asx(this.__internal$_iterable) - this._skipCount;
+      if ($length >= 0)
+        return $length;
+      return 0;
+    },
+    skip$1: function(_, count) {
+      P.ArgumentError_checkNotNull(count, "count");
+      P.RangeError_checkNotNegative(count, "count");
+      return new H.EfficientLengthSkipIterable(this.__internal$_iterable, this._skipCount + count, this.$ti);
+    },
+    $isEfficientLengthIterable: 1
+  };
+  H.SkipIterator.prototype = {
+    moveNext$0: function() {
+      var t1, i;
+      for (t1 = this._iterator, i = 0; i < this._skipCount; ++i)
+        t1.moveNext$0();
+      this._skipCount = 0;
+      return t1.moveNext$0();
+    },
+    get$current: function(_) {
+      var t1 = this._iterator;
+      return t1.get$current(t1);
+    }
+  };
+  H.SkipWhileIterable.prototype = {
+    get$iterator: function(_) {
+      return new H.SkipWhileIterator(J.get$iterator$ax(this.__internal$_iterable), this._f);
+    }
+  };
+  H.SkipWhileIterator.prototype = {
+    moveNext$0: function() {
+      var t1, t2, _this = this;
+      if (!_this._hasSkipped) {
+        _this._hasSkipped = true;
+        for (t1 = _this._iterator, t2 = _this._f; t1.moveNext$0();)
+          if (!t2.call$1(t1.get$current(t1)))
+            return true;
+      }
+      return _this._iterator.moveNext$0();
+    },
+    get$current: function(_) {
+      var t1 = this._iterator;
+      return t1.get$current(t1);
+    }
+  };
+  H.EmptyIterable.prototype = {
+    get$iterator: function(_) {
+      return C.C_EmptyIterator;
+    },
+    get$isEmpty: function(_) {
+      return true;
+    },
+    get$length: function(_) {
+      return 0;
+    },
+    get$first: function(_) {
+      throw H.wrapException(H.IterableElementError_noElement());
+    },
+    get$last: function(_) {
+      throw H.wrapException(H.IterableElementError_noElement());
+    },
+    get$single: function(_) {
+      throw H.wrapException(H.IterableElementError_noElement());
+    },
+    elementAt$1: function(_, index) {
+      throw H.wrapException(P.RangeError$range(index, 0, 0, "index", null));
+    },
+    contains$1: function(_, element) {
+      return false;
+    },
+    join$1: function(_, separator) {
+      return "";
+    },
+    join$0: function($receiver) {
+      return this.join$1($receiver, "");
+    },
+    where$1: function(_, test) {
+      return this;
+    },
+    map$1$1: function(_, f, $T) {
+      return new H.EmptyIterable($T._eval$1("EmptyIterable<0>"));
+    },
+    skip$1: function(_, count) {
+      P.RangeError_checkNotNegative(count, "count");
+      return this;
+    },
+    take$1: function(_, count) {
+      P.RangeError_checkNotNegative(count, "count");
+      return this;
+    },
+    toList$1$growable: function(_, growable) {
+      var t1 = this.$ti._precomputed1;
+      return growable ? J.JSArray_JSArray$growable(0, t1) : J.JSArray_JSArray$fixed(0, t1);
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    toSet$0: function(_) {
+      return P.LinkedHashSet_LinkedHashSet(this.$ti._precomputed1);
+    }
+  };
+  H.EmptyIterator.prototype = {
+    moveNext$0: function() {
+      return false;
+    },
+    get$current: function(_) {
+      throw H.wrapException(H.IterableElementError_noElement());
+    }
+  };
+  H.FollowedByIterable.prototype = {
+    get$iterator: function(_) {
+      return new H.FollowedByIterator(J.get$iterator$ax(this.__internal$_first), this._second);
+    },
+    get$length: function(_) {
+      var t1 = this._second;
+      return J.get$length$asx(this.__internal$_first) + t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1;
+      if (J.get$isEmpty$asx(this.__internal$_first)) {
+        t1 = this._second;
+        t1 = t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$isNotEmpty: function(_) {
+      var t1;
+      if (!J.get$isNotEmpty$asx(this.__internal$_first)) {
+        t1 = this._second;
+        t1 = t1.get$isNotEmpty(t1);
+      } else
+        t1 = true;
+      return t1;
+    },
+    contains$1: function(_, value) {
+      return J.contains$1$asx(this.__internal$_first, value) || this._second.contains$1(0, value);
+    },
+    get$first: function(_) {
+      var t1,
+        iterator = J.get$iterator$ax(this.__internal$_first);
+      if (iterator.moveNext$0())
+        return iterator.get$current(iterator);
+      t1 = this._second;
+      return t1.get$first(t1);
+    },
+    get$last: function(_) {
+      var last,
+        t1 = this._second,
+        iterator = t1.get$iterator(t1);
+      if (iterator.moveNext$0()) {
+        last = iterator.get$current(iterator);
+        for (; iterator.moveNext$0();)
+          last = iterator.get$current(iterator);
+        return last;
+      }
+      return J.get$last$ax(this.__internal$_first);
+    }
+  };
+  H.EfficientLengthFollowedByIterable.prototype = {
+    elementAt$1: function(_, index) {
+      var t1 = this.__internal$_first,
+        t2 = J.getInterceptor$asx(t1),
+        firstLength = t2.get$length(t1);
+      if (index < firstLength)
+        return t2.elementAt$1(t1, index);
+      return this._second.elementAt$1(0, index - firstLength);
+    },
+    get$first: function(_) {
+      var t1 = this.__internal$_first,
+        t2 = J.getInterceptor$asx(t1);
+      if (t2.get$isNotEmpty(t1))
+        return t2.get$first(t1);
+      t1 = this._second;
+      return t1.get$first(t1);
+    },
+    get$last: function(_) {
+      var t1 = this._second;
+      if (t1.get$isNotEmpty(t1))
+        return t1.get$last(t1);
+      return J.get$last$ax(this.__internal$_first);
+    },
+    $isEfficientLengthIterable: 1
+  };
+  H.FollowedByIterator.prototype = {
+    moveNext$0: function() {
+      var t1, _this = this;
+      if (_this._currentIterator.moveNext$0())
+        return true;
+      t1 = _this._nextIterable;
+      if (t1 != null) {
+        t1 = t1.get$iterator(t1);
+        _this._currentIterator = t1;
+        _this._nextIterable = null;
+        return t1.moveNext$0();
+      }
+      return false;
+    },
+    get$current: function(_) {
+      var t1 = this._currentIterator;
+      return t1.get$current(t1);
+    }
+  };
+  H.WhereTypeIterable.prototype = {
+    get$iterator: function(_) {
+      return new H.WhereTypeIterator(J.get$iterator$ax(this._source), this.$ti._eval$1("WhereTypeIterator<1>"));
+    }
+  };
+  H.WhereTypeIterator.prototype = {
+    moveNext$0: function() {
+      var t1, t2;
+      for (t1 = this._source, t2 = this.$ti._precomputed1; t1.moveNext$0();)
+        if (t2._is(t1.get$current(t1)))
+          return true;
+      return false;
+    },
+    get$current: function(_) {
+      var t1 = this._source;
+      return this.$ti._precomputed1._as(t1.get$current(t1));
+    }
+  };
+  H.FixedLengthListMixin.prototype = {
+    set$length: function(receiver, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of a fixed-length list"));
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    }
+  };
+  H.UnmodifiableListMixin.prototype = {
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of an unmodifiable list"));
+    },
+    add$1: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    addAll$1: function(_, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    fillRange$3: function(_, start, end, fillValue) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    }
+  };
+  H.UnmodifiableListBase.prototype = {};
+  H.ReversedListIterable.prototype = {
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      var t1 = this._source,
+        t2 = J.getInterceptor$asx(t1);
+      return t2.elementAt$1(t1, t2.get$length(t1) - 1 - index);
+    }
+  };
+  H.Symbol.prototype = {
+    get$hashCode: function(_) {
+      var hash = this._hashCode;
+      if (hash != null)
+        return hash;
+      hash = 536870911 & 664597 * J.get$hashCode$(this.__internal$_name);
+      this._hashCode = hash;
+      return hash;
+    },
+    toString$0: function(_) {
+      return 'Symbol("' + H.S(this.__internal$_name) + '")';
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof H.Symbol && this.__internal$_name == other.__internal$_name;
+    },
+    $isSymbol0: 1
+  };
+  H.__CastListBase__CastIterableBase_ListMixin.prototype = {};
+  H.ConstantMapView.prototype = {};
+  H.ConstantMap.prototype = {
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    toString$0: function(_) {
+      return P.MapBase_mapToString(this);
+    },
+    $indexSet: function(_, key, val) {
+      H.ConstantMap__throwUnmodifiable();
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      H.ConstantMap__throwUnmodifiable();
+    },
+    remove$1: function(_, key) {
+      H.ConstantMap__throwUnmodifiable();
+    },
+    addAll$1: function(_, other) {
+      return H.ConstantMap__throwUnmodifiable();
+    },
+    get$entries: function(_) {
+      return this.entries$body$ConstantMap(_, H._instanceType(this)._eval$1("MapEntry<1,2>"));
+    },
+    entries$body$ConstantMap: function($async$_, $async$type) {
+      var $async$self = this;
+      return P._makeSyncStarIterable(function() {
+        var _ = $async$_;
+        var $async$goto = 0, $async$handler = 1, $async$currentError, t1, t2, key, t3;
+        return function $async$get$entries($async$errorCode, $async$result) {
+          if ($async$errorCode === 1) {
+            $async$currentError = $async$result;
+            $async$goto = $async$handler;
+          }
+          while (true)
+            switch ($async$goto) {
+              case 0:
+                // Function start
+                t1 = $async$self.get$keys($async$self), t1 = t1.get$iterator(t1), t2 = H._instanceType($async$self), t2 = t2._eval$1("@<1>")._bind$1(t2._rest[1])._eval$1("MapEntry<1,2>");
+              case 2:
+                // for condition
+                if (!t1.moveNext$0()) {
+                  // goto after for
+                  $async$goto = 3;
+                  break;
+                }
+                key = t1.get$current(t1);
+                t3 = $async$self.$index(0, key);
+                t3.toString;
+                $async$goto = 4;
+                return new P.MapEntry(key, t3, t2);
+              case 4:
+                // after yield
+                // goto for condition
+                $async$goto = 2;
+                break;
+              case 3:
+                // after for
+                // implicit return
+                return P._IterationMarker_endOfIteration();
+              case 1:
+                // rethrow
+                return P._IterationMarker_uncaughtError($async$currentError);
+            }
+        };
+      }, $async$type);
+    },
+    $isMap: 1
+  };
+  H.ConstantStringMap.prototype = {
+    get$length: function(_) {
+      return this.__js_helper$_length;
+    },
+    containsKey$1: function(key) {
+      if (typeof key != "string")
+        return false;
+      if ("__proto__" === key)
+        return false;
+      return this._jsObject.hasOwnProperty(key);
+    },
+    $index: function(_, key) {
+      if (!this.containsKey$1(key))
+        return null;
+      return this._fetch$1(key);
+    },
+    _fetch$1: function(key) {
+      return this._jsObject[key];
+    },
+    forEach$1: function(_, f) {
+      var t1, i, key,
+        keys = this.__js_helper$_keys;
+      for (t1 = keys.length, i = 0; i < t1; ++i) {
+        key = keys[i];
+        f.call$2(key, this._fetch$1(key));
+      }
+    },
+    get$keys: function(_) {
+      return new H._ConstantMapKeyIterable(this, H._instanceType(this)._eval$1("_ConstantMapKeyIterable<1>"));
+    },
+    get$values: function(_) {
+      var t1 = H._instanceType(this);
+      return H.MappedIterable_MappedIterable(this.__js_helper$_keys, new H.ConstantStringMap_values_closure(this), t1._precomputed1, t1._rest[1]);
+    }
+  };
+  H.ConstantStringMap_values_closure.prototype = {
+    call$1: function(key) {
+      return this.$this._fetch$1(key);
+    },
+    $signature: function() {
+      return H._instanceType(this.$this)._eval$1("2(1)");
+    }
+  };
+  H.ConstantProtoMap.prototype = {
+    containsKey$1: function(key) {
+      if (typeof key != "string")
+        return false;
+      if ("__proto__" === key)
+        return true;
+      return this._jsObject.hasOwnProperty(key);
+    },
+    _fetch$1: function(key) {
+      return "__proto__" === key ? this._protoValue : this._jsObject[key];
+    }
+  };
+  H._ConstantMapKeyIterable.prototype = {
+    get$iterator: function(_) {
+      var t1 = this._map.__js_helper$_keys;
+      return new J.ArrayIterator(t1, t1.length);
+    },
+    get$length: function(_) {
+      return this._map.__js_helper$_keys.length;
+    }
+  };
+  H.Instantiation.prototype = {
+    Instantiation$1: function(_genericClosure) {
+      if (false)
+        H.instantiatedGenericFunctionType(0, 0);
+    },
+    toString$0: function(_) {
+      var types = "<" + C.JSArray_methods.join$1(this.get$_types(), ", ") + ">";
+      return H.S(this._genericClosure) + " with " + types;
+    }
+  };
+  H.Instantiation1.prototype = {
+    get$_types: function() {
+      return [H.createRuntimeType(this.$ti._precomputed1)];
+    },
+    call$2: function(a0, a1) {
+      return this._genericClosure.call$1$2(a0, a1, this.$ti._rest[0]);
+    },
+    call$0: function() {
+      return this._genericClosure.call$1$0(this.$ti._rest[0]);
+    },
+    call$3: function(a0, a1, a2) {
+      return this._genericClosure.call$1$3(a0, a1, a2, this.$ti._rest[0]);
+    },
+    call$4: function(a0, a1, a2, a3) {
+      return this._genericClosure.call$1$4(a0, a1, a2, a3, this.$ti._rest[0]);
+    },
+    $signature: function() {
+      return H.instantiatedGenericFunctionType(H.closureFunctionType(this._genericClosure), this.$ti);
+    }
+  };
+  H.JSInvocationMirror.prototype = {
+    get$memberName: function() {
+      var t1 = this.__js_helper$_memberName;
+      return t1;
+    },
+    get$positionalArguments: function() {
+      var t1, argumentCount, list, index, _this = this;
+      if (_this.__js_helper$_kind === 1)
+        return C.List_empty22;
+      t1 = _this._arguments;
+      argumentCount = t1.length - _this._namedArgumentNames.length - _this._typeArgumentCount;
+      if (argumentCount === 0)
+        return C.List_empty22;
+      list = [];
+      for (index = 0; index < argumentCount; ++index)
+        list.push(t1[index]);
+      return J.JSArray_markUnmodifiableList(list);
+    },
+    get$namedArguments: function() {
+      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, _this = this;
+      if (_this.__js_helper$_kind !== 0)
+        return C.Map_empty10;
+      t1 = _this._namedArgumentNames;
+      namedArgumentCount = t1.length;
+      t2 = _this._arguments;
+      namedArgumentsStartIndex = t2.length - namedArgumentCount - _this._typeArgumentCount;
+      if (namedArgumentCount === 0)
+        return C.Map_empty10;
+      map = new H.JsLinkedHashMap(type$.JsLinkedHashMap_Symbol_dynamic);
+      for (i = 0; i < namedArgumentCount; ++i)
+        map.$indexSet(0, new H.Symbol(t1[i]), t2[namedArgumentsStartIndex + i]);
+      return new H.ConstantMapView(map, type$.ConstantMapView_Symbol_dynamic);
+    }
+  };
+  H.Primitives_functionNoSuchMethod_closure.prototype = {
+    call$2: function($name, argument) {
+      var t1 = this._box_0;
+      t1.names = t1.names + "$" + H.S($name);
+      this.namedArgumentList.push($name);
+      this.$arguments.push(argument);
+      ++t1.argumentCount;
+    },
+    $signature: 313
+  };
+  H.TypeErrorDecoder.prototype = {
+    matchTypeError$1: function(message) {
+      var result, t1, _this = this,
+        match = new RegExp(_this._pattern).exec(message);
+      if (match == null)
+        return null;
+      result = Object.create(null);
+      t1 = _this._arguments;
+      if (t1 !== -1)
+        result.arguments = match[t1 + 1];
+      t1 = _this._argumentsExpr;
+      if (t1 !== -1)
+        result.argumentsExpr = match[t1 + 1];
+      t1 = _this._expr;
+      if (t1 !== -1)
+        result.expr = match[t1 + 1];
+      t1 = _this._method;
+      if (t1 !== -1)
+        result.method = match[t1 + 1];
+      t1 = _this._receiver;
+      if (t1 !== -1)
+        result.receiver = match[t1 + 1];
+      return result;
+    }
+  };
+  H.NullError.prototype = {
+    toString$0: function(_) {
+      var t1 = this._method;
+      if (t1 == null)
+        return "NoSuchMethodError: " + H.S(this.__js_helper$_message);
+      return "NoSuchMethodError: method not found: '" + t1 + "' on null";
+    }
+  };
+  H.JsNoSuchMethodError.prototype = {
+    toString$0: function(_) {
+      var t2, _this = this,
+        _s38_ = "NoSuchMethodError: method not found: '",
+        t1 = _this._method;
+      if (t1 == null)
+        return "NoSuchMethodError: " + H.S(_this.__js_helper$_message);
+      t2 = _this._receiver;
+      if (t2 == null)
+        return _s38_ + t1 + "' (" + H.S(_this.__js_helper$_message) + ")";
+      return _s38_ + t1 + "' on '" + t2 + "' (" + H.S(_this.__js_helper$_message) + ")";
+    }
+  };
+  H.UnknownJsTypeError.prototype = {
+    toString$0: function(_) {
+      var t1 = this.__js_helper$_message;
+      return t1.length === 0 ? "Error" : "Error: " + t1;
+    }
+  };
+  H.NullThrownFromJavaScriptException.prototype = {
+    toString$0: function(_) {
+      return "Throw of null ('" + (this._irritant === null ? "null" : "undefined") + "' from JavaScript)";
+    },
+    $isException: 1
+  };
+  H.ExceptionAndStackTrace.prototype = {};
+  H._StackTrace.prototype = {
+    toString$0: function(_) {
+      var trace,
+        t1 = this._trace;
+      if (t1 != null)
+        return t1;
+      t1 = this._exception;
+      trace = t1 !== null && typeof t1 === "object" ? t1.stack : null;
+      return this._trace = trace == null ? "" : trace;
+    },
+    $isStackTrace: 1
+  };
+  H.Closure.prototype = {
+    toString$0: function(_) {
+      var $constructor = this.constructor,
+        $name = $constructor == null ? null : $constructor.name;
+      return "Closure '" + H.unminifyOrTag($name == null ? "unknown" : $name) + "'";
+    },
+    $isFunction: 1,
+    get$$call: function() {
+      return this;
+    },
+    "call*": "call$1",
+    $requiredArgCount: 1,
+    $defaultValues: null
+  };
+  H.TearOffClosure.prototype = {};
+  H.StaticClosure.prototype = {
+    toString$0: function(_) {
+      var $name = this.$static_name;
+      if ($name == null)
+        return "Closure of unknown static method";
+      return "Closure '" + H.unminifyOrTag($name) + "'";
+    }
+  };
+  H.BoundClosure.prototype = {
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      if (_this === other)
+        return true;
+      if (!(other instanceof H.BoundClosure))
+        return false;
+      return _this._self === other._self && _this._target === other._target && _this._receiver === other._receiver;
+    },
+    get$hashCode: function(_) {
+      var receiverHashCode,
+        t1 = this._receiver;
+      if (t1 == null)
+        receiverHashCode = H.Primitives_objectHashCode(this._self);
+      else
+        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
+      return (receiverHashCode ^ H.Primitives_objectHashCode(this._target)) >>> 0;
+    },
+    toString$0: function(_) {
+      var receiver = this._receiver;
+      if (receiver == null)
+        receiver = this._self;
+      return "Closure '" + H.S(this.__js_helper$_name) + "' of " + ("Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'");
+    }
+  };
+  H.RuntimeError.prototype = {
+    toString$0: function(_) {
+      return "RuntimeError: " + this.message;
+    },
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  H._Required.prototype = {};
+  H.JsLinkedHashMap.prototype = {
+    get$length: function(_) {
+      return this.__js_helper$_length;
+    },
+    get$isEmpty: function(_) {
+      return this.__js_helper$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return !this.get$isEmpty(this);
+    },
+    get$keys: function(_) {
+      return new H.LinkedHashMapKeyIterable(this, H._instanceType(this)._eval$1("LinkedHashMapKeyIterable<1>"));
+    },
+    get$values: function(_) {
+      var _this = this,
+        t1 = H._instanceType(_this);
+      return H.MappedIterable_MappedIterable(_this.get$keys(_this), new H.JsLinkedHashMap_values_closure(_this), t1._precomputed1, t1._rest[1]);
+    },
+    containsKey$1: function(key) {
+      var strings, nums, _this = this;
+      if (typeof key == "string") {
+        strings = _this._strings;
+        if (strings == null)
+          return false;
+        return _this._containsTableEntry$2(strings, key);
+      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
+        nums = _this._nums;
+        if (nums == null)
+          return false;
+        return _this._containsTableEntry$2(nums, key);
+      } else
+        return _this.internalContainsKey$1(key);
+    },
+    internalContainsKey$1: function(key) {
+      var _this = this,
+        rest = _this.__js_helper$_rest;
+      if (rest == null)
+        return false;
+      return _this.internalFindBucketIndex$2(_this._getTableBucket$2(rest, _this.internalComputeHashCode$1(key)), key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      other.forEach$1(0, new H.JsLinkedHashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, cell, t1, nums, _this = this, _null = null;
+      if (typeof key == "string") {
+        strings = _this._strings;
+        if (strings == null)
+          return _null;
+        cell = _this._getTableCell$2(strings, key);
+        t1 = cell == null ? _null : cell.hashMapCellValue;
+        return t1;
+      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
+        nums = _this._nums;
+        if (nums == null)
+          return _null;
+        cell = _this._getTableCell$2(nums, key);
+        t1 = cell == null ? _null : cell.hashMapCellValue;
+        return t1;
+      } else
+        return _this.internalGet$1(key);
+    },
+    internalGet$1: function(key) {
+      var bucket, index, _this = this,
+        rest = _this.__js_helper$_rest;
+      if (rest == null)
+        return null;
+      bucket = _this._getTableBucket$2(rest, _this.internalComputeHashCode$1(key));
+      index = _this.internalFindBucketIndex$2(bucket, key);
+      if (index < 0)
+        return null;
+      return bucket[index].hashMapCellValue;
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums, _this = this;
+      if (typeof key == "string") {
+        strings = _this._strings;
+        _this._addHashTableEntry$3(strings == null ? _this._strings = _this._newHashTable$0() : strings, key, value);
+      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
+        nums = _this._nums;
+        _this._addHashTableEntry$3(nums == null ? _this._nums = _this._newHashTable$0() : nums, key, value);
+      } else
+        _this.internalSet$2(key, value);
+    },
+    internalSet$2: function(key, value) {
+      var hash, bucket, index, _this = this,
+        rest = _this.__js_helper$_rest;
+      if (rest == null)
+        rest = _this.__js_helper$_rest = _this._newHashTable$0();
+      hash = _this.internalComputeHashCode$1(key);
+      bucket = _this._getTableBucket$2(rest, hash);
+      if (bucket == null)
+        _this._setTableEntry$3(rest, hash, [_this._newLinkedCell$2(key, value)]);
+      else {
+        index = _this.internalFindBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index].hashMapCellValue = value;
+        else
+          bucket.push(_this._newLinkedCell$2(key, value));
+      }
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      var value;
+      if (this.containsKey$1(key))
+        return this.$index(0, key);
+      value = ifAbsent.call$0();
+      this.$indexSet(0, key, value);
+      return value;
+    },
+    remove$1: function(_, key) {
+      var _this = this;
+      if (typeof key == "string")
+        return _this.__js_helper$_removeHashTableEntry$2(_this._strings, key);
+      else if (typeof key == "number" && (key & 0x3ffffff) === key)
+        return _this.__js_helper$_removeHashTableEntry$2(_this._nums, key);
+      else
+        return _this.internalRemove$1(key);
+    },
+    internalRemove$1: function(key) {
+      var hash, bucket, index, cell, _this = this,
+        rest = _this.__js_helper$_rest;
+      if (rest == null)
+        return null;
+      hash = _this.internalComputeHashCode$1(key);
+      bucket = _this._getTableBucket$2(rest, hash);
+      index = _this.internalFindBucketIndex$2(bucket, key);
+      if (index < 0)
+        return null;
+      cell = bucket.splice(index, 1)[0];
+      _this.__js_helper$_unlinkCell$1(cell);
+      if (bucket.length === 0)
+        _this._deleteTableEntry$2(rest, hash);
+      return cell.hashMapCellValue;
+    },
+    clear$0: function(_) {
+      var _this = this;
+      if (_this.__js_helper$_length > 0) {
+        _this._strings = _this._nums = _this.__js_helper$_rest = _this._first = _this._last = null;
+        _this.__js_helper$_length = 0;
+        _this._modified$0();
+      }
+    },
+    forEach$1: function(_, action) {
+      var _this = this,
+        cell = _this._first,
+        modifications = _this._modifications;
+      for (; cell != null;) {
+        action.call$2(cell.hashMapCellKey, cell.hashMapCellValue);
+        if (modifications !== _this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(_this));
+        cell = cell._next;
+      }
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      var cell = this._getTableCell$2(table, key);
+      if (cell == null)
+        this._setTableEntry$3(table, key, this._newLinkedCell$2(key, value));
+      else
+        cell.hashMapCellValue = value;
+    },
+    __js_helper$_removeHashTableEntry$2: function(table, key) {
+      var cell;
+      if (table == null)
+        return null;
+      cell = this._getTableCell$2(table, key);
+      if (cell == null)
+        return null;
+      this.__js_helper$_unlinkCell$1(cell);
+      this._deleteTableEntry$2(table, key);
+      return cell.hashMapCellValue;
+    },
+    _modified$0: function() {
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _newLinkedCell$2: function(key, value) {
+      var t1, _this = this,
+        cell = new H.LinkedHashMapCell(key, value);
+      if (_this._first == null)
+        _this._first = _this._last = cell;
+      else {
+        t1 = _this._last;
+        t1.toString;
+        cell._previous = t1;
+        _this._last = t1._next = cell;
+      }
+      ++_this.__js_helper$_length;
+      _this._modified$0();
+      return cell;
+    },
+    __js_helper$_unlinkCell$1: function(cell) {
+      var _this = this,
+        previous = cell._previous,
+        next = cell._next;
+      if (previous == null)
+        _this._first = next;
+      else
+        previous._next = next;
+      if (next == null)
+        _this._last = previous;
+      else
+        next._previous = previous;
+      --_this.__js_helper$_length;
+      _this._modified$0();
+    },
+    internalComputeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    internalFindBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq$(bucket[i].hashMapCellKey, key))
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.MapBase_mapToString(this);
+    },
+    _getTableCell$2: function(table, key) {
+      return table[key];
+    },
+    _getTableBucket$2: function(table, key) {
+      return table[key];
+    },
+    _setTableEntry$3: function(table, key, value) {
+      table[key] = value;
+    },
+    _deleteTableEntry$2: function(table, key) {
+      delete table[key];
+    },
+    _containsTableEntry$2: function(table, key) {
+      return this._getTableCell$2(table, key) != null;
+    },
+    _newHashTable$0: function() {
+      var _s20_ = "<non-identifier-key>",
+        table = Object.create(null);
+      this._setTableEntry$3(table, _s20_, table);
+      this._deleteTableEntry$2(table, _s20_);
+      return table;
+    }
+  };
+  H.JsLinkedHashMap_values_closure.prototype = {
+    call$1: function(each) {
+      return this.$this.$index(0, each);
+    },
+    $signature: function() {
+      return H._instanceType(this.$this)._eval$1("2(1)");
+    }
+  };
+  H.JsLinkedHashMap_addAll_closure.prototype = {
+    call$2: function(key, value) {
+      this.$this.$indexSet(0, key, value);
+    },
+    $signature: function() {
+      return H._instanceType(this.$this)._eval$1("Null(1,2)");
+    }
+  };
+  H.LinkedHashMapCell.prototype = {};
+  H.LinkedHashMapKeyIterable.prototype = {
+    get$length: function(_) {
+      return this._map.__js_helper$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map.__js_helper$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1 = this._map,
+        t2 = new H.LinkedHashMapKeyIterator(t1, t1._modifications);
+      t2._cell = t1._first;
+      return t2;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    }
+  };
+  H.LinkedHashMapKeyIterator.prototype = {
+    get$current: function(_) {
+      return this.__js_helper$_current;
+    },
+    moveNext$0: function() {
+      var cell, _this = this,
+        t1 = _this._map;
+      if (_this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      cell = _this._cell;
+      if (cell == null) {
+        _this.__js_helper$_current = null;
+        return false;
+      } else {
+        _this.__js_helper$_current = cell.hashMapCellKey;
+        _this._cell = cell._next;
+        return true;
+      }
+    }
+  };
+  H.initHooks_closure.prototype = {
+    call$1: function(o) {
+      return this.getTag(o);
+    },
+    $signature: 43
+  };
+  H.initHooks_closure0.prototype = {
+    call$2: function(o, tag) {
+      return this.getUnknownTag(o, tag);
+    },
+    $signature: 315
+  };
+  H.initHooks_closure1.prototype = {
+    call$1: function(tag) {
+      return this.prototypeForTag(tag);
+    },
+    $signature: 299
+  };
+  H.JSSyntaxRegExp.prototype = {
+    toString$0: function(_) {
+      return "RegExp/" + this.pattern + "/" + this._nativeRegExp.flags;
+    },
+    get$_nativeGlobalVersion: function() {
+      var _this = this,
+        t1 = _this._nativeGlobalRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = _this._nativeRegExp;
+      return _this._nativeGlobalRegExp = H.JSSyntaxRegExp_makeNative(_this.pattern, t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, true);
+    },
+    get$_nativeAnchoredVersion: function() {
+      var _this = this,
+        t1 = _this._nativeAnchoredRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = _this._nativeRegExp;
+      return _this._nativeAnchoredRegExp = H.JSSyntaxRegExp_makeNative(_this.pattern + "|()", t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, true);
+    },
+    firstMatch$1: function(string) {
+      var m;
+      if (typeof string != "string")
+        H.throwExpression(H.argumentErrorValue(string));
+      m = this._nativeRegExp.exec(string);
+      if (m == null)
+        return null;
+      return new H._MatchImplementation(m);
+    },
+    allMatches$2: function(_, string, start) {
+      var t1 = string.length;
+      if (start > t1)
+        throw H.wrapException(P.RangeError$range(start, 0, t1, null, null));
+      return new H._AllMatchesIterable(this, string, start);
+    },
+    allMatches$1: function($receiver, string) {
+      return this.allMatches$2($receiver, string, 0);
+    },
+    _execGlobal$2: function(string, start) {
+      var match,
+        regexp = this.get$_nativeGlobalVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return null;
+      return new H._MatchImplementation(match);
+    },
+    _execAnchored$2: function(string, start) {
+      var match,
+        regexp = this.get$_nativeAnchoredVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return null;
+      if (match.pop() != null)
+        return null;
+      return new H._MatchImplementation(match);
+    },
+    matchAsPrefix$2: function(_, string, start) {
+      if (start < 0 || start > string.length)
+        throw H.wrapException(P.RangeError$range(start, 0, string.length, null, null));
+      return this._execAnchored$2(string, start);
+    }
+  };
+  H._MatchImplementation.prototype = {
+    get$start: function(_) {
+      return this._match.index;
+    },
+    get$end: function(_) {
+      var t1 = this._match;
+      return t1.index + t1[0].length;
+    },
+    $isMatch: 1,
+    $isRegExpMatch: 1
+  };
+  H._AllMatchesIterable.prototype = {
+    get$iterator: function(_) {
+      return new H._AllMatchesIterator(this._re, this.__js_helper$_string, this.__js_helper$_start);
+    }
+  };
+  H._AllMatchesIterator.prototype = {
+    get$current: function(_) {
+      var t1 = this.__js_helper$_current;
+      t1.toString;
+      return t1;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3, match, nextIndex, _this = this,
+        string = _this.__js_helper$_string;
+      if (string == null)
+        return false;
+      t1 = _this._nextIndex;
+      t2 = string.length;
+      if (t1 <= t2) {
+        t3 = _this._regExp;
+        match = t3._execGlobal$2(string, t1);
+        if (match != null) {
+          _this.__js_helper$_current = match;
+          nextIndex = match.get$end(match);
+          if (match._match.index === nextIndex) {
+            if (t3._nativeRegExp.unicode) {
+              t1 = _this._nextIndex;
+              t3 = t1 + 1;
+              if (t3 < t2) {
+                t1 = C.JSString_methods.codeUnitAt$1(string, t1);
+                if (t1 >= 55296 && t1 <= 56319) {
+                  t1 = C.JSString_methods.codeUnitAt$1(string, t3);
+                  t1 = t1 >= 56320 && t1 <= 57343;
+                } else
+                  t1 = false;
+              } else
+                t1 = false;
+            } else
+              t1 = false;
+            nextIndex = (t1 ? nextIndex + 1 : nextIndex) + 1;
+          }
+          _this._nextIndex = nextIndex;
+          return true;
+        }
+      }
+      _this.__js_helper$_string = _this.__js_helper$_current = null;
+      return false;
+    }
+  };
+  H.StringMatch.prototype = {
+    get$end: function(_) {
+      return this.start + this.pattern.length;
+    },
+    group$1: function(_, group_) {
+      if (group_ !== 0)
+        throw H.wrapException(P.RangeError$value(group_, null, null));
+      return this.pattern;
+    },
+    $isMatch: 1,
+    get$start: function(receiver) {
+      return this.start;
+    }
+  };
+  H._StringAllMatchesIterable.prototype = {
+    get$iterator: function(_) {
+      return new H._StringAllMatchesIterator(this._input, this._pattern, this.__js_helper$_index);
+    },
+    get$first: function(_) {
+      var t1 = this._pattern,
+        index = this._input.indexOf(t1, this.__js_helper$_index);
+      if (index >= 0)
+        return new H.StringMatch(index, t1);
+      throw H.wrapException(H.IterableElementError_noElement());
+    }
+  };
+  H._StringAllMatchesIterator.prototype = {
+    moveNext$0: function() {
+      var index, end, _this = this,
+        t1 = _this.__js_helper$_index,
+        t2 = _this._pattern,
+        t3 = t2.length,
+        t4 = _this._input,
+        t5 = t4.length;
+      if (t1 + t3 > t5) {
+        _this.__js_helper$_current = null;
+        return false;
+      }
+      index = t4.indexOf(t2, t1);
+      if (index < 0) {
+        _this.__js_helper$_index = t5 + 1;
+        _this.__js_helper$_current = null;
+        return false;
+      }
+      end = index + t3;
+      _this.__js_helper$_current = new H.StringMatch(index, t2);
+      _this.__js_helper$_index = end === _this.__js_helper$_index ? end + 1 : end;
+      return true;
+    },
+    get$current: function(_) {
+      var t1 = this.__js_helper$_current;
+      t1.toString;
+      return t1;
+    }
+  };
+  H.NativeTypedData.prototype = {
+    _invalidPosition$3: function(receiver, position, $length, $name) {
+      if (!H._isInt(position))
+        throw H.wrapException(P.ArgumentError$value(position, $name, "Invalid list position"));
+      else
+        throw H.wrapException(P.RangeError$range(position, 0, $length, $name, null));
+    },
+    _checkPosition$3: function(receiver, position, $length, $name) {
+      if (position >>> 0 !== position || position > $length)
+        this._invalidPosition$3(receiver, position, $length, $name);
+    }
+  };
+  H.NativeTypedArray.prototype = {
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    _setRangeFast$4: function(receiver, start, end, source, skipCount) {
+      var count, sourceLength,
+        targetLength = receiver.length;
+      this._checkPosition$3(receiver, start, targetLength, "start");
+      this._checkPosition$3(receiver, end, targetLength, "end");
+      if (start > end)
+        throw H.wrapException(P.RangeError$range(start, 0, end, null, null));
+      count = end - start;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      sourceLength = source.length;
+      if (sourceLength - skipCount < count)
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (skipCount !== 0 || sourceLength !== count)
+        source = source.subarray(skipCount, skipCount + count);
+      receiver.set(source, start);
+    },
+    $isJavaScriptIndexingBehavior: 1
+  };
+  H.NativeTypedArrayOfDouble.prototype = {
+    $index: function(receiver, index) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      receiver[index] = value;
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (type$.NativeTypedArrayOfDouble._is(iterable)) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      this.super$ListMixin$setRange(receiver, start, end, iterable, skipCount);
+    },
+    $isEfficientLengthIterable: 1,
+    $isIterable: 1,
+    $isList: 1
+  };
+  H.NativeTypedArrayOfInt.prototype = {
+    $indexSet: function(receiver, index, value) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      receiver[index] = value;
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (type$.NativeTypedArrayOfInt._is(iterable)) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      this.super$ListMixin$setRange(receiver, start, end, iterable, skipCount);
+    },
+    $isEfficientLengthIterable: 1,
+    $isIterable: 1,
+    $isList: 1
+  };
+  H.NativeFloat32List.prototype = {
+    sublist$2: function(receiver, start, end) {
+      return new Float32Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    }
+  };
+  H.NativeFloat64List.prototype = {
+    sublist$2: function(receiver, start, end) {
+      return new Float64Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    }
+  };
+  H.NativeInt16List.prototype = {
+    $index: function(receiver, index) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      return new Int16Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    }
+  };
+  H.NativeInt32List.prototype = {
+    $index: function(receiver, index) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      return new Int32Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    }
+  };
+  H.NativeInt8List.prototype = {
+    $index: function(receiver, index) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      return new Int8Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    }
+  };
+  H.NativeUint16List.prototype = {
+    $index: function(receiver, index) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      return new Uint16Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    }
+  };
+  H.NativeUint32List.prototype = {
+    $index: function(receiver, index) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      return new Uint32Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    }
+  };
+  H.NativeUint8ClampedList.prototype = {
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      return new Uint8ClampedArray(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    }
+  };
+  H.NativeUint8List.prototype = {
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      H._checkValidIndex(index, receiver, receiver.length);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      return new Uint8Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
+    },
+    $isNativeUint8List: 1,
+    $isUint8List: 1
+  };
+  H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.prototype = {};
+  H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
+  H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.prototype = {};
+  H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
+  H.Rti.prototype = {
+    _eval$1: function(recipe) {
+      return H._Universe_evalInEnvironment(init.typeUniverse, this, recipe);
+    },
+    _bind$1: function(typeOrTuple) {
+      return H._Universe_bind(init.typeUniverse, this, typeOrTuple);
+    }
+  };
+  H._FunctionParameters.prototype = {};
+  H._Type.prototype = {
+    toString$0: function(_) {
+      return H._rtiToString(this._rti, null);
+    }
+  };
+  H._Error.prototype = {
+    toString$0: function(_) {
+      return this._message;
+    }
+  };
+  H._TypeError.prototype = {
+    get$message: function(_) {
+      return this._message;
+    }
+  };
+  P._AsyncRun__initializeScheduleImmediate_internalCallback.prototype = {
+    call$1: function(_) {
+      var t1 = this._box_0,
+        f = t1.storedCallback;
+      t1.storedCallback = null;
+      f.call$0();
+    },
+    $signature: 110
+  };
+  P._AsyncRun__initializeScheduleImmediate_closure.prototype = {
+    call$1: function(callback) {
+      var t1, t2;
+      this._box_0.storedCallback = callback;
+      t1 = this.div;
+      t2 = this.span;
+      t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
+    },
+    $signature: 293
+  };
+  P._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
+    call$0: function() {
+      this.callback.call$0();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
+    call$0: function() {
+      this.callback.call$0();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._TimerImpl.prototype = {
+    _TimerImpl$2: function(milliseconds, callback) {
+      if (self.setTimeout != null)
+        this._handle = self.setTimeout(H.convertDartClosureToJS(new P._TimerImpl_internalCallback(this, callback), 0), milliseconds);
+      else
+        throw H.wrapException(P.UnsupportedError$("`setTimeout()` not found."));
+    },
+    _TimerImpl$periodic$2: function(milliseconds, callback) {
+      if (self.setTimeout != null)
+        this._handle = self.setInterval(H.convertDartClosureToJS(new P._TimerImpl$periodic_closure(this, milliseconds, Date.now(), callback), 0), milliseconds);
+      else
+        throw H.wrapException(P.UnsupportedError$("Periodic timer."));
+    },
+    cancel$0: function() {
+      if (self.setTimeout != null) {
+        var t1 = this._handle;
+        if (t1 == null)
+          return;
+        if (this._once)
+          self.clearTimeout(t1);
+        else
+          self.clearInterval(t1);
+        this._handle = null;
+      } else
+        throw H.wrapException(P.UnsupportedError$("Canceling a timer."));
+    }
+  };
+  P._TimerImpl_internalCallback.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._handle = null;
+      t1._tick = 1;
+      this.callback.call$0();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 1
+  };
+  P._TimerImpl$periodic_closure.prototype = {
+    call$0: function() {
+      var duration, _this = this,
+        t1 = _this.$this,
+        tick = t1._tick + 1,
+        t2 = _this.milliseconds;
+      if (t2 > 0) {
+        duration = Date.now() - _this.start;
+        if (duration > (tick + 1) * t2)
+          tick = C.JSInt_methods.$tdiv(duration, t2);
+      }
+      t1._tick = tick;
+      _this.callback.call$1(t1);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._AsyncAwaitCompleter.prototype = {
+    complete$1: function(value) {
+      var t1, _this = this;
+      if (!_this.isSync)
+        _this._future._asyncComplete$1(value);
+      else {
+        t1 = _this._future;
+        if (_this.$ti._eval$1("Future<1>")._is(value))
+          t1._chainFuture$1(value);
+        else
+          t1._completeWithValue$1(value);
+      }
+    },
+    completeError$2: function(e, st) {
+      var t1;
+      if (st == null)
+        st = P.AsyncError_defaultStackTrace(e);
+      t1 = this._future;
+      if (this.isSync)
+        t1._completeError$2(e, st);
+      else
+        t1._asyncCompleteError$2(e, st);
+    }
+  };
+  P._awaitOnObject_closure.prototype = {
+    call$1: function(result) {
+      return this.bodyFunction.call$2(0, result);
+    },
+    $signature: 213
+  };
+  P._awaitOnObject_closure0.prototype = {
+    call$2: function(error, stackTrace) {
+      this.bodyFunction.call$2(1, new H.ExceptionAndStackTrace(error, stackTrace));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 433
+  };
+  P._wrapJsFunctionForAsync_closure.prototype = {
+    call$2: function(errorCode, result) {
+      this.$protected(errorCode, result);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 455
+  };
+  P._asyncStarHelper_closure.prototype = {
+    call$0: function() {
+      var t1 = this.controller,
+        t2 = t1.get$controller(),
+        t3 = t2._state;
+      if ((t3 & 1) !== 0 ? (t2.get$_subscription()._state & 4) !== 0 : (t3 & 2) === 0) {
+        t1.isSuspended = true;
+        return;
+      }
+      this.bodyFunction.call$2(0, null);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._asyncStarHelper_closure0.prototype = {
+    call$1: function(_) {
+      var errorCode = this.controller.cancelationFuture != null ? 2 : 0;
+      this.bodyFunction.call$2(errorCode, null);
+    },
+    $signature: 110
+  };
+  P._AsyncStarStreamController.prototype = {
+    get$controller: function() {
+      var t1 = this.___AsyncStarStreamController_controller;
+      return t1 == null ? H.throwExpression(H.LateInitializationErrorImpl$("Field 'controller' has not been initialized.")) : t1;
+    },
+    add$1: function(_, $event) {
+      return this.get$controller().add$1(0, $event);
+    },
+    _AsyncStarStreamController$1: function(body, $T) {
+      var t1 = new P._AsyncStarStreamController__resumeBody(body);
+      this.___AsyncStarStreamController_controller = P.StreamController_StreamController(new P._AsyncStarStreamController_closure(this, body), new P._AsyncStarStreamController_closure0(t1), null, new P._AsyncStarStreamController_closure1(this, t1), false, $T);
+    }
+  };
+  P._AsyncStarStreamController__resumeBody.prototype = {
+    call$0: function() {
+      P.scheduleMicrotask(new P._AsyncStarStreamController__resumeBody_closure(this.body));
+    },
+    $signature: 0
+  };
+  P._AsyncStarStreamController__resumeBody_closure.prototype = {
+    call$0: function() {
+      this.body.call$2(0, null);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._AsyncStarStreamController_closure0.prototype = {
+    call$0: function() {
+      this._resumeBody.call$0();
+    },
+    $signature: 0
+  };
+  P._AsyncStarStreamController_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      if (t1.isSuspended) {
+        t1.isSuspended = false;
+        this._resumeBody.call$0();
+      }
+    },
+    $signature: 0
+  };
+  P._AsyncStarStreamController_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      if ((t1.get$controller()._state & 4) === 0) {
+        t1.cancelationFuture = new P._Future($.Zone__current, type$._Future_dynamic);
+        if (t1.isSuspended) {
+          t1.isSuspended = false;
+          P.scheduleMicrotask(new P._AsyncStarStreamController__closure(this.body));
+        }
+        return t1.cancelationFuture;
+      }
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 448
+  };
+  P._AsyncStarStreamController__closure.prototype = {
+    call$0: function() {
+      this.body.call$2(2, null);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._IterationMarker.prototype = {
+    toString$0: function(_) {
+      return "IterationMarker(" + this.state + ", " + H.S(this.value) + ")";
+    }
+  };
+  P._SyncStarIterator.prototype = {
+    get$current: function(_) {
+      var nested = this._nestedIterator;
+      if (nested == null)
+        return this._async$_current;
+      return nested.get$current(nested);
+    },
+    moveNext$0: function() {
+      var t1, value, state, suspendedBodies, inner, _this = this;
+      for (; true;) {
+        t1 = _this._nestedIterator;
+        if (t1 != null)
+          if (t1.moveNext$0())
+            return true;
+          else
+            _this._nestedIterator = null;
+        value = function(body, SUCCESS, ERROR) {
+          var errorValue,
+            errorCode = SUCCESS;
+          while (true)
+            try {
+              return body(errorCode, errorValue);
+            } catch (error) {
+              errorValue = error;
+              errorCode = ERROR;
+            }
+        }(_this._body, 0, 1);
+        if (value instanceof P._IterationMarker) {
+          state = value.state;
+          if (state === 2) {
+            suspendedBodies = _this._suspendedBodies;
+            if (suspendedBodies == null || suspendedBodies.length === 0) {
+              _this._async$_current = null;
+              return false;
+            }
+            _this._body = suspendedBodies.pop();
+            continue;
+          } else {
+            t1 = value.value;
+            if (state === 3)
+              throw t1;
+            else {
+              inner = J.get$iterator$ax(t1);
+              if (inner instanceof P._SyncStarIterator) {
+                t1 = _this._suspendedBodies;
+                if (t1 == null)
+                  t1 = _this._suspendedBodies = [];
+                t1.push(_this._body);
+                _this._body = inner._body;
+                continue;
+              } else {
+                _this._nestedIterator = inner;
+                continue;
+              }
+            }
+          }
+        } else {
+          _this._async$_current = value;
+          return true;
+        }
+      }
+      return false;
+    }
+  };
+  P._SyncStarIterable.prototype = {
+    get$iterator: function(_) {
+      return new P._SyncStarIterator(this._outerHelper());
+    }
+  };
+  P._BroadcastStream.prototype = {
+    get$isBroadcast: function() {
+      return true;
+    }
+  };
+  P._BroadcastSubscription.prototype = {
+    _async$_onPause$0: function() {
+    },
+    _async$_onResume$0: function() {
+    }
+  };
+  P._BroadcastStreamController.prototype = {
+    set$onPause: function(onPauseHandler) {
+      throw H.wrapException(P.UnsupportedError$(string$.Broadc));
+    },
+    set$onResume: function(onResumeHandler) {
+      throw H.wrapException(P.UnsupportedError$(string$.Broadc));
+    },
+    get$stream: function() {
+      return new P._BroadcastStream(this, H._instanceType(this)._eval$1("_BroadcastStream<1>"));
+    },
+    get$_mayAddEvent: function() {
+      return this._state < 4;
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      return t1 == null ? this._doneFuture = new P._Future($.Zone__current, type$._Future_void) : t1;
+    },
+    _removeListener$1: function(subscription) {
+      var previous = subscription._async$_previous,
+        next = subscription._async$_next;
+      if (previous == null)
+        this._firstSubscription = next;
+      else
+        previous._async$_next = next;
+      if (next == null)
+        this._lastSubscription = previous;
+      else
+        next._async$_previous = previous;
+      subscription._async$_previous = subscription;
+      subscription._async$_next = subscription;
+    },
+    _subscribe$4: function(onData, onError, onDone, cancelOnError) {
+      var t1, t2, t3, t4, t5, t6, subscription, oldLast, _this = this;
+      if ((_this._state & 4) !== 0) {
+        t1 = new P._DoneStreamSubscription($.Zone__current, onDone, H._instanceType(_this)._eval$1("_DoneStreamSubscription<1>"));
+        t1._schedule$0();
+        return t1;
+      }
+      t1 = H._instanceType(_this);
+      t2 = $.Zone__current;
+      t3 = cancelOnError ? 1 : 0;
+      t4 = P._BufferingStreamSubscription__registerDataHandler(t2, onData, t1._precomputed1);
+      t5 = P._BufferingStreamSubscription__registerErrorHandler(t2, onError);
+      t6 = onDone == null ? P.async___nullDoneHandler$closure() : onDone;
+      subscription = new P._BroadcastSubscription(_this, t4, t5, t2.registerCallback$1$1(t6, type$.void), t2, t3, t1._eval$1("_BroadcastSubscription<1>"));
+      subscription._async$_previous = subscription;
+      subscription._async$_next = subscription;
+      subscription._eventState = _this._state & 1;
+      oldLast = _this._lastSubscription;
+      _this._lastSubscription = subscription;
+      subscription._async$_next = null;
+      subscription._async$_previous = oldLast;
+      if (oldLast == null)
+        _this._firstSubscription = subscription;
+      else
+        oldLast._async$_next = subscription;
+      if (_this._firstSubscription === subscription)
+        P._runGuarded(_this.onListen);
+      return subscription;
+    },
+    _recordCancel$1: function(sub) {
+      var t1, _this = this;
+      H._instanceType(_this)._eval$1("_BroadcastSubscription<1>")._as(sub);
+      if (sub._async$_next === sub)
+        return null;
+      t1 = sub._eventState;
+      if ((t1 & 2) !== 0)
+        sub._eventState = t1 | 4;
+      else {
+        _this._removeListener$1(sub);
+        if ((_this._state & 2) === 0 && _this._firstSubscription == null)
+          _this._callOnCancel$0();
+      }
+      return null;
+    },
+    _recordPause$1: function(subscription) {
+    },
+    _recordResume$1: function(subscription) {
+    },
+    _addEventError$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add new events after calling close");
+      return new P.StateError("Cannot add new events while doing an addStream");
+    },
+    add$1: function(_, data) {
+      if (!this.get$_mayAddEvent())
+        throw H.wrapException(this._addEventError$0());
+      this._sendData$1(data);
+    },
+    addError$2: function(error, stackTrace) {
+      var replacement;
+      P.ArgumentError_checkNotNull(error, "error");
+      if (!this.get$_mayAddEvent())
+        throw H.wrapException(this._addEventError$0());
+      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
+      if (replacement != null) {
+        error = replacement.error;
+        stackTrace = replacement.stackTrace;
+      } else if (stackTrace == null)
+        stackTrace = P.AsyncError_defaultStackTrace(error);
+      this._sendError$2(error, stackTrace);
+    },
+    close$0: function(_) {
+      var t1, doneFuture, _this = this;
+      if ((_this._state & 4) !== 0) {
+        t1 = _this._doneFuture;
+        t1.toString;
+        return t1;
+      }
+      if (!_this.get$_mayAddEvent())
+        throw H.wrapException(_this._addEventError$0());
+      _this._state |= 4;
+      doneFuture = _this._ensureDoneFuture$0();
+      _this._sendDone$0();
+      return doneFuture;
+    },
+    _forEachListener$1: function(action) {
+      var subscription, id, next, _this = this,
+        t1 = _this._state;
+      if ((t1 & 2) !== 0)
+        throw H.wrapException(P.StateError$(string$.Cannotf));
+      subscription = _this._firstSubscription;
+      if (subscription == null)
+        return;
+      id = t1 & 1;
+      _this._state = t1 ^ 3;
+      for (; subscription != null;) {
+        t1 = subscription._eventState;
+        if ((t1 & 1) === id) {
+          subscription._eventState = t1 | 2;
+          action.call$1(subscription);
+          t1 = subscription._eventState ^= 1;
+          next = subscription._async$_next;
+          if ((t1 & 4) !== 0)
+            _this._removeListener$1(subscription);
+          subscription._eventState &= 4294967293;
+          subscription = next;
+        } else
+          subscription = subscription._async$_next;
+      }
+      _this._state &= 4294967293;
+      if (_this._firstSubscription == null)
+        _this._callOnCancel$0();
+    },
+    _callOnCancel$0: function() {
+      if ((this._state & 4) !== 0) {
+        var doneFuture = this._doneFuture;
+        if (doneFuture._state === 0)
+          doneFuture._asyncComplete$1(null);
+      }
+      P._runGuarded(this.onCancel);
+    },
+    $isEventSink: 1,
+    set$onListen: function(val) {
+      return this.onListen = val;
+    },
+    set$onCancel: function(val) {
+      return this.onCancel = val;
+    }
+  };
+  P._SyncBroadcastStreamController.prototype = {
+    get$_mayAddEvent: function() {
+      return P._BroadcastStreamController.prototype.get$_mayAddEvent.call(this) && (this._state & 2) === 0;
+    },
+    _addEventError$0: function() {
+      if ((this._state & 2) !== 0)
+        return new P.StateError(string$.Cannotf);
+      return this.super$_BroadcastStreamController$_addEventError();
+    },
+    _sendData$1: function(data) {
+      var _this = this,
+        t1 = _this._firstSubscription;
+      if (t1 == null)
+        return;
+      if (t1 === _this._lastSubscription) {
+        _this._state |= 2;
+        t1._async$_add$1(data);
+        _this._state &= 4294967293;
+        if (_this._firstSubscription == null)
+          _this._callOnCancel$0();
+        return;
+      }
+      _this._forEachListener$1(new P._SyncBroadcastStreamController__sendData_closure(_this, data));
+    },
+    _sendError$2: function(error, stackTrace) {
+      if (this._firstSubscription == null)
+        return;
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendError_closure(this, error, stackTrace));
+    },
+    _sendDone$0: function() {
+      var _this = this;
+      if (_this._firstSubscription != null)
+        _this._forEachListener$1(new P._SyncBroadcastStreamController__sendDone_closure(_this));
+      else
+        _this._doneFuture._asyncComplete$1(null);
+    }
+  };
+  P._SyncBroadcastStreamController__sendData_closure.prototype = {
+    call$1: function(subscription) {
+      subscription._async$_add$1(this.data);
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("Null(_BufferingStreamSubscription<1>)");
+    }
+  };
+  P._SyncBroadcastStreamController__sendError_closure.prototype = {
+    call$1: function(subscription) {
+      subscription._addError$2(this.error, this.stackTrace);
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("Null(_BufferingStreamSubscription<1>)");
+    }
+  };
+  P._SyncBroadcastStreamController__sendDone_closure.prototype = {
+    call$1: function(subscription) {
+      subscription._close$0();
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("Null(_BufferingStreamSubscription<1>)");
+    }
+  };
+  P.Future_wait__error_set.prototype = {
+    call$1: function(t1) {
+      return this._box_0.error = t1;
+    },
+    $signature: 441
+  };
+  P.Future_wait__stackTrace_set.prototype = {
+    call$1: function(t1) {
+      return this._box_0.stackTrace = t1;
+    },
+    $signature: 422
+  };
+  P.Future_wait__error_get.prototype = {
+    call$0: function() {
+      var t1 = this._box_0.error;
+      return t1 == null ? H.throwExpression(H.LateInitializationErrorImpl$("Local 'error' has not been initialized.")) : t1;
+    },
+    $signature: 301
+  };
+  P.Future_wait__stackTrace_get.prototype = {
+    call$0: function() {
+      var t1 = this._box_0.stackTrace;
+      return t1 == null ? H.throwExpression(H.LateInitializationErrorImpl$("Local 'stackTrace' has not been initialized.")) : t1;
+    },
+    $signature: 300
+  };
+  P.Future_wait_handleError.prototype = {
+    call$2: function(theError, theStackTrace) {
+      var _this = this,
+        t1 = _this._box_0,
+        t2 = --t1.remaining;
+      if (t1.values != null) {
+        t1.values = null;
+        if (t1.remaining === 0 || _this.eagerError)
+          _this._future._completeError$2(theError, theStackTrace);
+        else {
+          _this._error_set.call$1(theError);
+          _this._stackTrace_set.call$1(theStackTrace);
+        }
+      } else if (t2 === 0 && !_this.eagerError)
+        _this._future._completeError$2(_this._error_get.call$0(), _this._stackTrace_get.call$0());
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 56
+  };
+  P.Future_wait_closure.prototype = {
+    call$1: function(value) {
+      var valueList, _this = this,
+        t1 = _this._box_0;
+      --t1.remaining;
+      valueList = t1.values;
+      if (valueList != null) {
+        J.$indexSet$ax(valueList, _this.pos, value);
+        if (t1.remaining === 0)
+          _this._future._completeWithValue$1(P.List_List$from(valueList, true, _this.T));
+      } else if (t1.remaining === 0 && !_this.eagerError)
+        _this._future._completeError$2(_this._error_get.call$0(), _this._stackTrace_get.call$0());
+    },
+    $signature: function() {
+      return this.T._eval$1("Null(0)");
+    }
+  };
+  P._Completer.prototype = {
+    completeError$2: function(error, stackTrace) {
+      var t1, replacement;
+      P.ArgumentError_checkNotNull(error, "error");
+      t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
+      if (replacement != null) {
+        error = replacement.error;
+        stackTrace = replacement.stackTrace;
+      } else if (stackTrace == null)
+        stackTrace = P.AsyncError_defaultStackTrace(error);
+      t1._asyncCompleteError$2(error, stackTrace);
+    },
+    completeError$1: function(error) {
+      return this.completeError$2(error, null);
+    }
+  };
+  P._AsyncCompleter.prototype = {
+    complete$1: function(value) {
+      var t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(value);
+    },
+    complete$0: function() {
+      return this.complete$1(null);
+    }
+  };
+  P._FutureListener.prototype = {
+    matchesErrorTest$1: function(asyncError) {
+      if ((this.state & 15) !== 6)
+        return true;
+      return this.result._zone.runUnary$2$2(this.callback, asyncError.error, type$.bool, type$.Object);
+    },
+    handleError$1: function(asyncError) {
+      var errorCallback = this.errorCallback,
+        t1 = type$.dynamic,
+        t2 = type$.Object,
+        t3 = this.result._zone;
+      if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
+        return t3.runBinary$3$3(errorCallback, asyncError.error, asyncError.stackTrace, t1, t2, type$.StackTrace);
+      else
+        return t3.runUnary$2$2(errorCallback, asyncError.error, t1, t2);
+    }
+  };
+  P._Future.prototype = {
+    then$1$2$onError: function(_, f, onError, $R) {
+      var result, t1,
+        currentZone = $.Zone__current;
+      if (currentZone !== C.C__RootZone) {
+        f = currentZone.registerUnaryCallback$2$1(f, $R._eval$1("0/"), this.$ti._precomputed1);
+        if (onError != null)
+          onError = P._registerErrorHandler(onError, currentZone);
+      }
+      result = new P._Future($.Zone__current, $R._eval$1("_Future<0>"));
+      t1 = onError == null ? 1 : 3;
+      this._addListener$1(new P._FutureListener(result, t1, f, onError, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("_FutureListener<1,2>")));
+      return result;
+    },
+    then$1$1: function($receiver, f, $R) {
+      return this.then$1$2$onError($receiver, f, null, $R);
+    },
+    then$1: function($receiver, f) {
+      return this.then$1$2$onError($receiver, f, null, type$.dynamic);
+    },
+    _thenAwait$1$2: function(f, onError, $E) {
+      var result = new P._Future($.Zone__current, $E._eval$1("_Future<0>"));
+      this._addListener$1(new P._FutureListener(result, 19, f, onError, this.$ti._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>")));
+      return result;
+    },
+    whenComplete$1: function(action) {
+      var t1 = this.$ti,
+        t2 = $.Zone__current,
+        result = new P._Future(t2, t1);
+      if (t2 !== C.C__RootZone)
+        action = t2.registerCallback$1$1(action, type$.dynamic);
+      this._addListener$1(new P._FutureListener(result, 8, action, null, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
+      return result;
+    },
+    _addListener$1: function(listener) {
+      var t2, _this = this,
+        t1 = _this._state;
+      if (t1 <= 1) {
+        listener._nextListener = _this._resultOrListeners;
+        _this._resultOrListeners = listener;
+      } else {
+        if (t1 === 2) {
+          t1 = _this._resultOrListeners;
+          t2 = t1._state;
+          if (t2 < 4) {
+            t1._addListener$1(listener);
+            return;
+          }
+          _this._state = t2;
+          _this._resultOrListeners = t1._resultOrListeners;
+        }
+        _this._zone.scheduleMicrotask$1(new P._Future__addListener_closure(_this, listener));
+      }
+    },
+    _prependListeners$1: function(listeners) {
+      var t1, existingListeners, next, cursor, next0, t2, _this = this, _box_0 = {};
+      _box_0.listeners = listeners;
+      if (listeners == null)
+        return;
+      t1 = _this._state;
+      if (t1 <= 1) {
+        existingListeners = _this._resultOrListeners;
+        _this._resultOrListeners = listeners;
+        if (existingListeners != null) {
+          next = listeners._nextListener;
+          for (cursor = listeners; next != null; cursor = next, next = next0)
+            next0 = next._nextListener;
+          cursor._nextListener = existingListeners;
+        }
+      } else {
+        if (t1 === 2) {
+          t1 = _this._resultOrListeners;
+          t2 = t1._state;
+          if (t2 < 4) {
+            t1._prependListeners$1(listeners);
+            return;
+          }
+          _this._state = t2;
+          _this._resultOrListeners = t1._resultOrListeners;
+        }
+        _box_0.listeners = _this._reverseListeners$1(listeners);
+        _this._zone.scheduleMicrotask$1(new P._Future__prependListeners_closure(_box_0, _this));
+      }
+    },
+    _removeListeners$0: function() {
+      var current = this._resultOrListeners;
+      this._resultOrListeners = null;
+      return this._reverseListeners$1(current);
+    },
+    _reverseListeners$1: function(listeners) {
+      var current, prev, next;
+      for (current = listeners, prev = null; current != null; prev = current, current = next) {
+        next = current._nextListener;
+        current._nextListener = prev;
+      }
+      return prev;
+    },
+    _complete$1: function(value) {
+      var listeners, _this = this,
+        t1 = _this.$ti;
+      if (t1._eval$1("Future<1>")._is(value))
+        if (t1._is(value))
+          P._Future__chainCoreFuture(value, _this);
+        else
+          P._Future__chainForeignFuture(value, _this);
+      else {
+        listeners = _this._removeListeners$0();
+        _this._state = 4;
+        _this._resultOrListeners = value;
+        P._Future__propagateToListeners(_this, listeners);
+      }
+    },
+    _completeWithValue$1: function(value) {
+      var _this = this,
+        listeners = _this._removeListeners$0();
+      _this._state = 4;
+      _this._resultOrListeners = value;
+      P._Future__propagateToListeners(_this, listeners);
+    },
+    _completeError$2: function(error, stackTrace) {
+      var _this = this,
+        listeners = _this._removeListeners$0(),
+        t1 = P.AsyncError$(error, stackTrace);
+      _this._state = 8;
+      _this._resultOrListeners = t1;
+      P._Future__propagateToListeners(_this, listeners);
+    },
+    _asyncComplete$1: function(value) {
+      if (this.$ti._eval$1("Future<1>")._is(value)) {
+        this._chainFuture$1(value);
+        return;
+      }
+      this._asyncCompleteWithValue$1(value);
+    },
+    _asyncCompleteWithValue$1: function(value) {
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncCompleteWithValue_closure(this, value));
+    },
+    _chainFuture$1: function(value) {
+      var _this = this;
+      if (_this.$ti._is(value)) {
+        if (value._state === 8) {
+          _this._state = 1;
+          _this._zone.scheduleMicrotask$1(new P._Future__chainFuture_closure(_this, value));
+        } else
+          P._Future__chainCoreFuture(value, _this);
+        return;
+      }
+      P._Future__chainForeignFuture(value, _this);
+    },
+    _asyncCompleteError$2: function(error, stackTrace) {
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncCompleteError_closure(this, error, stackTrace));
+    },
+    $isFuture: 1
+  };
+  P._Future__addListener_closure.prototype = {
+    call$0: function() {
+      P._Future__propagateToListeners(this.$this, this.listener);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._Future__prependListeners_closure.prototype = {
+    call$0: function() {
+      P._Future__propagateToListeners(this.$this, this._box_0.listeners);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._Future__chainForeignFuture_closure.prototype = {
+    call$1: function(value) {
+      var t1 = this.target;
+      t1._state = 0;
+      t1._complete$1(value);
+    },
+    $signature: 110
+  };
+  P._Future__chainForeignFuture_closure0.prototype = {
+    call$2: function(error, stackTrace) {
+      this.target._completeError$2(error, stackTrace);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 297
+  };
+  P._Future__chainForeignFuture_closure1.prototype = {
+    call$0: function() {
+      this.target._completeError$2(this.e, this.s);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._Future__asyncCompleteWithValue_closure.prototype = {
+    call$0: function() {
+      this.$this._completeWithValue$1(this.value);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._Future__chainFuture_closure.prototype = {
+    call$0: function() {
+      P._Future__chainCoreFuture(this.value, this.$this);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._Future__asyncCompleteError_closure.prototype = {
+    call$0: function() {
+      this.$this._completeError$2(this.error, this.stackTrace);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._Future__propagateToListeners_handleWhenCompleteCallback.prototype = {
+    call$0: function() {
+      var e, s, t1, exception, t2, originalSource, _this = this, completeResult = null;
+      try {
+        t1 = _this._box_0.listener;
+        completeResult = t1.result._zone.run$1$1(0, t1.callback, type$.dynamic);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        if (_this.hasError) {
+          t1 = _this._box_1.source._resultOrListeners.error;
+          t2 = e;
+          t2 = t1 == null ? t2 == null : t1 === t2;
+          t1 = t2;
+        } else
+          t1 = false;
+        t2 = _this._box_0;
+        if (t1)
+          t2.listenerValueOrError = _this._box_1.source._resultOrListeners;
+        else
+          t2.listenerValueOrError = P.AsyncError$(e, s);
+        t2.listenerHasError = true;
+        return;
+      }
+      if (completeResult instanceof P._Future && completeResult._state >= 4) {
+        if (completeResult._state === 8) {
+          t1 = _this._box_0;
+          t1.listenerValueOrError = completeResult._resultOrListeners;
+          t1.listenerHasError = true;
+        }
+        return;
+      }
+      if (type$.Future_dynamic._is(completeResult)) {
+        originalSource = _this._box_1.source;
+        t1 = _this._box_0;
+        t1.listenerValueOrError = J.then$1$1$x(completeResult, new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(originalSource), type$.dynamic);
+        t1.listenerHasError = false;
+      }
+    },
+    $signature: 1
+  };
+  P._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
+    call$1: function(_) {
+      return this.originalSource;
+    },
+    $signature: 295
+  };
+  P._Future__propagateToListeners_handleValueCallback.prototype = {
+    call$0: function() {
+      var e, s, t1, t2, t3, exception;
+      try {
+        t1 = this._box_0;
+        t2 = t1.listener;
+        t3 = t2.$ti;
+        t1.listenerValueOrError = t2.result._zone.runUnary$2$2(t2.callback, this.sourceResult, t3._eval$1("2/"), t3._precomputed1);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        t1 = this._box_0;
+        t1.listenerValueOrError = P.AsyncError$(e, s);
+        t1.listenerHasError = true;
+      }
+    },
+    $signature: 1
+  };
+  P._Future__propagateToListeners_handleError.prototype = {
+    call$0: function() {
+      var asyncError, e, s, t1, exception, t2, t3, t4, _this = this;
+      try {
+        asyncError = _this._box_1.source._resultOrListeners;
+        t1 = _this._box_0;
+        if (t1.listener.matchesErrorTest$1(asyncError) && t1.listener.errorCallback != null) {
+          t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
+          t1.listenerHasError = false;
+        }
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        t1 = _this._box_1.source._resultOrListeners;
+        t2 = t1.error;
+        t3 = e;
+        t4 = _this._box_0;
+        if (t2 == null ? t3 == null : t2 === t3)
+          t4.listenerValueOrError = t1;
+        else
+          t4.listenerValueOrError = P.AsyncError$(e, s);
+        t4.listenerHasError = true;
+      }
+    },
+    $signature: 1
+  };
+  P._AsyncCallbackEntry.prototype = {};
+  P.Stream.prototype = {
+    get$isBroadcast: function() {
+      return false;
+    },
+    get$length: function(_) {
+      var t1 = {},
+        future = new P._Future($.Zone__current, type$._Future_int);
+      t1.count = 0;
+      this.listen$4$cancelOnError$onDone$onError(0, new P.Stream_length_closure(t1, this), true, new P.Stream_length_closure0(t1, future), future.get$_completeError());
+      return future;
+    }
+  };
+  P.Stream_Stream$fromFuture_closure.prototype = {
+    call$1: function(value) {
+      var t1 = this.controller;
+      t1._async$_add$1(value);
+      t1._closeUnchecked$0();
+    },
+    $signature: function() {
+      return this.T._eval$1("Null(0)");
+    }
+  };
+  P.Stream_Stream$fromFuture_closure0.prototype = {
+    call$2: function(error, stackTrace) {
+      var t1 = this.controller;
+      t1._addError$2(error, stackTrace);
+      t1._closeUnchecked$0();
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 104
+  };
+  P.Stream_length_closure.prototype = {
+    call$1: function(_) {
+      ++this._box_0.count;
+    },
+    $signature: function() {
+      return H._instanceType(this.$this)._eval$1("Null(Stream.T)");
+    }
+  };
+  P.Stream_length_closure0.prototype = {
+    call$0: function() {
+      this.future._complete$1(this._box_0.count);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P.StreamTransformerBase.prototype = {};
+  P._StreamController.prototype = {
+    get$stream: function() {
+      return new P._ControllerStream(this, H._instanceType(this)._eval$1("_ControllerStream<1>"));
+    },
+    get$_pendingEvents: function() {
+      if ((this._state & 8) === 0)
+        return this._varData;
+      return this._varData.varData;
+    },
+    _ensurePendingEvents$0: function() {
+      var events, state, _this = this;
+      if ((_this._state & 8) === 0) {
+        events = _this._varData;
+        return events == null ? _this._varData = new P._StreamImplEvents() : events;
+      }
+      state = _this._varData;
+      events = state.varData;
+      return events == null ? state.varData = new P._StreamImplEvents() : events;
+    },
+    get$_subscription: function() {
+      var varData = this._varData;
+      return (this._state & 8) !== 0 ? varData.varData : varData;
+    },
+    _badEventState$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add event after closing");
+      return new P.StateError("Cannot add event while adding a stream");
+    },
+    addStream$2$cancelOnError: function(source, cancelOnError) {
+      var t2, t3, t4, _this = this,
+        t1 = _this._state;
+      if (t1 >= 4)
+        throw H.wrapException(_this._badEventState$0());
+      if ((t1 & 2) !== 0) {
+        t1 = new P._Future($.Zone__current, type$._Future_dynamic);
+        t1._asyncComplete$1(null);
+        return t1;
+      }
+      t1 = _this._varData;
+      t2 = new P._Future($.Zone__current, type$._Future_dynamic);
+      t3 = source.listen$4$cancelOnError$onDone$onError(0, _this.get$_async$_add(), false, _this.get$_close(), _this.get$_addError());
+      t4 = _this._state;
+      if ((t4 & 1) !== 0 ? (_this.get$_subscription()._state & 4) !== 0 : (t4 & 2) === 0)
+        t3.pause$0(0);
+      _this._varData = new P._StreamControllerAddStreamState(t1, t2, t3);
+      _this._state |= 8;
+      return t2;
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 == null)
+        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new P._Future($.Zone__current, type$._Future_void);
+      return t1;
+    },
+    add$1: function(_, value) {
+      if (this._state >= 4)
+        throw H.wrapException(this._badEventState$0());
+      this._async$_add$1(value);
+    },
+    addError$2: function(error, stackTrace) {
+      var replacement;
+      P.ArgumentError_checkNotNull(error, "error");
+      if (this._state >= 4)
+        throw H.wrapException(this._badEventState$0());
+      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
+      if (replacement != null) {
+        error = replacement.error;
+        stackTrace = replacement.stackTrace;
+      } else if (stackTrace == null)
+        stackTrace = P.AsyncError_defaultStackTrace(error);
+      this._addError$2(error, stackTrace);
+    },
+    addError$1: function(error) {
+      return this.addError$2(error, null);
+    },
+    close$0: function(_) {
+      var _this = this,
+        t1 = _this._state;
+      if ((t1 & 4) !== 0)
+        return _this._ensureDoneFuture$0();
+      if (t1 >= 4)
+        throw H.wrapException(_this._badEventState$0());
+      _this._closeUnchecked$0();
+      return _this._ensureDoneFuture$0();
+    },
+    _closeUnchecked$0: function() {
+      var t1 = this._state |= 4;
+      if ((t1 & 1) !== 0)
+        this._sendDone$0();
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, C.C__DelayedDone);
+    },
+    _async$_add$1: function(value) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, new P._DelayedData(value));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendError$2(error, stackTrace);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace));
+    },
+    _close$0: function() {
+      var addState = this._varData;
+      this._varData = addState.varData;
+      this._state &= 4294967287;
+      addState.addStreamFuture._asyncComplete$1(null);
+    },
+    _subscribe$4: function(onData, onError, onDone, cancelOnError) {
+      var subscription, pendingEvents, t1, addState, _this = this;
+      if ((_this._state & 3) !== 0)
+        throw H.wrapException(P.StateError$("Stream has already been listened to."));
+      subscription = P._ControllerSubscription$(_this, onData, onError, onDone, cancelOnError, H._instanceType(_this)._precomputed1);
+      pendingEvents = _this.get$_pendingEvents();
+      t1 = _this._state |= 1;
+      if ((t1 & 8) !== 0) {
+        addState = _this._varData;
+        addState.varData = subscription;
+        addState.addSubscription.resume$0(0);
+      } else
+        _this._varData = subscription;
+      subscription._setPendingEvents$1(pendingEvents);
+      subscription._guardCallback$1(new P._StreamController__subscribe_closure(_this));
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      var onCancel, cancelResult, e, s, exception, result0, t1, _this = this, result = null;
+      if ((_this._state & 8) !== 0)
+        result = _this._varData.cancel$0();
+      _this._varData = null;
+      _this._state = _this._state & 4294967286 | 2;
+      onCancel = _this.onCancel;
+      if (onCancel != null)
+        if (result == null)
+          try {
+            cancelResult = onCancel.call$0();
+            if (type$.Future_void._is(cancelResult))
+              result = cancelResult;
+          } catch (exception) {
+            e = H.unwrapException(exception);
+            s = H.getTraceFromException(exception);
+            result0 = new P._Future($.Zone__current, type$._Future_void);
+            result0._asyncCompleteError$2(e, s);
+            result = result0;
+          }
+        else
+          result = result.whenComplete$1(onCancel);
+      t1 = new P._StreamController__recordCancel_complete(_this);
+      if (result != null)
+        result = result.whenComplete$1(t1);
+      else
+        t1.call$0();
+      return result;
+    },
+    _recordPause$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.addSubscription.pause$0(0);
+      P._runGuarded(this.onPause);
+    },
+    _recordResume$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.addSubscription.resume$0(0);
+      P._runGuarded(this.onResume);
+    },
+    $isEventSink: 1,
+    set$onListen: function(val) {
+      return this.onListen = val;
+    },
+    set$onPause: function(val) {
+      return this.onPause = val;
+    },
+    set$onResume: function(val) {
+      return this.onResume = val;
+    },
+    set$onCancel: function(val) {
+      return this.onCancel = val;
+    }
+  };
+  P._StreamController__subscribe_closure.prototype = {
+    call$0: function() {
+      P._runGuarded(this.$this.onListen);
+    },
+    $signature: 0
+  };
+  P._StreamController__recordCancel_complete.prototype = {
+    call$0: function() {
+      var doneFuture = this.$this._doneFuture;
+      if (doneFuture != null && doneFuture._state === 0)
+        doneFuture._asyncComplete$1(null);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 1
+  };
+  P._SyncStreamControllerDispatch.prototype = {
+    _sendData$1: function(data) {
+      this.get$_subscription()._async$_add$1(data);
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addError$2(error, stackTrace);
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._close$0();
+    }
+  };
+  P._AsyncStreamControllerDispatch.prototype = {
+    _sendData$1: function(data) {
+      this.get$_subscription()._addPending$1(new P._DelayedData(data));
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addPending$1(new P._DelayedError(error, stackTrace));
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._addPending$1(C.C__DelayedDone);
+    }
+  };
+  P._AsyncStreamController.prototype = {};
+  P._SyncStreamController.prototype = {};
+  P._ControllerStream.prototype = {
+    get$hashCode: function(_) {
+      return (H.Primitives_objectHashCode(this._async$_controller) ^ 892482866) >>> 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      return other instanceof P._ControllerStream && other._async$_controller === this._async$_controller;
+    }
+  };
+  P._ControllerSubscription.prototype = {
+    _async$_onCancel$0: function() {
+      return this._async$_controller._recordCancel$1(this);
+    },
+    _async$_onPause$0: function() {
+      this._async$_controller._recordPause$1(this);
+    },
+    _async$_onResume$0: function() {
+      this._async$_controller._recordResume$1(this);
+    }
+  };
+  P._AddStreamState.prototype = {
+    cancel$0: function() {
+      var cancel = this.addSubscription.cancel$0();
+      if (cancel == null) {
+        this.addStreamFuture._asyncComplete$1(null);
+        return $.$get$Future__nullFuture();
+      }
+      return cancel.whenComplete$1(new P._AddStreamState_cancel_closure(this));
+    }
+  };
+  P._AddStreamState_cancel_closure.prototype = {
+    call$0: function() {
+      this.$this.addStreamFuture._asyncComplete$1(null);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._StreamControllerAddStreamState.prototype = {};
+  P._BufferingStreamSubscription.prototype = {
+    _setPendingEvents$1: function(pendingEvents) {
+      var _this = this;
+      if (pendingEvents == null)
+        return;
+      _this._pending = pendingEvents;
+      if (pendingEvents.lastPendingEvent != null) {
+        _this._state = (_this._state | 64) >>> 0;
+        pendingEvents.schedule$1(_this);
+      }
+    },
+    pause$1: function(_, resumeSignal) {
+      var t2, t3, _this = this,
+        t1 = _this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      t2 = (t1 + 128 | 4) >>> 0;
+      _this._state = t2;
+      if (t1 < 128) {
+        t3 = _this._pending;
+        if (t3 != null)
+          if (t3._state === 1)
+            t3._state = 3;
+      }
+      if ((t1 & 4) === 0 && (t2 & 32) === 0)
+        _this._guardCallback$1(_this.get$_async$_onPause());
+    },
+    pause$0: function($receiver) {
+      return this.pause$1($receiver, null);
+    },
+    resume$0: function(_) {
+      var _this = this,
+        t1 = _this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 >= 128) {
+        t1 = _this._state = t1 - 128;
+        if (t1 < 128)
+          if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent != null)
+            _this._pending.schedule$1(_this);
+          else {
+            t1 = (t1 & 4294967291) >>> 0;
+            _this._state = t1;
+            if ((t1 & 32) === 0)
+              _this._guardCallback$1(_this.get$_async$_onResume());
+          }
+      }
+    },
+    cancel$0: function() {
+      var _this = this,
+        t1 = (_this._state & 4294967279) >>> 0;
+      _this._state = t1;
+      if ((t1 & 8) === 0)
+        _this._cancel$0();
+      t1 = _this._cancelFuture;
+      return t1 == null ? $.$get$Future__nullFuture() : t1;
+    },
+    _cancel$0: function() {
+      var t2, _this = this,
+        t1 = _this._state = (_this._state | 8) >>> 0;
+      if ((t1 & 64) !== 0) {
+        t2 = _this._pending;
+        if (t2._state === 1)
+          t2._state = 3;
+      }
+      if ((t1 & 32) === 0)
+        _this._pending = null;
+      _this._cancelFuture = _this._async$_onCancel$0();
+    },
+    _async$_add$1: function(data) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendData$1(data);
+      else
+        this._addPending$1(new P._DelayedData(data));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendError$2(error, stackTrace);
+      else
+        this._addPending$1(new P._DelayedError(error, stackTrace));
+    },
+    _close$0: function() {
+      var _this = this,
+        t1 = _this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      t1 = (t1 | 2) >>> 0;
+      _this._state = t1;
+      if (t1 < 32)
+        _this._sendDone$0();
+      else
+        _this._addPending$1(C.C__DelayedDone);
+    },
+    _async$_onPause$0: function() {
+    },
+    _async$_onResume$0: function() {
+    },
+    _async$_onCancel$0: function() {
+      return null;
+    },
+    _addPending$1: function($event) {
+      var t1, _this = this,
+        pending = _this._pending;
+      if (pending == null)
+        pending = new P._StreamImplEvents();
+      _this._pending = pending;
+      pending.add$1(0, $event);
+      t1 = _this._state;
+      if ((t1 & 64) === 0) {
+        t1 = (t1 | 64) >>> 0;
+        _this._state = t1;
+        if (t1 < 128)
+          pending.schedule$1(_this);
+      }
+    },
+    _sendData$1: function(data) {
+      var _this = this,
+        t1 = _this._state;
+      _this._state = (t1 | 32) >>> 0;
+      _this._zone.runUnaryGuarded$1$2(_this._onData, data, H._instanceType(_this)._eval$1("_BufferingStreamSubscription.T"));
+      _this._state = (_this._state & 4294967263) >>> 0;
+      _this._checkState$1((t1 & 4) !== 0);
+    },
+    _sendError$2: function(error, stackTrace) {
+      var cancelFuture, _this = this,
+        t1 = _this._state,
+        t2 = new P._BufferingStreamSubscription__sendError_sendError(_this, error, stackTrace);
+      if ((t1 & 1) !== 0) {
+        _this._state = (t1 | 16) >>> 0;
+        _this._cancel$0();
+        cancelFuture = _this._cancelFuture;
+        if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
+          cancelFuture.whenComplete$1(t2);
+        else
+          t2.call$0();
+      } else {
+        t2.call$0();
+        _this._checkState$1((t1 & 4) !== 0);
+      }
+    },
+    _sendDone$0: function() {
+      var cancelFuture, _this = this,
+        t1 = new P._BufferingStreamSubscription__sendDone_sendDone(_this);
+      _this._cancel$0();
+      _this._state = (_this._state | 16) >>> 0;
+      cancelFuture = _this._cancelFuture;
+      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
+        cancelFuture.whenComplete$1(t1);
+      else
+        t1.call$0();
+    },
+    _guardCallback$1: function(callback) {
+      var _this = this,
+        t1 = _this._state;
+      _this._state = (t1 | 32) >>> 0;
+      callback.call$0();
+      _this._state = (_this._state & 4294967263) >>> 0;
+      _this._checkState$1((t1 & 4) !== 0);
+    },
+    _checkState$1: function(wasInputPaused) {
+      var t2, isInputPaused, _this = this,
+        t1 = _this._state;
+      if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent == null) {
+        t1 = _this._state = (t1 & 4294967231) >>> 0;
+        if ((t1 & 4) !== 0)
+          if (t1 < 128) {
+            t2 = _this._pending;
+            t2 = t2 == null ? null : t2.lastPendingEvent == null;
+            t2 = t2 !== false;
+          } else
+            t2 = false;
+        else
+          t2 = false;
+        if (t2) {
+          t1 = (t1 & 4294967291) >>> 0;
+          _this._state = t1;
+        }
+      }
+      for (; true; wasInputPaused = isInputPaused) {
+        if ((t1 & 8) !== 0) {
+          _this._pending = null;
+          return;
+        }
+        isInputPaused = (t1 & 4) !== 0;
+        if (wasInputPaused === isInputPaused)
+          break;
+        _this._state = (t1 ^ 32) >>> 0;
+        if (isInputPaused)
+          _this._async$_onPause$0();
+        else
+          _this._async$_onResume$0();
+        t1 = (_this._state & 4294967263) >>> 0;
+        _this._state = t1;
+      }
+      if ((t1 & 64) !== 0 && t1 < 128)
+        _this._pending.schedule$1(_this);
+    },
+    $isStreamSubscription: 1
+  };
+  P._BufferingStreamSubscription__sendError_sendError.prototype = {
+    call$0: function() {
+      var onError, t3, t4,
+        t1 = this.$this,
+        t2 = t1._state;
+      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 32) >>> 0;
+      onError = t1._onError;
+      t2 = this.error;
+      t3 = type$.Object;
+      t4 = t1._zone;
+      if (type$.void_Function_Object_StackTrace._is(onError))
+        t4.runBinaryGuarded$2$3(onError, t2, this.stackTrace, t3, type$.StackTrace);
+      else
+        t4.runUnaryGuarded$1$2(onError, t2, t3);
+      t1._state = (t1._state & 4294967263) >>> 0;
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 1
+  };
+  P._BufferingStreamSubscription__sendDone_sendDone.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._state;
+      if ((t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 42) >>> 0;
+      t1._zone.runGuarded$1(t1._onDone);
+      t1._state = (t1._state & 4294967263) >>> 0;
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 1
+  };
+  P._StreamImpl.prototype = {
+    listen$4$cancelOnError$onDone$onError: function(_, onData, cancelOnError, onDone, onError) {
+      return this._async$_controller._subscribe$4(onData, onError, onDone, cancelOnError === true);
+    },
+    listen$3$onDone$onError: function($receiver, onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError($receiver, onData, null, onDone, onError);
+    }
+  };
+  P._DelayedEvent.prototype = {
+    get$next: function() {
+      return this.next;
+    },
+    set$next: function(val) {
+      return this.next = val;
+    }
+  };
+  P._DelayedData.prototype = {
+    perform$1: function(dispatch) {
+      dispatch._sendData$1(this.value);
+    }
+  };
+  P._DelayedError.prototype = {
+    perform$1: function(dispatch) {
+      dispatch._sendError$2(this.error, this.stackTrace);
+    }
+  };
+  P._DelayedDone.prototype = {
+    perform$1: function(dispatch) {
+      dispatch._sendDone$0();
+    },
+    get$next: function() {
+      return null;
+    },
+    set$next: function(_) {
+      throw H.wrapException(P.StateError$("No events after a done."));
+    }
+  };
+  P._PendingEvents.prototype = {
+    schedule$1: function(dispatch) {
+      var _this = this,
+        t1 = _this._state;
+      if (t1 === 1)
+        return;
+      if (t1 >= 1) {
+        _this._state = 1;
+        return;
+      }
+      P.scheduleMicrotask(new P._PendingEvents_schedule_closure(_this, dispatch));
+      _this._state = 1;
+    }
+  };
+  P._PendingEvents_schedule_closure.prototype = {
+    call$0: function() {
+      var $event, nextEvent,
+        t1 = this.$this,
+        oldState = t1._state;
+      t1._state = 0;
+      if (oldState === 3)
+        return;
+      $event = t1.firstPendingEvent;
+      nextEvent = $event.get$next();
+      t1.firstPendingEvent = nextEvent;
+      if (nextEvent == null)
+        t1.lastPendingEvent = null;
+      $event.perform$1(this.dispatch);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  P._StreamImplEvents.prototype = {
+    add$1: function(_, $event) {
+      var _this = this,
+        lastEvent = _this.lastPendingEvent;
+      if (lastEvent == null)
+        _this.firstPendingEvent = _this.lastPendingEvent = $event;
+      else {
+        lastEvent.set$next($event);
+        _this.lastPendingEvent = $event;
+      }
+    }
+  };
+  P._DoneStreamSubscription.prototype = {
+    _schedule$0: function() {
+      var _this = this;
+      if ((_this._state & 2) !== 0)
+        return;
+      _this._zone.scheduleMicrotask$1(_this.get$_sendDone());
+      _this._state = (_this._state | 2) >>> 0;
+    },
+    pause$1: function(_, resumeSignal) {
+      this._state += 4;
+    },
+    pause$0: function($receiver) {
+      return this.pause$1($receiver, null);
+    },
+    resume$0: function(_) {
+      var t1 = this._state;
+      if (t1 >= 4) {
+        t1 = this._state = t1 - 4;
+        if (t1 < 4 && (t1 & 1) === 0)
+          this._schedule$0();
+      }
+    },
+    cancel$0: function() {
+      return $.$get$Future__nullFuture();
+    },
+    _sendDone$0: function() {
+      var doneHandler, _this = this,
+        t1 = _this._state = (_this._state & 4294967293) >>> 0;
+      if (t1 >= 4)
+        return;
+      _this._state = (t1 | 1) >>> 0;
+      doneHandler = _this._onDone;
+      if (doneHandler != null)
+        _this._zone.runGuarded$1(doneHandler);
+    },
+    $isStreamSubscription: 1
+  };
+  P._StreamIterator.prototype = {
+    get$current: function(_) {
+      if (this._subscription != null && this._isPaused)
+        return this._stateData;
+      return null;
+    },
+    moveNext$0: function() {
+      var future, _this = this,
+        subscription = _this._subscription;
+      if (subscription != null) {
+        if (_this._isPaused) {
+          future = new P._Future($.Zone__current, type$._Future_bool);
+          _this._stateData = future;
+          _this._isPaused = false;
+          subscription.resume$0(0);
+          return future;
+        }
+        throw H.wrapException(P.StateError$("Already waiting for next."));
+      }
+      return _this._initializeOrDone$0();
+    },
+    _initializeOrDone$0: function() {
+      var _this = this,
+        stateData = _this._stateData;
+      if (stateData != null) {
+        _this._subscription = stateData.listen$4$cancelOnError$onDone$onError(0, _this.get$_onData(), true, _this.get$_onDone(), _this.get$_onError());
+        return _this._stateData = new P._Future($.Zone__current, type$._Future_bool);
+      }
+      return $.$get$Future__falseFuture();
+    },
+    cancel$0: function() {
+      var _this = this,
+        subscription = _this._subscription,
+        stateData = _this._stateData;
+      _this._stateData = null;
+      if (subscription != null) {
+        _this._subscription = null;
+        if (!_this._isPaused)
+          stateData._asyncComplete$1(false);
+        return subscription.cancel$0();
+      }
+      return $.$get$Future__nullFuture();
+    },
+    _onData$1: function(data) {
+      var t1, _this = this,
+        moveNextFuture = _this._stateData;
+      _this._stateData = data;
+      _this._isPaused = true;
+      moveNextFuture._complete$1(true);
+      if (_this._isPaused) {
+        t1 = _this._subscription;
+        if (t1 != null)
+          t1.pause$0(0);
+      }
+    },
+    _onError$2: function(error, stackTrace) {
+      var moveNextFuture = this._stateData;
+      this._stateData = this._subscription = null;
+      moveNextFuture._completeError$2(error, stackTrace);
+    },
+    _onDone$0: function() {
+      var moveNextFuture = this._stateData;
+      this._stateData = this._subscription = null;
+      moveNextFuture._complete$1(false);
+    }
+  };
+  P._ForwardingStream.prototype = {
+    get$isBroadcast: function() {
+      return this._async$_source.get$isBroadcast();
+    },
+    listen$4$cancelOnError$onDone$onError: function(_, onData, cancelOnError, onDone, onError) {
+      var t1 = H._instanceType(this),
+        t2 = t1._rest[1],
+        t3 = $.Zone__current,
+        t4 = cancelOnError === true ? 1 : 0,
+        t5 = P._BufferingStreamSubscription__registerDataHandler(t3, onData, t2),
+        t6 = P._BufferingStreamSubscription__registerErrorHandler(t3, onError),
+        t7 = onDone == null ? P.async___nullDoneHandler$closure() : onDone;
+      t2 = new P._ForwardingStreamSubscription(this, t5, t6, t3.registerCallback$1$1(t7, type$.void), t3, t4, t1._eval$1("@<1>")._bind$1(t2)._eval$1("_ForwardingStreamSubscription<1,2>"));
+      t2._subscription = this._async$_source.listen$3$onDone$onError(0, t2.get$_handleData(), t2.get$_handleDone(), t2.get$_handleError());
+      return t2;
+    },
+    listen$3$onDone$onError: function($receiver, onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError($receiver, onData, null, onDone, onError);
+    }
+  };
+  P._ForwardingStreamSubscription.prototype = {
+    _async$_add$1: function(data) {
+      if ((this._state & 2) !== 0)
+        return;
+      this.super$_BufferingStreamSubscription$_add(data);
+    },
+    _addError$2: function(error, stackTrace) {
+      if ((this._state & 2) !== 0)
+        return;
+      this.super$_BufferingStreamSubscription$_addError(error, stackTrace);
+    },
+    _async$_onPause$0: function() {
+      var t1 = this._subscription;
+      if (t1 != null)
+        t1.pause$0(0);
+    },
+    _async$_onResume$0: function() {
+      var t1 = this._subscription;
+      if (t1 != null)
+        t1.resume$0(0);
+    },
+    _async$_onCancel$0: function() {
+      var subscription = this._subscription;
+      if (subscription != null) {
+        this._subscription = null;
+        return subscription.cancel$0();
+      }
+      return null;
+    },
+    _handleData$1: function(data) {
+      this._stream._handleData$2(data, this);
+    },
+    _handleError$2: function(error, stackTrace) {
+      this._addError$2(error, stackTrace);
+    },
+    _handleDone$0: function() {
+      this._close$0();
+    }
+  };
+  P._ExpandStream.prototype = {
+    _handleData$2: function(inputEvent, sink) {
+      var value, e, s, t1, exception;
+      try {
+        for (t1 = J.get$iterator$ax(this._expand.call$1(inputEvent)); t1.moveNext$0();) {
+          value = t1.get$current(t1);
+          sink._async$_add$1(value);
+        }
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        P._addErrorWithReplacement(sink, e, s);
+      }
+    }
+  };
+  P.AsyncError.prototype = {
+    toString$0: function(_) {
+      return H.S(this.error);
+    },
+    $isError: 1,
+    get$stackTrace: function() {
+      return this.stackTrace;
+    }
+  };
+  P._ZoneFunction.prototype = {};
+  P._RunNullaryZoneFunction.prototype = {};
+  P._RunUnaryZoneFunction.prototype = {};
+  P._RunBinaryZoneFunction.prototype = {};
+  P._RegisterNullaryZoneFunction.prototype = {};
+  P._RegisterUnaryZoneFunction.prototype = {};
+  P._RegisterBinaryZoneFunction.prototype = {};
+  P._ZoneSpecification.prototype = {$isZoneSpecification: 1};
+  P._ZoneDelegate.prototype = {$isZoneDelegate: 1};
+  P._Zone.prototype = {$isZone: 1};
+  P._CustomZone.prototype = {
+    get$_delegate: function() {
+      var t1 = this._delegateCache;
+      return t1 == null ? this._delegateCache = new P._ZoneDelegate(this) : t1;
+    },
+    get$_parentDelegate: function() {
+      return this.parent.get$_delegate();
+    },
+    get$errorZone: function() {
+      return this._handleUncaughtError.zone;
+    },
+    runGuarded$1: function(f) {
+      var e, s, exception;
+      try {
+        this.run$1$1(0, f, type$.void);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        this.handleUncaughtError$2(e, s);
+      }
+    },
+    runUnaryGuarded$1$2: function(f, arg, $T) {
+      var e, s, exception;
+      try {
+        this.runUnary$2$2(f, arg, type$.void, $T);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        this.handleUncaughtError$2(e, s);
+      }
+    },
+    runBinaryGuarded$2$3: function(f, arg1, arg2, T1, T2) {
+      var e, s, exception;
+      try {
+        this.runBinary$3$3(f, arg1, arg2, type$.void, T1, T2);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        this.handleUncaughtError$2(e, s);
+      }
+    },
+    bindCallback$1$1: function(f, $R) {
+      return new P._CustomZone_bindCallback_closure(this, this.registerCallback$1$1(f, $R), $R);
+    },
+    bindUnaryCallback$2$1: function(f, $R, $T) {
+      return new P._CustomZone_bindUnaryCallback_closure(this, this.registerUnaryCallback$2$1(f, $R, $T), $T, $R);
+    },
+    bindCallbackGuarded$1: function(f) {
+      return new P._CustomZone_bindCallbackGuarded_closure(this, this.registerCallback$1$1(f, type$.void));
+    },
+    $index: function(_, key) {
+      var value,
+        t1 = this._async$_map,
+        result = t1.$index(0, key);
+      if (result != null || t1.containsKey$1(key))
+        return result;
+      value = this.parent.$index(0, key);
+      if (value != null)
+        t1.$indexSet(0, key, value);
+      return value;
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      var implementation = this._handleUncaughtError,
+        t1 = implementation.zone;
+      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      var implementation = this._fork,
+        t1 = implementation.zone;
+      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, specification, zoneValues);
+    },
+    run$1$1: function(_, f) {
+      var implementation = this._run,
+        t1 = implementation.zone;
+      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, f);
+    },
+    runUnary$2$2: function(f, arg) {
+      var implementation = this._runUnary,
+        t1 = implementation.zone;
+      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, f, arg);
+    },
+    runBinary$3$3: function(f, arg1, arg2) {
+      var implementation = this._runBinary,
+        t1 = implementation.zone;
+      return implementation.$function.call$6(t1, t1.get$_parentDelegate(), this, f, arg1, arg2);
+    },
+    registerCallback$1$1: function(callback) {
+      var implementation = this._registerCallback,
+        t1 = implementation.zone;
+      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, callback);
+    },
+    registerUnaryCallback$2$1: function(callback) {
+      var implementation = this._registerUnaryCallback,
+        t1 = implementation.zone;
+      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, callback);
+    },
+    registerBinaryCallback$3$1: function(callback) {
+      var implementation = this._registerBinaryCallback,
+        t1 = implementation.zone;
+      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, callback);
+    },
+    errorCallback$2: function(error, stackTrace) {
+      var implementation, implementationZone;
+      P.ArgumentError_checkNotNull(error, "error");
+      implementation = this._errorCallback;
+      implementationZone = implementation.zone;
+      if (implementationZone === C.C__RootZone)
+        return null;
+      return implementation.$function.call$5(implementationZone, implementationZone.get$_parentDelegate(), this, error, stackTrace);
+    },
+    scheduleMicrotask$1: function(f) {
+      var implementation = this._scheduleMicrotask,
+        t1 = implementation.zone;
+      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, f);
+    },
+    createTimer$2: function(duration, f) {
+      var implementation = this._createTimer,
+        t1 = implementation.zone;
+      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, duration, f);
+    },
+    print$1: function(line) {
+      var implementation = this._print,
+        t1 = implementation.zone;
+      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, line);
+    },
+    get$_run: function() {
+      return this._run;
+    },
+    get$_runUnary: function() {
+      return this._runUnary;
+    },
+    get$_runBinary: function() {
+      return this._runBinary;
+    },
+    get$_registerCallback: function() {
+      return this._registerCallback;
+    },
+    get$_registerUnaryCallback: function() {
+      return this._registerUnaryCallback;
+    },
+    get$_registerBinaryCallback: function() {
+      return this._registerBinaryCallback;
+    },
+    get$_errorCallback: function() {
+      return this._errorCallback;
+    },
+    get$_scheduleMicrotask: function() {
+      return this._scheduleMicrotask;
+    },
+    get$_createTimer: function() {
+      return this._createTimer;
+    },
+    get$_createPeriodicTimer: function() {
+      return this._createPeriodicTimer;
+    },
+    get$_print: function() {
+      return this._print;
+    },
+    get$_fork: function() {
+      return this._fork;
+    },
+    get$_handleUncaughtError: function() {
+      return this._handleUncaughtError;
+    },
+    get$_async$_map: function() {
+      return this._async$_map;
+    }
+  };
+  P._CustomZone_bindCallback_closure.prototype = {
+    call$0: function() {
+      return this.$this.run$1$1(0, this.registered, this.R);
+    },
+    $signature: function() {
+      return this.R._eval$1("0()");
+    }
+  };
+  P._CustomZone_bindUnaryCallback_closure.prototype = {
+    call$1: function(arg) {
+      var _this = this;
+      return _this.$this.runUnary$2$2(_this.registered, arg, _this.R, _this.T);
+    },
+    $signature: function() {
+      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
+    }
+  };
+  P._CustomZone_bindCallbackGuarded_closure.prototype = {
+    call$0: function() {
+      return this.$this.runGuarded$1(this.registered);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 1
+  };
+  P._rootHandleUncaughtError_closure.prototype = {
+    call$0: function() {
+      var error = H.wrapException(this.error);
+      error.stack = J.toString$0$(this.stackTrace);
+      throw error;
+    },
+    $signature: 0
+  };
+  P._RootZone.prototype = {
+    get$_run: function() {
+      return C._RunNullaryZoneFunction__RootZone__rootRun;
+    },
+    get$_runUnary: function() {
+      return C._RunUnaryZoneFunction__RootZone__rootRunUnary;
+    },
+    get$_runBinary: function() {
+      return C._RunBinaryZoneFunction__RootZone__rootRunBinary;
+    },
+    get$_registerCallback: function() {
+      return C._RegisterNullaryZoneFunction__RootZone__rootRegisterCallback;
+    },
+    get$_registerUnaryCallback: function() {
+      return C._RegisterUnaryZoneFunction_Bqo;
+    },
+    get$_registerBinaryCallback: function() {
+      return C._RegisterBinaryZoneFunction_kGu;
+    },
+    get$_errorCallback: function() {
+      return C._ZoneFunction__RootZone__rootErrorCallback;
+    },
+    get$_scheduleMicrotask: function() {
+      return C._ZoneFunction__RootZone__rootScheduleMicrotask;
+    },
+    get$_createTimer: function() {
+      return C._ZoneFunction__RootZone__rootCreateTimer;
+    },
+    get$_createPeriodicTimer: function() {
+      return C._ZoneFunction_3bB;
+    },
+    get$_print: function() {
+      return C._ZoneFunction__RootZone__rootPrint;
+    },
+    get$_fork: function() {
+      return C._ZoneFunction__RootZone__rootFork;
+    },
+    get$_handleUncaughtError: function() {
+      return C._ZoneFunction_NMc;
+    },
+    get$_async$_map: function() {
+      return $.$get$_RootZone__rootMap();
+    },
+    get$_delegate: function() {
+      var t1 = $._RootZone__rootDelegate;
+      return t1 == null ? $._RootZone__rootDelegate = new P._ZoneDelegate(this) : t1;
+    },
+    get$_parentDelegate: function() {
+      return this.get$_delegate();
+    },
+    get$errorZone: function() {
+      return this;
+    },
+    runGuarded$1: function(f) {
+      var e, s, exception, _null = null;
+      try {
+        if (C.C__RootZone === $.Zone__current) {
+          f.call$0();
+          return;
+        }
+        P._rootRun(_null, _null, this, f);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        P._rootHandleUncaughtError(_null, _null, this, e, s);
+      }
+    },
+    runUnaryGuarded$1$2: function(f, arg) {
+      var e, s, exception, _null = null;
+      try {
+        if (C.C__RootZone === $.Zone__current) {
+          f.call$1(arg);
+          return;
+        }
+        P._rootRunUnary(_null, _null, this, f, arg);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        P._rootHandleUncaughtError(_null, _null, this, e, s);
+      }
+    },
+    runBinaryGuarded$2$3: function(f, arg1, arg2) {
+      var e, s, exception, _null = null;
+      try {
+        if (C.C__RootZone === $.Zone__current) {
+          f.call$2(arg1, arg2);
+          return;
+        }
+        P._rootRunBinary(_null, _null, this, f, arg1, arg2);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        P._rootHandleUncaughtError(_null, _null, this, e, s);
+      }
+    },
+    bindCallback$1$1: function(f, $R) {
+      return new P._RootZone_bindCallback_closure(this, f, $R);
+    },
+    bindCallbackGuarded$1: function(f) {
+      return new P._RootZone_bindCallbackGuarded_closure(this, f);
+    },
+    $index: function(_, key) {
+      return null;
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      P._rootHandleUncaughtError(null, null, this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return P._rootFork(null, null, this, specification, zoneValues);
+    },
+    run$1$1: function(_, f) {
+      if ($.Zone__current === C.C__RootZone)
+        return f.call$0();
+      return P._rootRun(null, null, this, f);
+    },
+    runUnary$2$2: function(f, arg) {
+      if ($.Zone__current === C.C__RootZone)
+        return f.call$1(arg);
+      return P._rootRunUnary(null, null, this, f, arg);
+    },
+    runBinary$3$3: function(f, arg1, arg2) {
+      if ($.Zone__current === C.C__RootZone)
+        return f.call$2(arg1, arg2);
+      return P._rootRunBinary(null, null, this, f, arg1, arg2);
+    },
+    registerCallback$1$1: function(f) {
+      return f;
+    },
+    registerUnaryCallback$2$1: function(f) {
+      return f;
+    },
+    registerBinaryCallback$3$1: function(f) {
+      return f;
+    },
+    errorCallback$2: function(error, stackTrace) {
+      return null;
+    },
+    scheduleMicrotask$1: function(f) {
+      P._rootScheduleMicrotask(null, null, this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return P.Timer__createTimer(duration, f);
+    },
+    print$1: function(line) {
+      H.printString(H.S(line));
+    }
+  };
+  P._RootZone_bindCallback_closure.prototype = {
+    call$0: function() {
+      return this.$this.run$1$1(0, this.f, this.R);
+    },
+    $signature: function() {
+      return this.R._eval$1("0()");
+    }
+  };
+  P._RootZone_bindCallbackGuarded_closure.prototype = {
+    call$0: function() {
+      return this.$this.runGuarded$1(this.f);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 1
+  };
+  P._HashMap.prototype = {
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function(_) {
+      return new P._HashMapKeyIterable(this, H._instanceType(this)._eval$1("_HashMapKeyIterable<1>"));
+    },
+    get$values: function(_) {
+      var t1 = H._instanceType(this);
+      return H.MappedIterable_MappedIterable(new P._HashMapKeyIterable(this, t1._eval$1("_HashMapKeyIterable<1>")), new P._HashMap_values_closure(this), t1._precomputed1, t1._rest[1]);
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key == "string" && key !== "__proto__") {
+        strings = this._collection$_strings;
+        return strings == null ? false : strings[key] != null;
+      } else if (typeof key == "number" && (key & 1073741823) === key) {
+        nums = this._collection$_nums;
+        return nums == null ? false : nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._collection$_rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(this._getBucket$2(rest, key), key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      other.forEach$1(0, new P._HashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, t1, nums;
+      if (typeof key == "string" && key !== "__proto__") {
+        strings = this._collection$_strings;
+        t1 = strings == null ? null : P._HashMap__getTableEntry(strings, key);
+        return t1;
+      } else if (typeof key == "number" && (key & 1073741823) === key) {
+        nums = this._collection$_nums;
+        t1 = nums == null ? null : P._HashMap__getTableEntry(nums, key);
+        return t1;
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var bucket, index,
+        rest = this._collection$_rest;
+      if (rest == null)
+        return null;
+      bucket = this._getBucket$2(rest, key);
+      index = this._findBucketIndex$2(bucket, key);
+      return index < 0 ? null : bucket[index + 1];
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums, _this = this;
+      if (typeof key == "string" && key !== "__proto__") {
+        strings = _this._collection$_strings;
+        _this._collection$_addHashTableEntry$3(strings == null ? _this._collection$_strings = P._HashMap__newHashTable() : strings, key, value);
+      } else if (typeof key == "number" && (key & 1073741823) === key) {
+        nums = _this._collection$_nums;
+        _this._collection$_addHashTableEntry$3(nums == null ? _this._collection$_nums = P._HashMap__newHashTable() : nums, key, value);
+      } else
+        _this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var hash, bucket, index, _this = this,
+        rest = _this._collection$_rest;
+      if (rest == null)
+        rest = _this._collection$_rest = P._HashMap__newHashTable();
+      hash = _this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null) {
+        P._HashMap__setTableEntry(rest, hash, [key, value]);
+        ++_this._collection$_length;
+        _this._keys = null;
+      } else {
+        index = _this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index + 1] = value;
+        else {
+          bucket.push(key, value);
+          ++_this._collection$_length;
+          _this._keys = null;
+        }
+      }
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      var value;
+      if (this.containsKey$1(key))
+        return this.$index(0, key);
+      value = ifAbsent.call$0();
+      this.$indexSet(0, key, value);
+      return value;
+    },
+    remove$1: function(_, key) {
+      var t1;
+      if (typeof key == "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._collection$_strings, key);
+      else {
+        t1 = this._remove$1(key);
+        return t1;
+      }
+    },
+    _remove$1: function(key) {
+      var hash, bucket, index, result, _this = this,
+        rest = _this._collection$_rest;
+      if (rest == null)
+        return null;
+      hash = _this._computeHashCode$1(key);
+      bucket = rest[hash];
+      index = _this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return null;
+      --_this._collection$_length;
+      _this._keys = null;
+      result = bucket.splice(index, 2)[1];
+      if (0 === bucket.length)
+        delete rest[hash];
+      return result;
+    },
+    forEach$1: function(_, action) {
+      var $length, i, key, _this = this,
+        keys = _this._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        key = keys[i];
+        action.call$2(key, _this.$index(0, key));
+        if (keys !== _this._keys)
+          throw H.wrapException(P.ConcurrentModificationError$(_this));
+      }
+    },
+    _computeKeys$0: function() {
+      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
+        result = _this._keys;
+      if (result != null)
+        return result;
+      result = P.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
+      strings = _this._collection$_strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = _this._collection$_nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = _this._collection$_rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; i0 += 2) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      return _this._keys = result;
+    },
+    _collection$_addHashTableEntry$3: function(table, key, value) {
+      if (table[key] == null) {
+        ++this._collection$_length;
+        this._keys = null;
+      }
+      P._HashMap__setTableEntry(table, key, value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var value;
+      if (table != null && table[key] != null) {
+        value = P._HashMap__getTableEntry(table, key);
+        delete table[key];
+        --this._collection$_length;
+        this._keys = null;
+        return value;
+      } else
+        return null;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 1073741823;
+    },
+    _getBucket$2: function(table, key) {
+      return table[this._computeHashCode$1(key)];
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (J.$eq$(bucket[i], key))
+          return i;
+      return -1;
+    }
+  };
+  P._HashMap_values_closure.prototype = {
+    call$1: function(each) {
+      return this.$this.$index(0, each);
+    },
+    $signature: function() {
+      return H._instanceType(this.$this)._eval$1("2(1)");
+    }
+  };
+  P._HashMap_addAll_closure.prototype = {
+    call$2: function(key, value) {
+      this.$this.$indexSet(0, key, value);
+    },
+    $signature: function() {
+      return H._instanceType(this.$this)._eval$1("Null(1,2)");
+    }
+  };
+  P._HashMapKeyIterable.prototype = {
+    get$length: function(_) {
+      return this._collection$_map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1 = this._collection$_map;
+      return new P._HashMapKeyIterator(t1, t1._computeKeys$0());
+    },
+    contains$1: function(_, element) {
+      return this._collection$_map.containsKey$1(element);
+    }
+  };
+  P._HashMapKeyIterator.prototype = {
+    get$current: function(_) {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var _this = this,
+        keys = _this._keys,
+        offset = _this._offset,
+        t1 = _this._collection$_map;
+      if (keys !== t1._keys)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= keys.length) {
+        _this._collection$_current = null;
+        return false;
+      } else {
+        _this._collection$_current = keys[offset];
+        _this._offset = offset + 1;
+        return true;
+      }
+    }
+  };
+  P._LinkedIdentityHashMap.prototype = {
+    internalComputeHashCode$1: function(key) {
+      return H.objectHashCode(key) & 1073741823;
+    },
+    internalFindBucketIndex$2: function(bucket, key) {
+      var $length, i, t1;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i) {
+        t1 = bucket[i].hashMapCellKey;
+        if (t1 == null ? key == null : t1 === key)
+          return i;
+      }
+      return -1;
+    }
+  };
+  P._LinkedCustomHashMap.prototype = {
+    $index: function(_, key) {
+      if (!this._validKey.call$1(key))
+        return null;
+      return this.super$JsLinkedHashMap$internalGet(key);
+    },
+    $indexSet: function(_, key, value) {
+      this.super$JsLinkedHashMap$internalSet(key, value);
+    },
+    containsKey$1: function(key) {
+      if (!this._validKey.call$1(key))
+        return false;
+      return this.super$JsLinkedHashMap$internalContainsKey(key);
+    },
+    remove$1: function(_, key) {
+      if (!this._validKey.call$1(key))
+        return null;
+      return this.super$JsLinkedHashMap$internalRemove(key);
+    },
+    internalComputeHashCode$1: function(key) {
+      return this._hashCode.call$1(key) & 1073741823;
+    },
+    internalFindBucketIndex$2: function(bucket, key) {
+      var $length, t1, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (t1 = this._equals, i = 0; i < $length; ++i)
+        if (t1.call$2(bucket[i].hashMapCellKey, key))
+          return i;
+      return -1;
+    }
+  };
+  P._LinkedCustomHashMap_closure.prototype = {
+    call$1: function(v) {
+      return this.K._is(v);
+    },
+    $signature: 282
+  };
+  P._LinkedHashSet.prototype = {
+    _newSet$0: function() {
+      return new P._LinkedHashSet(H._instanceType(this)._eval$1("_LinkedHashSet<1>"));
+    },
+    _newSimilarSet$1$0: function($R) {
+      return new P._LinkedHashSet($R._eval$1("_LinkedHashSet<0>"));
+    },
+    _newSimilarSet$0: function() {
+      return this._newSimilarSet$1$0(type$.dynamic);
+    },
+    get$iterator: function(_) {
+      var t1 = new P._LinkedHashSetIterator(this, this._collection$_modifications);
+      t1._collection$_cell = this._collection$_first;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object == "string" && object !== "__proto__") {
+        strings = this._collection$_strings;
+        if (strings == null)
+          return false;
+        return strings[object] != null;
+      } else if (typeof object == "number" && (object & 1073741823) === object) {
+        nums = this._collection$_nums;
+        if (nums == null)
+          return false;
+        return nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._collection$_rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    get$first: function(_) {
+      var first = this._collection$_first;
+      if (first == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return first._element;
+    },
+    get$last: function(_) {
+      var last = this._collection$_last;
+      if (last == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return last._element;
+    },
+    add$1: function(_, element) {
+      var strings, nums, _this = this;
+      if (typeof element == "string" && element !== "__proto__") {
+        strings = _this._collection$_strings;
+        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = P._LinkedHashSet__newHashTable() : strings, element);
+      } else if (typeof element == "number" && (element & 1073741823) === element) {
+        nums = _this._collection$_nums;
+        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = P._LinkedHashSet__newHashTable() : nums, element);
+      } else
+        return _this._add$1(element);
+    },
+    _add$1: function(element) {
+      var hash, bucket, _this = this,
+        rest = _this._collection$_rest;
+      if (rest == null)
+        rest = _this._collection$_rest = P._LinkedHashSet__newHashTable();
+      hash = _this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [_this._collection$_newLinkedCell$1(element)];
+      else {
+        if (_this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(_this._collection$_newLinkedCell$1(element));
+      }
+      return true;
+    },
+    remove$1: function(_, object) {
+      var _this = this;
+      if (typeof object == "string" && object !== "__proto__")
+        return _this._removeHashTableEntry$2(_this._collection$_strings, object);
+      else if (typeof object == "number" && (object & 1073741823) === object)
+        return _this._removeHashTableEntry$2(_this._collection$_nums, object);
+      else
+        return _this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var hash, bucket, index, cell, _this = this,
+        rest = _this._collection$_rest;
+      if (rest == null)
+        return false;
+      hash = _this._computeHashCode$1(object);
+      bucket = rest[hash];
+      index = _this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      cell = bucket.splice(index, 1)[0];
+      if (0 === bucket.length)
+        delete rest[hash];
+      _this._unlinkCell$1(cell);
+      return true;
+    },
+    _collection$_addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = this._collection$_newLinkedCell$1(element);
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      var cell;
+      if (table == null)
+        return false;
+      cell = table[element];
+      if (cell == null)
+        return false;
+      this._unlinkCell$1(cell);
+      delete table[element];
+      return true;
+    },
+    _collection$_modified$0: function() {
+      this._collection$_modifications = 1073741823 & this._collection$_modifications + 1;
+    },
+    _collection$_newLinkedCell$1: function(element) {
+      var t1, _this = this,
+        cell = new P._LinkedHashSetCell(element);
+      if (_this._collection$_first == null)
+        _this._collection$_first = _this._collection$_last = cell;
+      else {
+        t1 = _this._collection$_last;
+        t1.toString;
+        cell._collection$_previous = t1;
+        _this._collection$_last = t1._collection$_next = cell;
+      }
+      ++_this._collection$_length;
+      _this._collection$_modified$0();
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var _this = this,
+        previous = cell._collection$_previous,
+        next = cell._collection$_next;
+      if (previous == null)
+        _this._collection$_first = next;
+      else
+        previous._collection$_next = next;
+      if (next == null)
+        _this._collection$_last = previous;
+      else
+        next._collection$_previous = previous;
+      --_this._collection$_length;
+      _this._collection$_modified$0();
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 1073741823;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq$(bucket[i]._element, element))
+          return i;
+      return -1;
+    }
+  };
+  P._LinkedIdentityHashSet.prototype = {
+    _newSet$0: function() {
+      return new P._LinkedIdentityHashSet(this.$ti);
+    },
+    _newSimilarSet$1$0: function($R) {
+      return new P._LinkedIdentityHashSet($R._eval$1("_LinkedIdentityHashSet<0>"));
+    },
+    _newSimilarSet$0: function() {
+      return this._newSimilarSet$1$0(type$.dynamic);
+    },
+    _computeHashCode$1: function(key) {
+      return H.objectHashCode(key) & 1073741823;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i, t1;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i) {
+        t1 = bucket[i]._element;
+        if (t1 == null ? element == null : t1 === element)
+          return i;
+      }
+      return -1;
+    }
+  };
+  P._LinkedHashSetCell.prototype = {};
+  P._LinkedHashSetIterator.prototype = {
+    get$current: function(_) {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var _this = this,
+        cell = _this._collection$_cell,
+        t1 = _this._set;
+      if (_this._collection$_modifications !== t1._collection$_modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (cell == null) {
+        _this._collection$_current = null;
+        return false;
+      } else {
+        _this._collection$_current = cell._element;
+        _this._collection$_cell = cell._collection$_next;
+        return true;
+      }
+    }
+  };
+  P.UnmodifiableListView.prototype = {
+    cast$1$0: function(_, $R) {
+      return new P.UnmodifiableListView(J.cast$1$0$ax(this._collection$_source, $R), $R._eval$1("UnmodifiableListView<0>"));
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._collection$_source);
+    },
+    $index: function(_, index) {
+      return J.elementAt$1$ax(this._collection$_source, index);
+    }
+  };
+  P.HashMap_HashMap$from_closure.prototype = {
+    call$2: function(k, v) {
+      this.result.$indexSet(0, this.K._as(k), this.V._as(v));
+    },
+    $signature: 104
+  };
+  P.IterableBase.prototype = {};
+  P.LinkedHashMap_LinkedHashMap$from_closure.prototype = {
+    call$2: function(k, v) {
+      this.result.$indexSet(0, this.K._as(k), this.V._as(v));
+    },
+    $signature: 104
+  };
+  P.ListBase.prototype = {$isEfficientLengthIterable: 1, $isIterable: 1, $isList: 1};
+  P.ListMixin.prototype = {
+    get$iterator: function(receiver) {
+      return new H.ListIterator(receiver, this.get$length(receiver));
+    },
+    elementAt$1: function(receiver, index) {
+      return this.$index(receiver, index);
+    },
+    get$isEmpty: function(receiver) {
+      return this.get$length(receiver) === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return !this.get$isEmpty(receiver);
+    },
+    get$first: function(receiver) {
+      if (this.get$length(receiver) === 0)
+        throw H.wrapException(H.IterableElementError_noElement());
+      return this.$index(receiver, 0);
+    },
+    get$last: function(receiver) {
+      if (this.get$length(receiver) === 0)
+        throw H.wrapException(H.IterableElementError_noElement());
+      return this.$index(receiver, this.get$length(receiver) - 1);
+    },
+    get$single: function(receiver) {
+      if (this.get$length(receiver) === 0)
+        throw H.wrapException(H.IterableElementError_noElement());
+      if (this.get$length(receiver) > 1)
+        throw H.wrapException(H.IterableElementError_tooMany());
+      return this.$index(receiver, 0);
+    },
+    contains$1: function(receiver, element) {
+      var i,
+        $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        if (J.$eq$(this.$index(receiver, i), element))
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    every$1: function(receiver, test) {
+      var i,
+        $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        if (!test.call$1(this.$index(receiver, i)))
+          return false;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return true;
+    },
+    any$1: function(receiver, test) {
+      var i,
+        $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        if (test.call$1(this.$index(receiver, i)))
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    join$1: function(receiver, separator) {
+      var t1;
+      if (this.get$length(receiver) === 0)
+        return "";
+      t1 = P.StringBuffer__writeAll("", receiver, separator);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    join$0: function($receiver) {
+      return this.join$1($receiver, "");
+    },
+    where$1: function(receiver, test) {
+      return new H.WhereIterable(receiver, test, H.instanceType(receiver)._eval$1("WhereIterable<ListMixin.E>"));
+    },
+    map$1$1: function(receiver, f, $T) {
+      return new H.MappedListIterable(receiver, f, H.instanceType(receiver)._eval$1("@<ListMixin.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
+    },
+    expand$1$1: function(receiver, f, $T) {
+      return new H.ExpandIterable(receiver, f, H.instanceType(receiver)._eval$1("@<ListMixin.E>")._bind$1($T)._eval$1("ExpandIterable<1,2>"));
+    },
+    fold$1$2: function(receiver, initialValue, combine) {
+      var value, i,
+        $length = this.get$length(receiver);
+      for (value = initialValue, i = 0; i < $length; ++i) {
+        value = combine.call$2(value, this.$index(receiver, i));
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return value;
+    },
+    fold$2: function($receiver, initialValue, combine) {
+      return this.fold$1$2($receiver, initialValue, combine, type$.dynamic);
+    },
+    skip$1: function(receiver, count) {
+      return H.SubListIterable$(receiver, count, null, H.instanceType(receiver)._eval$1("ListMixin.E"));
+    },
+    take$1: function(receiver, count) {
+      return H.SubListIterable$(receiver, 0, count, H.instanceType(receiver)._eval$1("ListMixin.E"));
+    },
+    toList$1$growable: function(receiver, growable) {
+      var t1, first, result, i, _this = this;
+      if (_this.get$isEmpty(receiver)) {
+        t1 = H.instanceType(receiver)._eval$1("ListMixin.E");
+        return growable ? J.JSArray_JSArray$growable(0, t1) : J.JSArray_JSArray$fixed(0, t1);
+      }
+      first = _this.$index(receiver, 0);
+      result = P.List_List$filled(_this.get$length(receiver), first, growable, H.instanceType(receiver)._eval$1("ListMixin.E"));
+      for (i = 1; i < _this.get$length(receiver); ++i)
+        result[i] = _this.$index(receiver, i);
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    toSet$0: function(receiver) {
+      var i,
+        result = P.LinkedHashSet_LinkedHashSet(H.instanceType(receiver)._eval$1("ListMixin.E"));
+      for (i = 0; i < this.get$length(receiver); ++i)
+        result.add$1(0, this.$index(receiver, i));
+      return result;
+    },
+    add$1: function(receiver, element) {
+      var t1 = this.get$length(receiver);
+      this.set$length(receiver, t1 + 1);
+      this.$indexSet(receiver, t1, element);
+    },
+    addAll$1: function(receiver, iterable) {
+      var t1,
+        i = this.get$length(receiver);
+      for (t1 = iterable.get$iterator(iterable); t1.moveNext$0();) {
+        this.add$1(receiver, t1.get$current(t1));
+        ++i;
+      }
+    },
+    cast$1$0: function(receiver, $R) {
+      return new H.CastList(receiver, H.instanceType(receiver)._eval$1("@<ListMixin.E>")._bind$1($R)._eval$1("CastList<1,2>"));
+    },
+    sort$1: function(receiver, compare) {
+      H.Sort_sort(receiver, compare == null ? P.collection_ListMixin__compareAny$closure() : compare);
+    },
+    sublist$2: function(receiver, start, end) {
+      var listLength = this.get$length(receiver);
+      P.RangeError_checkValidRange(start, end, listLength);
+      return P.List_List$from(this.getRange$2(receiver, start, end), true, H.instanceType(receiver)._eval$1("ListMixin.E"));
+    },
+    getRange$2: function(receiver, start, end) {
+      P.RangeError_checkValidRange(start, end, this.get$length(receiver));
+      return H.SubListIterable$(receiver, start, end, H.instanceType(receiver)._eval$1("ListMixin.E"));
+    },
+    fillRange$3: function(receiver, start, end, fill) {
+      var i;
+      P.RangeError_checkValidRange(start, end, this.get$length(receiver));
+      for (i = start; i < end; ++i)
+        this.$indexSet(receiver, i, fill);
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      var $length, otherStart, otherList, t1, i;
+      P.RangeError_checkValidRange(start, end, this.get$length(receiver));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      P.RangeError_checkNotNegative(skipCount, "skipCount");
+      if (H.instanceType(receiver)._eval$1("List<ListMixin.E>")._is(iterable)) {
+        otherStart = skipCount;
+        otherList = iterable;
+      } else {
+        otherList = J.skip$1$ax(iterable, skipCount).toList$1$growable(0, false);
+        otherStart = 0;
+      }
+      t1 = J.getInterceptor$asx(otherList);
+      if (otherStart + $length > t1.get$length(otherList))
+        throw H.wrapException(H.IterableElementError_tooFew());
+      if (otherStart < start)
+        for (i = $length - 1; i >= 0; --i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+      else
+        for (i = 0; i < $length; ++i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+    },
+    get$reversed: function(receiver) {
+      return new H.ReversedListIterable(receiver, H.instanceType(receiver)._eval$1("ReversedListIterable<ListMixin.E>"));
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    }
+  };
+  P.MapBase.prototype = {};
+  P.MapBase_mapToString_closure.prototype = {
+    call$2: function(k, v) {
+      var t2,
+        t1 = this._box_0;
+      if (!t1.first)
+        this.result._contents += ", ";
+      t1.first = false;
+      t1 = this.result;
+      t2 = t1._contents += H.S(k);
+      t1._contents = t2 + ": ";
+      t1._contents += H.S(v);
+    },
+    $signature: 178
+  };
+  P.MapMixin.prototype = {
+    forEach$1: function(_, action) {
+      var t1, key;
+      for (t1 = J.get$iterator$ax(this.get$keys(this)); t1.moveNext$0();) {
+        key = t1.get$current(t1);
+        action.call$2(key, this.$index(0, key));
+      }
+    },
+    addAll$1: function(_, other) {
+      var t1, key;
+      for (t1 = J.get$iterator$ax(other.get$keys(other)); t1.moveNext$0();) {
+        key = t1.get$current(t1);
+        this.$indexSet(0, key, other.$index(0, key));
+      }
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      var t1;
+      if (this.containsKey$1(key))
+        return this.$index(0, key);
+      t1 = ifAbsent.call$0();
+      this.$indexSet(0, key, t1);
+      return t1;
+    },
+    get$entries: function(_) {
+      var _this = this;
+      return J.map$1$1$ax(_this.get$keys(_this), new P.MapMixin_entries_closure(_this), H._instanceType(_this)._eval$1("MapEntry<MapMixin.K,MapMixin.V>"));
+    },
+    containsKey$1: function(key) {
+      return J.contains$1$asx(this.get$keys(this), key);
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this.get$keys(this));
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this.get$keys(this));
+    },
+    get$isNotEmpty: function(_) {
+      return J.get$isNotEmpty$asx(this.get$keys(this));
+    },
+    get$values: function(_) {
+      var t1 = H._instanceType(this);
+      return new P._MapBaseValueIterable(this, t1._eval$1("@<MapMixin.K>")._bind$1(t1._eval$1("MapMixin.V"))._eval$1("_MapBaseValueIterable<1,2>"));
+    },
+    toString$0: function(_) {
+      return P.MapBase_mapToString(this);
+    },
+    $isMap: 1
+  };
+  P.MapMixin_entries_closure.prototype = {
+    call$1: function(key) {
+      var t1 = this.$this,
+        t2 = H._instanceType(t1);
+      return new P.MapEntry(key, t1.$index(0, key), t2._eval$1("@<MapMixin.K>")._bind$1(t2._eval$1("MapMixin.V"))._eval$1("MapEntry<1,2>"));
+    },
+    $signature: function() {
+      return H._instanceType(this.$this)._eval$1("MapEntry<MapMixin.K,MapMixin.V>(MapMixin.K)");
+    }
+  };
+  P.UnmodifiableMapBase.prototype = {};
+  P._MapBaseValueIterable.prototype = {
+    get$length: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$isEmpty(t1);
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$isNotEmpty(t1);
+    },
+    get$first: function(_) {
+      var t1 = this._collection$_map;
+      return t1.$index(0, J.get$first$ax(t1.get$keys(t1)));
+    },
+    get$single: function(_) {
+      var t1 = this._collection$_map;
+      return t1.$index(0, J.get$single$ax(t1.get$keys(t1)));
+    },
+    get$last: function(_) {
+      var t1 = this._collection$_map;
+      return t1.$index(0, J.get$last$ax(t1.get$keys(t1)));
+    },
+    get$iterator: function(_) {
+      var t1 = this._collection$_map;
+      return new P._MapBaseValueIterator(J.get$iterator$ax(t1.get$keys(t1)), t1);
+    }
+  };
+  P._MapBaseValueIterator.prototype = {
+    moveNext$0: function() {
+      var _this = this,
+        t1 = _this._keys;
+      if (t1.moveNext$0()) {
+        _this._collection$_current = _this._collection$_map.$index(0, t1.get$current(t1));
+        return true;
+      }
+      _this._collection$_current = null;
+      return false;
+    },
+    get$current: function(_) {
+      var cur = this._collection$_current;
+      return cur;
+    }
+  };
+  P._UnmodifiableMapMixin.prototype = {
+    $indexSet: function(_, key, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable map"));
+    },
+    addAll$1: function(_, other) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable map"));
+    },
+    remove$1: function(_, key) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable map"));
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable map"));
+    }
+  };
+  P.MapView.prototype = {
+    $index: function(_, key) {
+      return this._collection$_map.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      this._collection$_map.$indexSet(0, key, value);
+    },
+    addAll$1: function(_, other) {
+      this._collection$_map.addAll$1(0, other);
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      return this._collection$_map.putIfAbsent$2(key, ifAbsent);
+    },
+    containsKey$1: function(key) {
+      return this._collection$_map.containsKey$1(key);
+    },
+    forEach$1: function(_, action) {
+      this._collection$_map.forEach$1(0, action);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$isEmpty(t1);
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$isNotEmpty(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$length(t1);
+    },
+    get$keys: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$keys(t1);
+    },
+    remove$1: function(_, key) {
+      return this._collection$_map.remove$1(0, key);
+    },
+    toString$0: function(_) {
+      return J.toString$0$(this._collection$_map);
+    },
+    get$values: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$values(t1);
+    },
+    get$entries: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$entries(t1);
+    },
+    $isMap: 1
+  };
+  P.UnmodifiableMapView.prototype = {};
+  P.ListQueue.prototype = {
+    cast$1$0: function(_, $R) {
+      return new H.CastQueue(this, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastQueue<1,2>"));
+    },
+    get$iterator: function(_) {
+      var _this = this;
+      return new P._ListQueueIterator(_this, _this._collection$_tail, _this._modificationCount, _this._collection$_head);
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_head === this._collection$_tail;
+    },
+    get$length: function(_) {
+      return (this._collection$_tail - this._collection$_head & this._collection$_table.length - 1) >>> 0;
+    },
+    get$first: function(_) {
+      var t1 = this._collection$_head;
+      if (t1 === this._collection$_tail)
+        throw H.wrapException(H.IterableElementError_noElement());
+      return this._collection$_table[t1];
+    },
+    get$last: function(_) {
+      var t1 = this._collection$_head,
+        t2 = this._collection$_tail;
+      if (t1 === t2)
+        throw H.wrapException(H.IterableElementError_noElement());
+      t1 = this._collection$_table;
+      return t1[(t2 - 1 & t1.length - 1) >>> 0];
+    },
+    get$single: function(_) {
+      var _this = this;
+      if (_this._collection$_head === _this._collection$_tail)
+        throw H.wrapException(H.IterableElementError_noElement());
+      if (_this.get$length(_this) > 1)
+        throw H.wrapException(H.IterableElementError_tooMany());
+      return _this._collection$_table[_this._collection$_head];
+    },
+    elementAt$1: function(_, index) {
+      var t1;
+      P.RangeError_checkValidIndex(index, this, null);
+      t1 = this._collection$_table;
+      return t1[(this._collection$_head + index & t1.length - 1) >>> 0];
+    },
+    toList$1$growable: function(_, growable) {
+      var t1, list, t2, i, _this = this,
+        mask = _this._collection$_table.length - 1,
+        $length = (_this._collection$_tail - _this._collection$_head & mask) >>> 0;
+      if ($length === 0) {
+        t1 = _this.$ti._precomputed1;
+        return growable ? J.JSArray_JSArray$growable(0, t1) : J.JSArray_JSArray$fixed(0, t1);
+      }
+      list = P.List_List$filled($length, _this.get$first(_this), growable, _this.$ti._precomputed1);
+      for (t1 = _this._collection$_table, t2 = _this._collection$_head, i = 0; i < $length; ++i)
+        list[i] = t1[(t2 + i & mask) >>> 0];
+      return list;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(_, value) {
+      this._add$1(value);
+    },
+    addAll$1: function(_, elements) {
+      var addCount, $length, t2, t3, t4, newTable, endSpace, preSpace, _this = this,
+        t1 = _this.$ti;
+      if (t1._eval$1("List<1>")._is(elements)) {
+        addCount = J.get$length$asx(elements);
+        $length = _this.get$length(_this);
+        t2 = $length + addCount;
+        t3 = _this._collection$_table;
+        t4 = t3.length;
+        if (t2 >= t4) {
+          newTable = P.List_List$filled(P.ListQueue__nextPowerOf2(t2 + C.JSInt_methods._shrOtherPositive$1(t2, 1)), null, false, t1._eval$1("1?"));
+          _this._collection$_tail = _this._collection$_writeToList$1(newTable);
+          _this._collection$_table = newTable;
+          _this._collection$_head = 0;
+          C.JSArray_methods.setRange$4(newTable, $length, t2, elements, 0);
+          _this._collection$_tail += addCount;
+        } else {
+          t1 = _this._collection$_tail;
+          endSpace = t4 - t1;
+          if (addCount < endSpace) {
+            C.JSArray_methods.setRange$4(t3, t1, t1 + addCount, elements, 0);
+            _this._collection$_tail += addCount;
+          } else {
+            preSpace = addCount - endSpace;
+            C.JSArray_methods.setRange$4(t3, t1, t1 + endSpace, elements, 0);
+            C.JSArray_methods.setRange$4(_this._collection$_table, 0, preSpace, elements, endSpace);
+            _this._collection$_tail = preSpace;
+          }
+        }
+        ++_this._modificationCount;
+      } else
+        for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
+          _this._add$1(t1.get$current(t1));
+    },
+    clear$0: function(_) {
+      var t2, t3, _this = this,
+        i = _this._collection$_head,
+        t1 = _this._collection$_tail;
+      if (i !== t1) {
+        for (t2 = _this._collection$_table, t3 = t2.length - 1; i !== t1; i = (i + 1 & t3) >>> 0)
+          t2[i] = null;
+        _this._collection$_head = _this._collection$_tail = 0;
+        ++_this._modificationCount;
+      }
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    addFirst$1: function(value) {
+      var _this = this,
+        t1 = _this._collection$_head,
+        t2 = _this._collection$_table;
+      t1 = _this._collection$_head = (t1 - 1 & t2.length - 1) >>> 0;
+      t2[t1] = value;
+      if (t1 === _this._collection$_tail)
+        _this._collection$_grow$0();
+      ++_this._modificationCount;
+    },
+    removeFirst$0: function() {
+      var t2, result, _this = this,
+        t1 = _this._collection$_head;
+      if (t1 === _this._collection$_tail)
+        throw H.wrapException(H.IterableElementError_noElement());
+      ++_this._modificationCount;
+      t2 = _this._collection$_table;
+      result = t2[t1];
+      t2[t1] = null;
+      _this._collection$_head = (t1 + 1 & t2.length - 1) >>> 0;
+      return result;
+    },
+    removeLast$0: function(_) {
+      var result, _this = this,
+        t1 = _this._collection$_head,
+        t2 = _this._collection$_tail;
+      if (t1 === t2)
+        throw H.wrapException(H.IterableElementError_noElement());
+      ++_this._modificationCount;
+      t1 = _this._collection$_table;
+      t2 = _this._collection$_tail = (t2 - 1 & t1.length - 1) >>> 0;
+      result = t1[t2];
+      t1[t2] = null;
+      return result;
+    },
+    _add$1: function(element) {
+      var _this = this,
+        t1 = _this._collection$_table,
+        t2 = _this._collection$_tail;
+      t1[t2] = element;
+      t1 = (t2 + 1 & t1.length - 1) >>> 0;
+      _this._collection$_tail = t1;
+      if (_this._collection$_head === t1)
+        _this._collection$_grow$0();
+      ++_this._modificationCount;
+    },
+    _collection$_grow$0: function() {
+      var _this = this,
+        newTable = P.List_List$filled(_this._collection$_table.length * 2, null, false, _this.$ti._eval$1("1?")),
+        t1 = _this._collection$_table,
+        t2 = _this._collection$_head,
+        split = t1.length - t2;
+      C.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
+      C.JSArray_methods.setRange$4(newTable, split, split + _this._collection$_head, _this._collection$_table, 0);
+      _this._collection$_head = 0;
+      _this._collection$_tail = _this._collection$_table.length;
+      _this._collection$_table = newTable;
+    },
+    _collection$_writeToList$1: function(target) {
+      var $length, firstPartSize, _this = this,
+        t1 = _this._collection$_head,
+        t2 = _this._collection$_tail,
+        t3 = _this._collection$_table;
+      if (t1 <= t2) {
+        $length = t2 - t1;
+        C.JSArray_methods.setRange$4(target, 0, $length, t3, t1);
+        return $length;
+      } else {
+        firstPartSize = t3.length - t1;
+        C.JSArray_methods.setRange$4(target, 0, firstPartSize, t3, t1);
+        C.JSArray_methods.setRange$4(target, firstPartSize, firstPartSize + _this._collection$_tail, _this._collection$_table, 0);
+        return _this._collection$_tail + firstPartSize;
+      }
+    },
+    $isQueue: 1
+  };
+  P._ListQueueIterator.prototype = {
+    get$current: function(_) {
+      var cur = this._collection$_current;
+      return cur;
+    },
+    moveNext$0: function() {
+      var t2, _this = this,
+        t1 = _this._queue;
+      if (_this._modificationCount !== t1._modificationCount)
+        H.throwExpression(P.ConcurrentModificationError$(t1));
+      t2 = _this._collection$_position;
+      if (t2 === _this._collection$_end) {
+        _this._collection$_current = null;
+        return false;
+      }
+      t1 = t1._collection$_table;
+      _this._collection$_current = t1[t2];
+      _this._collection$_position = (t2 + 1 & t1.length - 1) >>> 0;
+      return true;
+    }
+  };
+  P._SetBase.prototype = {
+    cast$1$0: function(_, $R) {
+      return P.Set_castFrom(this, this.get$_newSimilarSet(), H._instanceType(this)._precomputed1, $R);
+    },
+    difference$1: function(other) {
+      var t1, element,
+        result = this._newSet$0();
+      for (t1 = this.get$iterator(this); t1.moveNext$0();) {
+        element = t1.get$current(t1);
+        if (!other.contains$1(0, element))
+          result.add$1(0, element);
+      }
+      return result;
+    },
+    intersection$1: function(other) {
+      var t1, t2, element,
+        result = this._newSet$0();
+      for (t1 = this.get$iterator(this), t2 = other._baseMap; t1.moveNext$0();) {
+        element = t1.get$current(t1);
+        if (t2.containsKey$1(element))
+          result.add$1(0, element);
+      }
+      return result;
+    },
+    toSet$0: function(_) {
+      var t1 = this._newSet$0();
+      t1.addAll$1(0, this);
+      return t1;
+    },
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    addAll$1: function(_, elements) {
+      var t1;
+      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
+        this.add$1(0, t1.get$current(t1));
+    },
+    removeAll$1: function(elements) {
+      var t1;
+      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
+        this.remove$1(0, t1.get$current(t1));
+    },
+    toList$1$growable: function(_, growable) {
+      return P.List_List$from(this, growable, H._instanceType(this)._precomputed1);
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    map$1$1: function(_, f, $T) {
+      return new H.EfficientLengthMappedIterable(this, f, H._instanceType(this)._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
+    },
+    get$single: function(_) {
+      var it, _this = this;
+      if (_this.get$length(_this) > 1)
+        throw H.wrapException(H.IterableElementError_tooMany());
+      it = _this.get$iterator(_this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      return it.get$current(it);
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    where$1: function(_, f) {
+      return new H.WhereIterable(this, f, H._instanceType(this)._eval$1("WhereIterable<1>"));
+    },
+    join$1: function(_, separator) {
+      var t1,
+        iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      if (separator === "") {
+        t1 = "";
+        do
+          t1 += H.S(iterator.get$current(iterator));
+        while (iterator.moveNext$0());
+      } else {
+        t1 = H.S(iterator.get$current(iterator));
+        for (; iterator.moveNext$0();)
+          t1 = t1 + separator + H.S(iterator.get$current(iterator));
+      }
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    join$0: function($receiver) {
+      return this.join$1($receiver, "");
+    },
+    any$1: function(_, test) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (test.call$1(t1.get$current(t1)))
+          return true;
+      return false;
+    },
+    take$1: function(_, n) {
+      return H.TakeIterable_TakeIterable(this, n, H._instanceType(this)._precomputed1);
+    },
+    skip$1: function(_, n) {
+      return H.SkipIterable_SkipIterable(this, n, H._instanceType(this)._precomputed1);
+    },
+    get$first: function(_) {
+      var it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      return it.get$current(it);
+    },
+    get$last: function(_) {
+      var result,
+        it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current(it);
+      while (it.moveNext$0());
+      return result;
+    },
+    elementAt$1: function(_, index) {
+      var t1, elementIndex, element, _s5_ = "index";
+      P.ArgumentError_checkNotNull(index, _s5_);
+      P.RangeError_checkNotNegative(index, _s5_);
+      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
+        element = t1.get$current(t1);
+        if (index === elementIndex)
+          return element;
+        ++elementIndex;
+      }
+      throw H.wrapException(P.IndexError$(index, this, _s5_, null, elementIndex));
+    },
+    $isEfficientLengthIterable: 1,
+    $isIterable: 1,
+    $isSet: 1
+  };
+  P._UnmodifiableSet.prototype = {
+    _newSet$0: function() {
+      return P.LinkedHashSet_LinkedHashSet(this.$ti._precomputed1);
+    },
+    _newSimilarSet$1$0: function($R) {
+      return P.LinkedHashSet_LinkedHashSet($R);
+    },
+    _newSimilarSet$0: function() {
+      return this._newSimilarSet$1$0(type$.dynamic);
+    },
+    contains$1: function(_, element) {
+      return this._collection$_map.containsKey$1(element);
+    },
+    get$iterator: function(_) {
+      var t1 = this._collection$_map;
+      return J.get$iterator$ax(t1.get$keys(t1));
+    },
+    get$length: function(_) {
+      var t1 = this._collection$_map;
+      return t1.get$length(t1);
+    },
+    add$1: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change unmodifiable set"));
+    },
+    addAll$1: function(_, elements) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change unmodifiable set"));
+    },
+    remove$1: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change unmodifiable set"));
+    }
+  };
+  P._ListBase_Object_ListMixin.prototype = {};
+  P._UnmodifiableMapView_MapView__UnmodifiableMapMixin.prototype = {};
+  P.Utf8Decoder_closure.prototype = {
+    call$0: function() {
+      var t1, exception;
+      try {
+        t1 = new TextDecoder("utf-8", {fatal: true});
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+      return null;
+    },
+    $signature: 66
+  };
+  P.Utf8Decoder_closure0.prototype = {
+    call$0: function() {
+      var t1, exception;
+      try {
+        t1 = new TextDecoder("utf-8", {fatal: false});
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+      return null;
+    },
+    $signature: 66
+  };
+  P.AsciiCodec.prototype = {
+    encode$1: function(source) {
+      return C.AsciiEncoder_127.convert$1(source);
+    },
+    get$encoder: function() {
+      return C.AsciiEncoder_127;
+    }
+  };
+  P._UnicodeSubsetEncoder.prototype = {
+    convert$1: function(string) {
+      var t1, t2, i, codeUnit,
+        end = P.RangeError_checkValidRange(0, null, string.length),
+        $length = end - 0,
+        result = new Uint8Array($length);
+      for (t1 = ~this._subsetMask, t2 = J.getInterceptor$s(string), i = 0; i < $length; ++i) {
+        codeUnit = t2._codeUnitAt$1(string, i);
+        if ((codeUnit & t1) !== 0)
+          throw H.wrapException(P.ArgumentError$value(string, "string", "Contains invalid characters."));
+        result[i] = codeUnit;
+      }
+      return result;
+    }
+  };
+  P.AsciiEncoder.prototype = {};
+  P.Base64Codec.prototype = {
+    get$encoder: function() {
+      return C.C_Base64Encoder;
+    },
+    normalize$3: function(source, start, end) {
+      var inverseAlphabet, i, sliceStart, buffer, firstPadding, firstPaddingSourceIndex, paddingCount, i0, char, i1, digit1, digit2, char0, value, t1, t2, endLength, $length,
+        _s31_ = "Invalid base64 encoding length ";
+      end = P.RangeError_checkValidRange(start, end, source.length);
+      inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
+      for (i = start, sliceStart = i, buffer = null, firstPadding = -1, firstPaddingSourceIndex = -1, paddingCount = 0; i < end; i = i0) {
+        i0 = i + 1;
+        char = C.JSString_methods._codeUnitAt$1(source, i);
+        if (char === 37) {
+          i1 = i0 + 2;
+          if (i1 <= end) {
+            digit1 = H.hexDigitValue(C.JSString_methods._codeUnitAt$1(source, i0));
+            digit2 = H.hexDigitValue(C.JSString_methods._codeUnitAt$1(source, i0 + 1));
+            char0 = digit1 * 16 + digit2 - (digit2 & 256);
+            if (char0 === 37)
+              char0 = -1;
+            i0 = i1;
+          } else
+            char0 = -1;
+        } else
+          char0 = char;
+        if (0 <= char0 && char0 <= 127) {
+          value = inverseAlphabet[char0];
+          if (value >= 0) {
+            char0 = C.JSString_methods.codeUnitAt$1(string$.ABCDEF, value);
+            if (char0 === char)
+              continue;
+            char = char0;
+          } else {
+            if (value === -1) {
+              if (firstPadding < 0) {
+                t1 = buffer == null ? null : buffer._contents.length;
+                if (t1 == null)
+                  t1 = 0;
+                firstPadding = t1 + (i - sliceStart);
+                firstPaddingSourceIndex = i;
+              }
+              ++paddingCount;
+              if (char === 61)
+                continue;
+            }
+            char = char0;
+          }
+          if (value !== -2) {
+            if (buffer == null) {
+              buffer = new P.StringBuffer("");
+              t1 = buffer;
+            } else
+              t1 = buffer;
+            t1._contents += C.JSString_methods.substring$2(source, sliceStart, i);
+            t1._contents += H.Primitives_stringFromCharCode(char);
+            sliceStart = i0;
+            continue;
+          }
+        }
+        throw H.wrapException(P.FormatException$("Invalid base64 data", source, i));
+      }
+      if (buffer != null) {
+        t1 = buffer._contents += C.JSString_methods.substring$2(source, sliceStart, end);
+        t2 = t1.length;
+        if (firstPadding >= 0)
+          P.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, t2);
+        else {
+          endLength = C.JSInt_methods.$mod(t2 - 1, 4) + 1;
+          if (endLength === 1)
+            throw H.wrapException(P.FormatException$(_s31_, source, end));
+          for (; endLength < 4;) {
+            t1 += "=";
+            buffer._contents = t1;
+            ++endLength;
+          }
+        }
+        t1 = buffer._contents;
+        return C.JSString_methods.replaceRange$3(source, start, end, t1.charCodeAt(0) == 0 ? t1 : t1);
+      }
+      $length = end - start;
+      if (firstPadding >= 0)
+        P.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, $length);
+      else {
+        endLength = C.JSInt_methods.$mod($length, 4);
+        if (endLength === 1)
+          throw H.wrapException(P.FormatException$(_s31_, source, end));
+        if (endLength > 1)
+          source = C.JSString_methods.replaceRange$3(source, end, end, endLength === 2 ? "==" : "=");
+      }
+      return source;
+    }
+  };
+  P.Base64Encoder.prototype = {
+    convert$1: function(input) {
+      var t1 = J.getInterceptor$asx(input);
+      if (t1.get$isEmpty(input))
+        return "";
+      t1 = new P._Base64Encoder(string$.ABCDEF).encode$4(input, 0, t1.get$length(input), true);
+      t1.toString;
+      return P.String_String$fromCharCodes(t1, 0, null);
+    },
+    startChunkedConversion$1: function(sink) {
+      var t1,
+        _s64_ = string$.ABCDEF;
+      if (type$.StringConversionSink._is(sink)) {
+        t1 = sink.asUtf8Sink$1(false);
+        return new P._Utf8Base64EncoderSink(t1, new P._Base64Encoder(_s64_));
+      }
+      return new P._AsciiBase64EncoderSink(sink, new P._BufferCachingBase64Encoder(_s64_));
+    }
+  };
+  P._Base64Encoder.prototype = {
+    createBuffer$1: function(bufferLength) {
+      return new Uint8Array(bufferLength);
+    },
+    encode$4: function(bytes, start, end, isLast) {
+      var output, _this = this,
+        byteCount = (_this._convert$_state & 3) + (end - start),
+        fullChunks = C.JSInt_methods._tdivFast$1(byteCount, 3),
+        bufferLength = fullChunks * 4;
+      if (isLast && byteCount - fullChunks * 3 > 0)
+        bufferLength += 4;
+      output = _this.createBuffer$1(bufferLength);
+      _this._convert$_state = P._Base64Encoder_encodeChunk(_this._alphabet, bytes, start, end, isLast, output, 0, _this._convert$_state);
+      if (bufferLength > 0)
+        return output;
+      return null;
+    }
+  };
+  P._BufferCachingBase64Encoder.prototype = {
+    createBuffer$1: function(bufferLength) {
+      var buffer = this.bufferCache;
+      if (buffer == null || buffer.length < bufferLength)
+        buffer = this.bufferCache = new Uint8Array(bufferLength);
+      if (buffer == null)
+        throw H.wrapException("unreachable");
+      return H.NativeUint8List_NativeUint8List$view(buffer.buffer, buffer.byteOffset, bufferLength);
+    }
+  };
+  P._Base64EncoderSink.prototype = {
+    add$1: function(_, source) {
+      this._convert$_add$4(source, 0, J.get$length$asx(source), false);
+    },
+    close$0: function(_) {
+      this._convert$_add$4(C.List_empty1, 0, 0, true);
+    },
+    addSlice$4: function(source, start, end, isLast) {
+      P.RangeError_checkValidRange(start, end, source.length);
+      this._convert$_add$4(source, start, end, isLast);
+    }
+  };
+  P._AsciiBase64EncoderSink.prototype = {
+    _convert$_add$4: function(source, start, end, isLast) {
+      var buffer = this._encoder.encode$4(source, start, end, isLast);
+      if (buffer != null)
+        this._sink.add$1(0, P.String_String$fromCharCodes(buffer, 0, null));
+      if (isLast)
+        this._sink.close$0(0);
+    }
+  };
+  P._Utf8Base64EncoderSink.prototype = {
+    _convert$_add$4: function(source, start, end, isLast) {
+      var buffer = this._encoder.encode$4(source, start, end, isLast);
+      if (buffer != null)
+        this._sink.addSlice$4(buffer, 0, buffer.length, isLast);
+    }
+  };
+  P.ByteConversionSink.prototype = {};
+  P.ByteConversionSinkBase.prototype = {};
+  P.ChunkedConversionSink.prototype = {};
+  P.Codec.prototype = {
+    encode$1: function(input) {
+      return this.get$encoder().convert$1(input);
+    }
+  };
+  P.Converter.prototype = {};
+  P.Encoding.prototype = {};
+  P.JsonUnsupportedObjectError.prototype = {
+    toString$0: function(_) {
+      var safeString = P.Error_safeToString(this.unsupportedObject);
+      return (this.cause != null ? "Converting object to an encodable object failed:" : "Converting object did not return an encodable object:") + " " + safeString;
+    }
+  };
+  P.JsonCyclicError.prototype = {
+    toString$0: function(_) {
+      return "Cyclic error in JSON stringify";
+    }
+  };
+  P.JsonCodec.prototype = {
+    encode$2$toEncodable: function(value, toEncodable) {
+      var t1 = P._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
+      return t1;
+    },
+    get$encoder: function() {
+      return C.JsonEncoder_null;
+    }
+  };
+  P.JsonEncoder.prototype = {
+    convert$1: function(object) {
+      var t1,
+        output = new P.StringBuffer("");
+      P._JsonStringStringifier_printOn(object, output, this._toEncodable, null);
+      t1 = output._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  P._JsonStringifier.prototype = {
+    writeStringContent$1: function(s) {
+      var t1, offset, i, charCode, t2, t3, _this = this,
+        $length = s.length;
+      for (t1 = J.getInterceptor$s(s), offset = 0, i = 0; i < $length; ++i) {
+        charCode = t1._codeUnitAt$1(s, i);
+        if (charCode > 92) {
+          if (charCode >= 55296) {
+            t2 = charCode & 64512;
+            if (t2 === 55296) {
+              t3 = i + 1;
+              t3 = !(t3 < $length && (C.JSString_methods._codeUnitAt$1(s, t3) & 64512) === 56320);
+            } else
+              t3 = false;
+            if (!t3)
+              if (t2 === 56320) {
+                t2 = i - 1;
+                t2 = !(t2 >= 0 && (C.JSString_methods.codeUnitAt$1(s, t2) & 64512) === 55296);
+              } else
+                t2 = false;
+            else
+              t2 = true;
+            if (t2) {
+              if (i > offset)
+                _this.writeStringSlice$3(s, offset, i);
+              offset = i + 1;
+              _this.writeCharCode$1(92);
+              _this.writeCharCode$1(117);
+              _this.writeCharCode$1(100);
+              t2 = charCode >>> 8 & 15;
+              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+              t2 = charCode >>> 4 & 15;
+              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+              t2 = charCode & 15;
+              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+            }
+          }
+          continue;
+        }
+        if (charCode < 32) {
+          if (i > offset)
+            _this.writeStringSlice$3(s, offset, i);
+          offset = i + 1;
+          _this.writeCharCode$1(92);
+          switch (charCode) {
+            case 8:
+              _this.writeCharCode$1(98);
+              break;
+            case 9:
+              _this.writeCharCode$1(116);
+              break;
+            case 10:
+              _this.writeCharCode$1(110);
+              break;
+            case 12:
+              _this.writeCharCode$1(102);
+              break;
+            case 13:
+              _this.writeCharCode$1(114);
+              break;
+            default:
+              _this.writeCharCode$1(117);
+              _this.writeCharCode$1(48);
+              _this.writeCharCode$1(48);
+              t2 = charCode >>> 4 & 15;
+              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+              t2 = charCode & 15;
+              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+              break;
+          }
+        } else if (charCode === 34 || charCode === 92) {
+          if (i > offset)
+            _this.writeStringSlice$3(s, offset, i);
+          offset = i + 1;
+          _this.writeCharCode$1(92);
+          _this.writeCharCode$1(charCode);
+        }
+      }
+      if (offset === 0)
+        _this.writeString$1(s);
+      else if (offset < $length)
+        _this.writeStringSlice$3(s, offset, $length);
+    },
+    _checkCycle$1: function(object) {
+      var t1, t2, i, t3;
+      for (t1 = this._seen, t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = t1[i];
+        if (object == null ? t3 == null : object === t3)
+          throw H.wrapException(new P.JsonCyclicError(object, null));
+      }
+      t1.push(object);
+    },
+    writeObject$1: function(object) {
+      var customJson, e, t1, exception, _this = this;
+      if (_this.writeJsonValue$1(object))
+        return;
+      _this._checkCycle$1(object);
+      try {
+        customJson = _this._toEncodable.call$1(object);
+        if (!_this.writeJsonValue$1(customJson)) {
+          t1 = P.JsonUnsupportedObjectError$(object, null, _this.get$_partialResult());
+          throw H.wrapException(t1);
+        }
+        _this._seen.pop();
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        t1 = P.JsonUnsupportedObjectError$(object, e, _this.get$_partialResult());
+        throw H.wrapException(t1);
+      }
+    },
+    writeJsonValue$1: function(object) {
+      var success, _this = this;
+      if (typeof object == "number") {
+        if (!isFinite(object))
+          return false;
+        _this.writeNumber$1(object);
+        return true;
+      } else if (object === true) {
+        _this.writeString$1("true");
+        return true;
+      } else if (object === false) {
+        _this.writeString$1("false");
+        return true;
+      } else if (object == null) {
+        _this.writeString$1("null");
+        return true;
+      } else if (typeof object == "string") {
+        _this.writeString$1('"');
+        _this.writeStringContent$1(object);
+        _this.writeString$1('"');
+        return true;
+      } else if (type$.List_dynamic._is(object)) {
+        _this._checkCycle$1(object);
+        _this.writeList$1(object);
+        _this._seen.pop();
+        return true;
+      } else if (type$.Map_dynamic_dynamic._is(object)) {
+        _this._checkCycle$1(object);
+        success = _this.writeMap$1(object);
+        _this._seen.pop();
+        return success;
+      } else
+        return false;
+    },
+    writeList$1: function(list) {
+      var t1, i, _this = this;
+      _this.writeString$1("[");
+      t1 = J.getInterceptor$asx(list);
+      if (t1.get$isNotEmpty(list)) {
+        _this.writeObject$1(t1.$index(list, 0));
+        for (i = 1; i < t1.get$length(list); ++i) {
+          _this.writeString$1(",");
+          _this.writeObject$1(t1.$index(list, i));
+        }
+      }
+      _this.writeString$1("]");
+    },
+    writeMap$1: function(map) {
+      var keyValueList, i, separator, _this = this, _box_0 = {};
+      if (map.get$isEmpty(map)) {
+        _this.writeString$1("{}");
+        return true;
+      }
+      keyValueList = P.List_List$filled(map.get$length(map) * 2, null, false, type$.nullable_Object);
+      i = _box_0.i = 0;
+      _box_0.allStringKeys = true;
+      map.forEach$1(0, new P._JsonStringifier_writeMap_closure(_box_0, keyValueList));
+      if (!_box_0.allStringKeys)
+        return false;
+      _this.writeString$1("{");
+      for (separator = '"'; i < keyValueList.length; i += 2, separator = ',"') {
+        _this.writeString$1(separator);
+        _this.writeStringContent$1(H._asStringS(keyValueList[i]));
+        _this.writeString$1('":');
+        _this.writeObject$1(keyValueList[i + 1]);
+      }
+      _this.writeString$1("}");
+      return true;
+    }
+  };
+  P._JsonStringifier_writeMap_closure.prototype = {
+    call$2: function(key, value) {
+      var t1, t2, t3, i;
+      if (typeof key != "string")
+        this._box_0.allStringKeys = false;
+      t1 = this.keyValueList;
+      t2 = this._box_0;
+      t3 = t2.i;
+      i = t2.i = t3 + 1;
+      t1[t3] = key;
+      t2.i = i + 1;
+      t1[i] = value;
+    },
+    $signature: 178
+  };
+  P._JsonStringStringifier.prototype = {
+    get$_partialResult: function() {
+      var t1 = this._sink;
+      return type$.StringBuffer._is(t1) ? t1.toString$0(0) : null;
+    },
+    writeNumber$1: function(number) {
+      this._sink.write$1(0, C.JSNumber_methods.toString$0(number));
+    },
+    writeString$1: function(string) {
+      this._sink.write$1(0, string);
+    },
+    writeStringSlice$3: function(string, start, end) {
+      this._sink.write$1(0, C.JSString_methods.substring$2(string, start, end));
+    },
+    writeCharCode$1: function(charCode) {
+      this._sink.writeCharCode$1(charCode);
+    }
+  };
+  P.StringConversionSinkBase.prototype = {};
+  P.StringConversionSinkMixin.prototype = {
+    add$1: function(_, str) {
+      this.addSlice$4(str, 0, str.length, false);
+    },
+    asUtf8Sink$1: function(allowMalformed) {
+      return new P._Utf8ConversionSink(new P._Utf8Decoder(allowMalformed), this, new P.StringBuffer(""));
+    },
+    $isStringConversionSink: 1
+  };
+  P._StringSinkConversionSink.prototype = {
+    close$0: function(_) {
+    },
+    addSlice$4: function(str, start, end, isLast) {
+      var t1, t2, i;
+      if (start !== 0 || end !== str.length)
+        for (t1 = this._stringSink, t2 = J.getInterceptor$s(str), i = start; i < end; ++i)
+          t1._contents += H.Primitives_stringFromCharCode(t2._codeUnitAt$1(str, i));
+      else
+        this._stringSink._contents += H.S(str);
+      if (isLast)
+        this.close$0(0);
+    },
+    add$1: function(_, str) {
+      this._stringSink._contents += H.S(str);
+    },
+    asUtf8Sink$1: function(allowMalformed) {
+      return new P._Utf8StringSinkAdapter(new P._Utf8Decoder(allowMalformed), this, this._stringSink);
+    }
+  };
+  P._StringCallbackSink.prototype = {
+    close$0: function(_) {
+      var t1 = this._stringSink,
+        t2 = t1._contents;
+      t1._contents = "";
+      this._convert$_callback.call$1(t2.charCodeAt(0) == 0 ? t2 : t2);
+    },
+    asUtf8Sink$1: function(allowMalformed) {
+      return new P._Utf8StringSinkAdapter(new P._Utf8Decoder(allowMalformed), this, this._stringSink);
+    }
+  };
+  P._StringAdapterSink.prototype = {
+    add$1: function(_, str) {
+      this._sink.add$1(0, str);
+    },
+    addSlice$4: function(str, start, end, isLast) {
+      var t1 = start === 0 && end === str.length,
+        t2 = this._sink;
+      if (t1)
+        t2.add$1(0, str);
+      else
+        t2.add$1(0, J.substring$2$s(str, start, end));
+      if (isLast)
+        t2.close$0(0);
+    },
+    close$0: function(_) {
+      this._sink.close$0(0);
+    }
+  };
+  P._Utf8StringSinkAdapter.prototype = {
+    close$0: function(_) {
+      this._decoder.flush$1(this._stringSink);
+      this._sink.close$0(0);
+    },
+    add$1: function(_, chunk) {
+      this.addSlice$4(chunk, 0, J.get$length$asx(chunk), false);
+    },
+    addSlice$4: function(codeUnits, startIndex, endIndex, isLast) {
+      this._stringSink._contents += this._decoder.convertGeneral$4(codeUnits, startIndex, endIndex, false);
+      if (isLast)
+        this.close$0(0);
+    }
+  };
+  P._Utf8ConversionSink.prototype = {
+    close$0: function(_) {
+      var t2, t3, accumulated,
+        t1 = this._convert$_buffer;
+      this._decoder.flush$1(t1);
+      t2 = t1._contents;
+      t3 = this._chunkedSink;
+      if (t2.length !== 0) {
+        accumulated = t2.charCodeAt(0) == 0 ? t2 : t2;
+        t1._contents = "";
+        t3.addSlice$4(accumulated, 0, accumulated.length, true);
+      } else
+        t3.close$0(0);
+    },
+    add$1: function(_, chunk) {
+      this.addSlice$4(chunk, 0, J.get$length$asx(chunk), false);
+    },
+    addSlice$4: function(chunk, startIndex, endIndex, isLast) {
+      var accumulated, _this = this,
+        t1 = _this._convert$_buffer,
+        t2 = t1._contents += _this._decoder.convertGeneral$4(chunk, startIndex, endIndex, false);
+      if (t2.length !== 0) {
+        accumulated = t2.charCodeAt(0) == 0 ? t2 : t2;
+        _this._chunkedSink.addSlice$4(accumulated, 0, accumulated.length, isLast);
+        t1._contents = "";
+        return;
+      }
+      if (isLast)
+        _this.close$0(0);
+    }
+  };
+  P.Utf8Codec.prototype = {
+    get$encoder: function() {
+      return C.C_Utf8Encoder;
+    }
+  };
+  P.Utf8Encoder.prototype = {
+    convert$1: function(string) {
+      var t1, encoder,
+        end = P.RangeError_checkValidRange(0, null, string.length),
+        $length = end - 0;
+      if ($length === 0)
+        return new Uint8Array(0);
+      t1 = new Uint8Array($length * 3);
+      encoder = new P._Utf8Encoder(t1);
+      if (encoder._fillBuffer$3(string, 0, end) !== end) {
+        J.codeUnitAt$1$s(string, end - 1);
+        encoder._writeReplacementCharacter$0();
+      }
+      return C.NativeUint8List_methods.sublist$2(t1, 0, encoder._bufferIndex);
+    }
+  };
+  P._Utf8Encoder.prototype = {
+    _writeReplacementCharacter$0: function() {
+      var _this = this,
+        t1 = _this._convert$_buffer,
+        t2 = _this._bufferIndex,
+        t3 = _this._bufferIndex = t2 + 1;
+      t1[t2] = 239;
+      t2 = _this._bufferIndex = t3 + 1;
+      t1[t3] = 191;
+      _this._bufferIndex = t2 + 1;
+      t1[t2] = 189;
+    },
+    _writeSurrogate$2: function(leadingSurrogate, nextCodeUnit) {
+      var rune, t1, t2, t3, _this = this;
+      if ((nextCodeUnit & 64512) === 56320) {
+        rune = 65536 + ((leadingSurrogate & 1023) << 10) | nextCodeUnit & 1023;
+        t1 = _this._convert$_buffer;
+        t2 = _this._bufferIndex;
+        t3 = _this._bufferIndex = t2 + 1;
+        t1[t2] = 240 | rune >>> 18;
+        t2 = _this._bufferIndex = t3 + 1;
+        t1[t3] = 128 | rune >>> 12 & 63;
+        t3 = _this._bufferIndex = t2 + 1;
+        t1[t2] = 128 | rune >>> 6 & 63;
+        _this._bufferIndex = t3 + 1;
+        t1[t3] = 128 | rune & 63;
+        return true;
+      } else {
+        _this._writeReplacementCharacter$0();
+        return false;
+      }
+    },
+    _fillBuffer$3: function(str, start, end) {
+      var t1, t2, t3, stringIndex, codeUnit, t4, stringIndex0, t5, _this = this;
+      if (start !== end && (J.codeUnitAt$1$s(str, end - 1) & 64512) === 55296)
+        --end;
+      for (t1 = _this._convert$_buffer, t2 = t1.length, t3 = J.getInterceptor$s(str), stringIndex = start; stringIndex < end; ++stringIndex) {
+        codeUnit = t3._codeUnitAt$1(str, stringIndex);
+        if (codeUnit <= 127) {
+          t4 = _this._bufferIndex;
+          if (t4 >= t2)
+            break;
+          _this._bufferIndex = t4 + 1;
+          t1[t4] = codeUnit;
+        } else {
+          t4 = codeUnit & 64512;
+          if (t4 === 55296) {
+            if (_this._bufferIndex + 4 > t2)
+              break;
+            stringIndex0 = stringIndex + 1;
+            if (_this._writeSurrogate$2(codeUnit, C.JSString_methods._codeUnitAt$1(str, stringIndex0)))
+              stringIndex = stringIndex0;
+          } else if (t4 === 56320) {
+            if (_this._bufferIndex + 3 > t2)
+              break;
+            _this._writeReplacementCharacter$0();
+          } else if (codeUnit <= 2047) {
+            t4 = _this._bufferIndex;
+            t5 = t4 + 1;
+            if (t5 >= t2)
+              break;
+            _this._bufferIndex = t5;
+            t1[t4] = 192 | codeUnit >>> 6;
+            _this._bufferIndex = t5 + 1;
+            t1[t5] = 128 | codeUnit & 63;
+          } else {
+            t4 = _this._bufferIndex;
+            if (t4 + 2 >= t2)
+              break;
+            t5 = _this._bufferIndex = t4 + 1;
+            t1[t4] = 224 | codeUnit >>> 12;
+            t4 = _this._bufferIndex = t5 + 1;
+            t1[t5] = 128 | codeUnit >>> 6 & 63;
+            _this._bufferIndex = t4 + 1;
+            t1[t4] = 128 | codeUnit & 63;
+          }
+        }
+      }
+      return stringIndex;
+    }
+  };
+  P.Utf8Decoder.prototype = {
+    convert$1: function(codeUnits) {
+      var t1 = this._allowMalformed,
+        result = P.Utf8Decoder__convertIntercepted(t1, codeUnits, 0, null);
+      if (result != null)
+        return result;
+      return new P._Utf8Decoder(t1).convertGeneral$4(codeUnits, 0, null, true);
+    },
+    startChunkedConversion$1: function(sink) {
+      var stringSink = type$.StringConversionSink._is(sink) ? sink : new P._StringAdapterSink(sink);
+      return stringSink.asUtf8Sink$1(this._allowMalformed);
+    }
+  };
+  P._Utf8Decoder.prototype = {
+    convertGeneral$4: function(codeUnits, start, maybeEnd, single) {
+      var bytes, errorOffset, result, t1, message, _this = this,
+        end = P.RangeError_checkValidRange(start, maybeEnd, J.get$length$asx(codeUnits));
+      if (start === end)
+        return "";
+      if (type$.Uint8List._is(codeUnits)) {
+        bytes = codeUnits;
+        errorOffset = 0;
+      } else {
+        bytes = P._Utf8Decoder__makeUint8List(codeUnits, start, end);
+        end -= start;
+        errorOffset = start;
+        start = 0;
+      }
+      result = _this._convertRecursive$4(bytes, start, end, single);
+      t1 = _this._convert$_state;
+      if ((t1 & 1) !== 0) {
+        message = P._Utf8Decoder_errorDescription(t1);
+        _this._convert$_state = 0;
+        throw H.wrapException(P.FormatException$(message, codeUnits, errorOffset + _this._charOrIndex));
+      }
+      return result;
+    },
+    _convertRecursive$4: function(bytes, start, end, single) {
+      var mid, s1, _this = this;
+      if (end - start > 1000) {
+        mid = C.JSInt_methods._tdivFast$1(start + end, 2);
+        s1 = _this._convertRecursive$4(bytes, start, mid, false);
+        if ((_this._convert$_state & 1) !== 0)
+          return s1;
+        return s1 + _this._convertRecursive$4(bytes, mid, end, single);
+      }
+      return _this.decodeGeneral$4(bytes, start, end, single);
+    },
+    flush$1: function(sink) {
+      var state = this._convert$_state;
+      this._convert$_state = 0;
+      if (state <= 32)
+        return;
+      if (this.allowMalformed)
+        sink._contents += H.Primitives_stringFromCharCode(65533);
+      else
+        throw H.wrapException(P.FormatException$(P._Utf8Decoder_errorDescription(77), null, null));
+    },
+    decodeGeneral$4: function(bytes, start, end, single) {
+      var t1, type, t2, i0, markEnd, i1, m, _this = this, _65533 = 65533,
+        state = _this._convert$_state,
+        char = _this._charOrIndex,
+        buffer = new P.StringBuffer(""),
+        i = start + 1,
+        byte = bytes[start];
+      $label0$0:
+        for (t1 = _this.allowMalformed; true;) {
+          for (; true; i = i0) {
+            type = C.JSString_methods._codeUnitAt$1("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHJEEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBKCCCCCCCCCCCCDCLONNNMEEEEEEEEEEE", byte) & 31;
+            char = state <= 32 ? byte & 61694 >>> type : (byte & 63 | char << 6) >>> 0;
+            state = C.JSString_methods._codeUnitAt$1(" \x000:XECCCCCN:lDb \x000:XECCCCCNvlDb \x000:XECCCCCN:lDb AAAAA\x00\x00\x00\x00\x00AAAAA00000AAAAA:::::AAAAAGG000AAAAA00KKKAAAAAG::::AAAAA:IIIIAAAAA000\x800AAAAA\x00\x00\x00\x00 AAAAA", state + type);
+            if (state === 0) {
+              buffer._contents += H.Primitives_stringFromCharCode(char);
+              if (i === end)
+                break $label0$0;
+              break;
+            } else if ((state & 1) !== 0) {
+              if (t1)
+                switch (state) {
+                  case 69:
+                  case 67:
+                    buffer._contents += H.Primitives_stringFromCharCode(_65533);
+                    break;
+                  case 65:
+                    buffer._contents += H.Primitives_stringFromCharCode(_65533);
+                    --i;
+                    break;
+                  default:
+                    t2 = buffer._contents += H.Primitives_stringFromCharCode(_65533);
+                    buffer._contents = t2 + H.Primitives_stringFromCharCode(_65533);
+                    break;
+                }
+              else {
+                _this._convert$_state = state;
+                _this._charOrIndex = i - 1;
+                return "";
+              }
+              state = 0;
+            }
+            if (i === end)
+              break $label0$0;
+            i0 = i + 1;
+            byte = bytes[i];
+          }
+          i0 = i + 1;
+          byte = bytes[i];
+          if (byte < 128) {
+            while (true) {
+              if (!(i0 < end)) {
+                markEnd = end;
+                break;
+              }
+              i1 = i0 + 1;
+              byte = bytes[i0];
+              if (byte >= 128) {
+                markEnd = i1 - 1;
+                i0 = i1;
+                break;
+              }
+              i0 = i1;
+            }
+            if (markEnd - i < 20)
+              for (m = i; m < markEnd; ++m)
+                buffer._contents += H.Primitives_stringFromCharCode(bytes[m]);
+            else
+              buffer._contents += P.String_String$fromCharCodes(bytes, i, markEnd);
+            if (markEnd === end)
+              break $label0$0;
+            i = i0;
+          } else
+            i = i0;
+        }
+      if (single && state > 32)
+        if (t1)
+          buffer._contents += H.Primitives_stringFromCharCode(_65533);
+        else {
+          _this._convert$_state = 77;
+          _this._charOrIndex = end;
+          return "";
+        }
+      _this._convert$_state = state;
+      _this._charOrIndex = char;
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  P.NoSuchMethodError_toString_closure.prototype = {
+    call$2: function(key, value) {
+      var t3,
+        t1 = this.sb,
+        t2 = this._box_0;
+      t1._contents += t2.comma;
+      t3 = t1._contents += H.S(key.__internal$_name);
+      t1._contents = t3 + ": ";
+      t1._contents += P.Error_safeToString(value);
+      t2.comma = ", ";
+    },
+    $signature: 241
+  };
+  P.DateTime.prototype = {
+    add$1: function(_, duration) {
+      return P.DateTime$_withValue(C.JSInt_methods.$add(this._value, duration.get$inMilliseconds()), false);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof P.DateTime && this._value === other._value && true;
+    },
+    compareTo$1: function(_, other) {
+      return C.JSInt_methods.compareTo$1(this._value, other._value);
+    },
+    get$hashCode: function(_) {
+      var t1 = this._value;
+      return (t1 ^ C.JSInt_methods._shrOtherPositive$1(t1, 30)) & 1073741823;
+    },
+    toString$0: function(_) {
+      var _this = this,
+        y = P.DateTime__fourDigits(H.Primitives_getYear(_this)),
+        m = P.DateTime__twoDigits(H.Primitives_getMonth(_this)),
+        d = P.DateTime__twoDigits(H.Primitives_getDay(_this)),
+        h = P.DateTime__twoDigits(H.Primitives_getHours(_this)),
+        min = P.DateTime__twoDigits(H.Primitives_getMinutes(_this)),
+        sec = P.DateTime__twoDigits(H.Primitives_getSeconds(_this)),
+        ms = P.DateTime__threeDigits(H.Primitives_getMilliseconds(_this)),
+        t1 = y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
+      return t1;
+    },
+    $isComparable: 1
+  };
+  P.Duration.prototype = {
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof P.Duration && this._duration === other._duration;
+    },
+    get$hashCode: function(_) {
+      return C.JSInt_methods.get$hashCode(this._duration);
+    },
+    compareTo$1: function(_, other) {
+      return C.JSInt_methods.compareTo$1(this._duration, other._duration);
+    },
+    toString$0: function(_) {
+      var twoDigitMinutes, twoDigitSeconds, sixDigitUs,
+        t1 = new P.Duration_toString_twoDigits(),
+        t2 = this._duration;
+      if (t2 < 0)
+        return "-" + new P.Duration(0 - t2).toString$0(0);
+      twoDigitMinutes = t1.call$1(C.JSInt_methods._tdivFast$1(t2, 60000000) % 60);
+      twoDigitSeconds = t1.call$1(C.JSInt_methods._tdivFast$1(t2, 1000000) % 60);
+      sixDigitUs = new P.Duration_toString_sixDigits().call$1(t2 % 1000000);
+      return "" + C.JSInt_methods._tdivFast$1(t2, 3600000000) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
+    },
+    $isComparable: 1
+  };
+  P.Duration_toString_sixDigits.prototype = {
+    call$1: function(n) {
+      if (n >= 100000)
+        return "" + n;
+      if (n >= 10000)
+        return "0" + n;
+      if (n >= 1000)
+        return "00" + n;
+      if (n >= 100)
+        return "000" + n;
+      if (n >= 10)
+        return "0000" + n;
+      return "00000" + n;
+    },
+    $signature: 209
+  };
+  P.Duration_toString_twoDigits.prototype = {
+    call$1: function(n) {
+      if (n >= 10)
+        return "" + n;
+      return "0" + n;
+    },
+    $signature: 209
+  };
+  P.Error.prototype = {
+    get$stackTrace: function() {
+      return H.getTraceFromException(this.$thrownJsError);
+    }
+  };
+  P.AssertionError.prototype = {
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 != null)
+        return "Assertion failed: " + P.Error_safeToString(t1);
+      return "Assertion failed";
+    },
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  P.TypeError.prototype = {};
+  P.NullThrownError.prototype = {
+    toString$0: function(_) {
+      return "Throw of null.";
+    }
+  };
+  P.ArgumentError.prototype = {
+    get$_errorName: function() {
+      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
+    },
+    get$_errorExplanation: function() {
+      return "";
+    },
+    toString$0: function(_) {
+      var explanation, errorValue, _this = this,
+        $name = _this.name,
+        nameString = $name == null ? "" : " (" + $name + ")",
+        message = _this.message,
+        messageString = message == null ? "" : ": " + H.S(message),
+        prefix = _this.get$_errorName() + nameString + messageString;
+      if (!_this._hasValue)
+        return prefix;
+      explanation = _this.get$_errorExplanation();
+      errorValue = P.Error_safeToString(_this.invalidValue);
+      return prefix + explanation + ": " + errorValue;
+    },
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  P.RangeError.prototype = {
+    get$_errorName: function() {
+      return "RangeError";
+    },
+    get$_errorExplanation: function() {
+      var explanation,
+        start = this.start,
+        end = this.end;
+      if (start == null)
+        explanation = end != null ? ": Not less than or equal to " + H.S(end) : "";
+      else if (end == null)
+        explanation = ": Not greater than or equal to " + H.S(start);
+      else if (end > start)
+        explanation = ": Not in inclusive range " + H.S(start) + ".." + H.S(end);
+      else
+        explanation = end < start ? ": Valid value range is empty" : ": Only valid value is " + H.S(start);
+      return explanation;
+    }
+  };
+  P.IndexError.prototype = {
+    get$_errorName: function() {
+      return "RangeError";
+    },
+    get$_errorExplanation: function() {
+      if (this.invalidValue < 0)
+        return ": index must not be negative";
+      var t1 = this.length;
+      if (t1 === 0)
+        return ": no indices are valid";
+      return ": index should be less than " + H.S(t1);
+    },
+    $isRangeError: 1,
+    get$length: function(receiver) {
+      return this.length;
+    }
+  };
+  P.NoSuchMethodError.prototype = {
+    toString$0: function(_) {
+      var $arguments, t1, _i, t2, t3, argument, receiverText, actualParameters, _this = this, _box_0 = {},
+        sb = new P.StringBuffer("");
+      _box_0.comma = "";
+      $arguments = _this._core$_arguments;
+      for (t1 = $arguments.length, _i = 0, t2 = "", t3 = ""; _i < t1; ++_i, t3 = ", ") {
+        argument = $arguments[_i];
+        sb._contents = t2 + t3;
+        t2 = sb._contents += P.Error_safeToString(argument);
+        _box_0.comma = ", ";
+      }
+      _this._namedArguments.forEach$1(0, new P.NoSuchMethodError_toString_closure(_box_0, sb));
+      receiverText = P.Error_safeToString(_this._core$_receiver);
+      actualParameters = sb.toString$0(0);
+      t1 = "NoSuchMethodError: method not found: '" + H.S(_this._memberName.__internal$_name) + "'\nReceiver: " + receiverText + "\nArguments: [" + actualParameters + "]";
+      return t1;
+    }
+  };
+  P.UnsupportedError.prototype = {
+    toString$0: function(_) {
+      return "Unsupported operation: " + this.message;
+    },
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  P.UnimplementedError.prototype = {
+    toString$0: function(_) {
+      var message = this.message;
+      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
+    },
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  P.StateError.prototype = {
+    toString$0: function(_) {
+      return "Bad state: " + this.message;
+    },
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  P.ConcurrentModificationError.prototype = {
+    toString$0: function(_) {
+      var t1 = this.modifiedObject;
+      if (t1 == null)
+        return "Concurrent modification during iteration.";
+      return "Concurrent modification during iteration: " + P.Error_safeToString(t1) + ".";
+    }
+  };
+  P.OutOfMemoryError.prototype = {
+    toString$0: function(_) {
+      return "Out of Memory";
+    },
+    get$stackTrace: function() {
+      return null;
+    },
+    $isError: 1
+  };
+  P.StackOverflowError.prototype = {
+    toString$0: function(_) {
+      return "Stack Overflow";
+    },
+    get$stackTrace: function() {
+      return null;
+    },
+    $isError: 1
+  };
+  P.CyclicInitializationError.prototype = {
+    toString$0: function(_) {
+      var variableName = this.variableName;
+      return variableName == null ? "Reading static variable during its initialization" : "Reading static variable '" + variableName + "' during its initialization";
+    }
+  };
+  P._Exception.prototype = {
+    toString$0: function(_) {
+      return "Exception: " + this.message;
+    },
+    $isException: 1,
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  P.FormatException.prototype = {
+    toString$0: function(_) {
+      var t1, lineNum, lineStart, previousCharWasCR, i, char, lineEnd, end, start, prefix, postfix, slice,
+        message = this.message,
+        report = message != null && "" !== message ? "FormatException: " + H.S(message) : "FormatException",
+        offset = this.offset,
+        source = this.source;
+      if (typeof source == "string") {
+        if (offset != null)
+          t1 = offset < 0 || offset > source.length;
+        else
+          t1 = false;
+        if (t1)
+          offset = null;
+        if (offset == null) {
+          if (source.length > 78)
+            source = C.JSString_methods.substring$2(source, 0, 75) + "...";
+          return report + "\n" + source;
+        }
+        for (lineNum = 1, lineStart = 0, previousCharWasCR = false, i = 0; i < offset; ++i) {
+          char = C.JSString_methods._codeUnitAt$1(source, i);
+          if (char === 10) {
+            if (lineStart !== i || !previousCharWasCR)
+              ++lineNum;
+            lineStart = i + 1;
+            previousCharWasCR = false;
+          } else if (char === 13) {
+            ++lineNum;
+            lineStart = i + 1;
+            previousCharWasCR = true;
+          }
+        }
+        report = lineNum > 1 ? report + (" (at line " + lineNum + ", character " + (offset - lineStart + 1) + ")\n") : report + (" (at character " + (offset + 1) + ")\n");
+        lineEnd = source.length;
+        for (i = offset; i < lineEnd; ++i) {
+          char = C.JSString_methods.codeUnitAt$1(source, i);
+          if (char === 10 || char === 13) {
+            lineEnd = i;
+            break;
+          }
+        }
+        if (lineEnd - lineStart > 78)
+          if (offset - lineStart < 75) {
+            end = lineStart + 75;
+            start = lineStart;
+            prefix = "";
+            postfix = "...";
+          } else {
+            if (lineEnd - offset < 75) {
+              start = lineEnd - 75;
+              end = lineEnd;
+              postfix = "";
+            } else {
+              start = offset - 36;
+              end = offset + 36;
+              postfix = "...";
+            }
+            prefix = "...";
+          }
+        else {
+          end = lineEnd;
+          start = lineStart;
+          prefix = "";
+          postfix = "";
+        }
+        slice = C.JSString_methods.substring$2(source, start, end);
+        return report + prefix + slice + postfix + "\n" + C.JSString_methods.$mul(" ", offset - start + prefix.length) + "^\n";
+      } else
+        return offset != null ? report + (" (at offset " + H.S(offset) + ")") : report;
+    },
+    $isException: 1,
+    get$message: function(receiver) {
+      return this.message;
+    },
+    get$source: function() {
+      return this.source;
+    }
+  };
+  P.Iterable.prototype = {
+    cast$1$0: function(_, $R) {
+      return H.CastIterable_CastIterable(this, H._instanceType(this)._eval$1("Iterable.E"), $R);
+    },
+    followedBy$1: function(_, other) {
+      var _this = this,
+        t1 = H._instanceType(_this);
+      if (t1._eval$1("EfficientLengthIterable<Iterable.E>")._is(_this))
+        return H.FollowedByIterable_FollowedByIterable$firstEfficient(_this, other, t1._eval$1("Iterable.E"));
+      return new H.FollowedByIterable(_this, other, t1._eval$1("FollowedByIterable<Iterable.E>"));
+    },
+    map$1$1: function(_, f, $T) {
+      return H.MappedIterable_MappedIterable(this, f, H._instanceType(this)._eval$1("Iterable.E"), $T);
+    },
+    where$1: function(_, test) {
+      return new H.WhereIterable(this, test, H._instanceType(this)._eval$1("WhereIterable<Iterable.E>"));
+    },
+    expand$1$1: function(_, f, $T) {
+      return new H.ExpandIterable(this, f, H._instanceType(this)._eval$1("@<Iterable.E>")._bind$1($T)._eval$1("ExpandIterable<1,2>"));
+    },
+    contains$1: function(_, element) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (J.$eq$(t1.get$current(t1), element))
+          return true;
+      return false;
+    },
+    fold$1$2: function(_, initialValue, combine) {
+      var t1, value;
+      for (t1 = this.get$iterator(this), value = initialValue; t1.moveNext$0();)
+        value = combine.call$2(value, t1.get$current(t1));
+      return value;
+    },
+    fold$2: function($receiver, initialValue, combine) {
+      return this.fold$1$2($receiver, initialValue, combine, type$.dynamic);
+    },
+    join$1: function(_, separator) {
+      var t1,
+        iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      if (separator === "") {
+        t1 = "";
+        do
+          t1 += H.S(J.toString$0$(iterator.get$current(iterator)));
+        while (iterator.moveNext$0());
+      } else {
+        t1 = H.S(J.toString$0$(iterator.get$current(iterator)));
+        for (; iterator.moveNext$0();)
+          t1 = t1 + separator + H.S(J.toString$0$(iterator.get$current(iterator)));
+      }
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    join$0: function($receiver) {
+      return this.join$1($receiver, "");
+    },
+    any$1: function(_, test) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (test.call$1(t1.get$current(t1)))
+          return true;
+      return false;
+    },
+    toList$1$growable: function(_, growable) {
+      return P.List_List$from(this, growable, H._instanceType(this)._eval$1("Iterable.E"));
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    toSet$0: function(_) {
+      return P.LinkedHashSet_LinkedHashSet$of(this, H._instanceType(this)._eval$1("Iterable.E"));
+    },
+    get$length: function(_) {
+      var count,
+        it = this.get$iterator(this);
+      for (count = 0; it.moveNext$0();)
+        ++count;
+      return count;
+    },
+    get$isEmpty: function(_) {
+      return !this.get$iterator(this).moveNext$0();
+    },
+    get$isNotEmpty: function(_) {
+      return !this.get$isEmpty(this);
+    },
+    take$1: function(_, count) {
+      return H.TakeIterable_TakeIterable(this, count, H._instanceType(this)._eval$1("Iterable.E"));
+    },
+    skip$1: function(_, count) {
+      return H.SkipIterable_SkipIterable(this, count, H._instanceType(this)._eval$1("Iterable.E"));
+    },
+    skipWhile$1: function(_, test) {
+      return new H.SkipWhileIterable(this, test, H._instanceType(this)._eval$1("SkipWhileIterable<Iterable.E>"));
+    },
+    get$first: function(_) {
+      var it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      return it.get$current(it);
+    },
+    get$last: function(_) {
+      var result,
+        it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current(it);
+      while (it.moveNext$0());
+      return result;
+    },
+    get$single: function(_) {
+      var result,
+        it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      result = it.get$current(it);
+      if (it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_tooMany());
+      return result;
+    },
+    firstWhere$2$orElse: function(_, test, orElse) {
+      var t1, element;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();) {
+        element = t1.get$current(t1);
+        if (test.call$1(element))
+          return element;
+      }
+      return orElse.call$0();
+    },
+    elementAt$1: function(_, index) {
+      var t1, elementIndex, element;
+      P.RangeError_checkNotNegative(index, "index");
+      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
+        element = t1.get$current(t1);
+        if (index === elementIndex)
+          return element;
+        ++elementIndex;
+      }
+      throw H.wrapException(P.IndexError$(index, this, "index", null, elementIndex));
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToShortString(this, "(", ")");
+    }
+  };
+  P._GeneratorIterable.prototype = {
+    elementAt$1: function(_, index) {
+      P.RangeError_checkValidIndex(index, this, null);
+      return this._generator.call$1(index);
+    },
+    get$length: function(receiver) {
+      return this.length;
+    }
+  };
+  P.Iterator.prototype = {};
+  P.MapEntry.prototype = {
+    toString$0: function(_) {
+      return "MapEntry(" + H.S(J.toString$0$(this.key)) + ": " + H.S(J.toString$0$(this.value)) + ")";
+    }
+  };
+  P.Null.prototype = {
+    get$hashCode: function(_) {
+      return P.Object.prototype.get$hashCode.call(C.JSNull_methods, this);
+    },
+    toString$0: function(_) {
+      return "null";
+    }
+  };
+  P.Object.prototype = {constructor: P.Object, $isObject: 1,
+    $eq: function(_, other) {
+      return this === other;
+    },
+    get$hashCode: function(_) {
+      return H.Primitives_objectHashCode(this);
+    },
+    toString$0: function(_) {
+      return "Instance of '" + H.S(H.Primitives_objectTypeName(this)) + "'";
+    },
+    noSuchMethod$1: function(_, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
+    },
+    get$runtimeType: function(_) {
+      var rti = this instanceof H.Closure ? H.closureFunctionType(this) : null;
+      return H.createRuntimeType(rti == null ? H.instanceType(this) : rti);
+    },
+    toString: function() {
+      return this.toString$0(this);
+    }
+  };
+  P._StringStackTrace.prototype = {
+    toString$0: function(_) {
+      return this._stackTrace;
+    },
+    $isStackTrace: 1
+  };
+  P.Runes.prototype = {
+    get$iterator: function(_) {
+      return new P.RuneIterator(this.string);
+    },
+    get$last: function(_) {
+      var code, previousCode,
+        t1 = this.string,
+        t2 = t1.length;
+      if (t2 === 0)
+        throw H.wrapException(P.StateError$("No elements."));
+      code = C.JSString_methods.codeUnitAt$1(t1, t2 - 1);
+      if ((code & 64512) === 56320 && t2 > 1) {
+        previousCode = C.JSString_methods.codeUnitAt$1(t1, t2 - 2);
+        if ((previousCode & 64512) === 55296)
+          return P._combineSurrogatePair(previousCode, code);
+      }
+      return code;
+    }
+  };
+  P.RuneIterator.prototype = {
+    get$current: function(_) {
+      return this._currentCodePoint;
+    },
+    moveNext$0: function() {
+      var codeUnit, nextPosition, nextCodeUnit, _this = this,
+        t1 = _this._position = _this._nextPosition,
+        t2 = _this.string,
+        t3 = t2.length;
+      if (t1 === t3) {
+        _this._currentCodePoint = -1;
+        return false;
+      }
+      codeUnit = C.JSString_methods._codeUnitAt$1(t2, t1);
+      nextPosition = t1 + 1;
+      if ((codeUnit & 64512) === 55296 && nextPosition < t3) {
+        nextCodeUnit = C.JSString_methods._codeUnitAt$1(t2, nextPosition);
+        if ((nextCodeUnit & 64512) === 56320) {
+          _this._nextPosition = nextPosition + 1;
+          _this._currentCodePoint = P._combineSurrogatePair(codeUnit, nextCodeUnit);
+          return true;
+        }
+      }
+      _this._nextPosition = nextPosition;
+      _this._currentCodePoint = codeUnit;
+      return true;
+    }
+  };
+  P.StringBuffer.prototype = {
+    get$length: function(_) {
+      return this._contents.length;
+    },
+    write$1: function(_, obj) {
+      this._contents += H.S(obj);
+    },
+    writeCharCode$1: function(charCode) {
+      this._contents += H.Primitives_stringFromCharCode(charCode);
+    },
+    toString$0: function(_) {
+      var t1 = this._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  P.Uri__parseIPv4Address_error.prototype = {
+    call$2: function(msg, position) {
+      throw H.wrapException(P.FormatException$("Illegal IPv4 address, " + msg, this.host, position));
+    },
+    $signature: 218
+  };
+  P.Uri_parseIPv6Address_error.prototype = {
+    call$2: function(msg, position) {
+      throw H.wrapException(P.FormatException$("Illegal IPv6 address, " + msg, this.host, position));
+    },
+    call$1: function(msg) {
+      return this.call$2(msg, null);
+    },
+    $signature: 220
+  };
+  P.Uri_parseIPv6Address_parseHex.prototype = {
+    call$2: function(start, end) {
+      var value;
+      if (end - start > 4)
+        this.error.call$2("an IPv6 part can only contain a maximum of 4 hex digits", start);
+      value = P.int_parse(C.JSString_methods.substring$2(this.host, start, end), 16);
+      if (value < 0 || value > 65535)
+        this.error.call$2("each part must be in the range of `0x0..0xFFFF`", start);
+      return value;
+    },
+    $signature: 223
+  };
+  P._Uri.prototype = {
+    get$_text: function() {
+      var t2, t3, t4, _this = this,
+        t1 = _this.___Uri__text;
+      if (t1 == null) {
+        t1 = _this.scheme;
+        t2 = t1.length !== 0 ? t1 + ":" : "";
+        t3 = _this._host;
+        t4 = t3 == null;
+        if (!t4 || t1 === "file") {
+          t1 = t2 + "//";
+          t2 = _this._userInfo;
+          if (t2.length !== 0)
+            t1 = t1 + t2 + "@";
+          if (!t4)
+            t1 += t3;
+          t2 = _this._port;
+          if (t2 != null)
+            t1 = t1 + ":" + H.S(t2);
+        } else
+          t1 = t2;
+        t1 += _this.path;
+        t2 = _this._query;
+        if (t2 != null)
+          t1 = t1 + "?" + t2;
+        t2 = _this._fragment;
+        if (t2 != null)
+          t1 = t1 + "#" + t2;
+        t1 = t1.charCodeAt(0) == 0 ? t1 : t1;
+        if (_this.___Uri__text == null)
+          _this.___Uri__text = t1;
+        else
+          t1 = H.throwExpression(H.LateInitializationErrorImpl$("Field '_text' has been assigned during initialization."));
+      }
+      return t1;
+    },
+    get$pathSegments: function() {
+      var pathToSplit, _this = this,
+        t1 = _this.___Uri_pathSegments;
+      if (t1 == null) {
+        pathToSplit = _this.path;
+        if (pathToSplit.length !== 0 && C.JSString_methods._codeUnitAt$1(pathToSplit, 0) === 47)
+          pathToSplit = C.JSString_methods.substring$1(pathToSplit, 1);
+        t1 = pathToSplit.length === 0 ? C.List_empty : P.List_List$unmodifiable(new H.MappedListIterable(H.setRuntimeTypeInfo(pathToSplit.split("/"), type$.JSArray_String), P.core_Uri_decodeComponent$closure(), type$.MappedListIterable_String_dynamic), type$.String);
+        if (_this.___Uri_pathSegments == null)
+          _this.___Uri_pathSegments = t1;
+        else
+          t1 = H.throwExpression(H.LateInitializationErrorImpl$("Field 'pathSegments' has been assigned during initialization."));
+      }
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var _this = this,
+        t1 = _this.___Uri_hashCode;
+      if (t1 == null) {
+        t1 = C.JSString_methods.get$hashCode(_this.get$_text());
+        if (_this.___Uri_hashCode == null)
+          _this.___Uri_hashCode = t1;
+        else
+          t1 = H.throwExpression(H.LateInitializationErrorImpl$("Field 'hashCode' has been assigned during initialization."));
+      }
+      return t1;
+    },
+    get$userInfo: function() {
+      return this._userInfo;
+    },
+    get$host: function() {
+      var host = this._host;
+      if (host == null)
+        return "";
+      if (C.JSString_methods.startsWith$1(host, "["))
+        return C.JSString_methods.substring$2(host, 1, host.length - 1);
+      return host;
+    },
+    get$port: function(_) {
+      var t1 = this._port;
+      return t1 == null ? P._Uri__defaultPort(this.scheme) : t1;
+    },
+    get$query: function() {
+      var t1 = this._query;
+      return t1 == null ? "" : t1;
+    },
+    get$fragment: function() {
+      var t1 = this._fragment;
+      return t1 == null ? "" : t1;
+    },
+    _mergePaths$2: function(base, reference) {
+      var backCount, refStart, baseEnd, newEnd, delta, t1;
+      for (backCount = 0, refStart = 0; C.JSString_methods.startsWith$2(reference, "../", refStart);) {
+        refStart += 3;
+        ++backCount;
+      }
+      baseEnd = C.JSString_methods.lastIndexOf$1(base, "/");
+      while (true) {
+        if (!(baseEnd > 0 && backCount > 0))
+          break;
+        newEnd = C.JSString_methods.lastIndexOf$2(base, "/", baseEnd - 1);
+        if (newEnd < 0)
+          break;
+        delta = baseEnd - newEnd;
+        t1 = delta !== 2;
+        if (!t1 || delta === 3)
+          if (C.JSString_methods.codeUnitAt$1(base, newEnd + 1) === 46)
+            t1 = !t1 || C.JSString_methods.codeUnitAt$1(base, newEnd + 2) === 46;
+          else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          break;
+        --backCount;
+        baseEnd = newEnd;
+      }
+      return C.JSString_methods.replaceRange$3(base, baseEnd + 1, null, C.JSString_methods.substring$1(reference, refStart - 3 * backCount));
+    },
+    resolve$1: function(reference) {
+      return this.resolveUri$1(P.Uri_parse(reference));
+    },
+    resolveUri$1: function(reference) {
+      var targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, t1, mergedPath, t2, _this = this, _null = null;
+      if (reference.get$scheme().length !== 0) {
+        targetScheme = reference.get$scheme();
+        if (reference.get$hasAuthority()) {
+          targetUserInfo = reference.get$userInfo();
+          targetHost = reference.get$host();
+          targetPort = reference.get$hasPort() ? reference.get$port(reference) : _null;
+        } else {
+          targetPort = _null;
+          targetHost = targetPort;
+          targetUserInfo = "";
+        }
+        targetPath = P._Uri__removeDotSegments(reference.get$path(reference));
+        targetQuery = reference.get$hasQuery() ? reference.get$query() : _null;
+      } else {
+        targetScheme = _this.scheme;
+        if (reference.get$hasAuthority()) {
+          targetUserInfo = reference.get$userInfo();
+          targetHost = reference.get$host();
+          targetPort = P._Uri__makePort(reference.get$hasPort() ? reference.get$port(reference) : _null, targetScheme);
+          targetPath = P._Uri__removeDotSegments(reference.get$path(reference));
+          targetQuery = reference.get$hasQuery() ? reference.get$query() : _null;
+        } else {
+          targetUserInfo = _this._userInfo;
+          targetHost = _this._host;
+          targetPort = _this._port;
+          if (reference.get$path(reference) === "") {
+            targetPath = _this.path;
+            targetQuery = reference.get$hasQuery() ? reference.get$query() : _this._query;
+          } else {
+            if (reference.get$hasAbsolutePath())
+              targetPath = P._Uri__removeDotSegments(reference.get$path(reference));
+            else {
+              t1 = _this.path;
+              if (t1.length === 0)
+                if (targetHost == null)
+                  targetPath = targetScheme.length === 0 ? reference.get$path(reference) : P._Uri__removeDotSegments(reference.get$path(reference));
+                else
+                  targetPath = P._Uri__removeDotSegments("/" + reference.get$path(reference));
+              else {
+                mergedPath = _this._mergePaths$2(t1, reference.get$path(reference));
+                t2 = targetScheme.length === 0;
+                if (!t2 || targetHost != null || C.JSString_methods.startsWith$1(t1, "/"))
+                  targetPath = P._Uri__removeDotSegments(mergedPath);
+                else
+                  targetPath = P._Uri__normalizeRelativePath(mergedPath, !t2 || targetHost != null);
+              }
+            }
+            targetQuery = reference.get$hasQuery() ? reference.get$query() : _null;
+          }
+        }
+      }
+      return new P._Uri(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, reference.get$hasFragment() ? reference.get$fragment() : _null);
+    },
+    get$hasAuthority: function() {
+      return this._host != null;
+    },
+    get$hasPort: function() {
+      return this._port != null;
+    },
+    get$hasQuery: function() {
+      return this._query != null;
+    },
+    get$hasFragment: function() {
+      return this._fragment != null;
+    },
+    get$hasAbsolutePath: function() {
+      return C.JSString_methods.startsWith$1(this.path, "/");
+    },
+    toFilePath$0: function() {
+      var pathSegments, _this = this,
+        t1 = _this.scheme;
+      if (t1 !== "" && t1 !== "file")
+        throw H.wrapException(P.UnsupportedError$("Cannot extract a file path from a " + t1 + " URI"));
+      if (_this.get$query() !== "")
+        throw H.wrapException(P.UnsupportedError$(string$.Cannotefq));
+      if (_this.get$fragment() !== "")
+        throw H.wrapException(P.UnsupportedError$(string$.Cannoteff));
+      t1 = $.$get$_Uri__isWindowsCached();
+      if (t1)
+        t1 = P._Uri__toWindowsFilePath(_this);
+      else {
+        if (_this._host != null && _this.get$host() !== "")
+          H.throwExpression(P.UnsupportedError$(string$.Cannoten));
+        pathSegments = _this.get$pathSegments();
+        P._Uri__checkNonWindowsPathReservedCharacters(pathSegments, false);
+        t1 = P.StringBuffer__writeAll(C.JSString_methods.startsWith$1(_this.path, "/") ? "/" : "", pathSegments, "/");
+        t1 = t1.charCodeAt(0) == 0 ? t1 : t1;
+      }
+      return t1;
+    },
+    toString$0: function(_) {
+      return this.get$_text();
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      if (_this === other)
+        return true;
+      return type$.Uri._is(other) && _this.scheme === other.get$scheme() && _this._host != null === other.get$hasAuthority() && _this._userInfo === other.get$userInfo() && _this.get$host() === other.get$host() && _this.get$port(_this) === other.get$port(other) && _this.path === other.get$path(other) && _this._query != null === other.get$hasQuery() && _this.get$query() === other.get$query() && _this._fragment != null === other.get$hasFragment() && _this.get$fragment() === other.get$fragment();
+    },
+    $isUri: 1,
+    get$scheme: function() {
+      return this.scheme;
+    },
+    get$path: function(receiver) {
+      return this.path;
+    }
+  };
+  P._Uri__makePath_closure.prototype = {
+    call$1: function(s) {
+      return P._Uri__uriEncode(C.List_qg40, s, C.C_Utf8Codec, false);
+    },
+    $signature: 198
+  };
+  P.UriData.prototype = {
+    get$uri: function() {
+      var t2, queryIndex, end, query, _this = this, _null = null,
+        t1 = _this._uriCache;
+      if (t1 == null) {
+        t1 = _this._text;
+        t2 = _this._separatorIndices[0] + 1;
+        queryIndex = C.JSString_methods.indexOf$2(t1, "?", t2);
+        end = t1.length;
+        if (queryIndex >= 0) {
+          query = P._Uri__normalizeOrSubstring(t1, queryIndex + 1, end, C.List_CVk, false);
+          end = queryIndex;
+        } else
+          query = _null;
+        t1 = _this._uriCache = new P._DataUri("data", "", _null, _null, P._Uri__normalizeOrSubstring(t1, t2, end, C.List_qg4, false), query, _null);
+      }
+      return t1;
+    },
+    toString$0: function(_) {
+      var t1 = this._text;
+      return this._separatorIndices[0] === -1 ? "data:" + t1 : t1;
+    }
+  };
+  P._createTables_closure.prototype = {
+    call$1: function(_) {
+      return new Uint8Array(96);
+    },
+    $signature: 232
+  };
+  P._createTables_build.prototype = {
+    call$2: function(state, defaultTransition) {
+      var t1 = this.tables[state];
+      J.fillRange$3$ax(t1, 0, 96, defaultTransition);
+      return t1;
+    },
+    $signature: 238
+  };
+  P._createTables_setChars.prototype = {
+    call$3: function(target, chars, transition) {
+      var t1, i;
+      for (t1 = chars.length, i = 0; i < t1; ++i)
+        target[C.JSString_methods._codeUnitAt$1(chars, i) ^ 96] = transition;
+    },
+    $signature: 181
+  };
+  P._createTables_setRange.prototype = {
+    call$3: function(target, range, transition) {
+      var i, n;
+      for (i = C.JSString_methods._codeUnitAt$1(range, 0), n = C.JSString_methods._codeUnitAt$1(range, 1); i <= n; ++i)
+        target[(i ^ 96) >>> 0] = transition;
+    },
+    $signature: 181
+  };
+  P._SimpleUri.prototype = {
+    get$hasAuthority: function() {
+      return this._hostStart > 0;
+    },
+    get$hasPort: function() {
+      return this._hostStart > 0 && this._portStart + 1 < this._pathStart;
+    },
+    get$hasQuery: function() {
+      return this._queryStart < this._fragmentStart;
+    },
+    get$hasFragment: function() {
+      return this._fragmentStart < this._uri.length;
+    },
+    get$_isFile: function() {
+      return this._schemeEnd === 4 && C.JSString_methods.startsWith$1(this._uri, "file");
+    },
+    get$_isHttp: function() {
+      return this._schemeEnd === 4 && C.JSString_methods.startsWith$1(this._uri, "http");
+    },
+    get$_isHttps: function() {
+      return this._schemeEnd === 5 && C.JSString_methods.startsWith$1(this._uri, "https");
+    },
+    get$hasAbsolutePath: function() {
+      return C.JSString_methods.startsWith$2(this._uri, "/", this._pathStart);
+    },
+    get$scheme: function() {
+      var t1 = this._schemeCache;
+      return t1 == null ? this._schemeCache = this._computeScheme$0() : t1;
+    },
+    _computeScheme$0: function() {
+      var _this = this,
+        t1 = _this._schemeEnd;
+      if (t1 <= 0)
+        return "";
+      if (_this.get$_isHttp())
+        return "http";
+      if (_this.get$_isHttps())
+        return "https";
+      if (_this.get$_isFile())
+        return "file";
+      if (t1 === 7 && C.JSString_methods.startsWith$1(_this._uri, "package"))
+        return "package";
+      return C.JSString_methods.substring$2(_this._uri, 0, t1);
+    },
+    get$userInfo: function() {
+      var t1 = this._hostStart,
+        t2 = this._schemeEnd + 3;
+      return t1 > t2 ? C.JSString_methods.substring$2(this._uri, t2, t1 - 1) : "";
+    },
+    get$host: function() {
+      var t1 = this._hostStart;
+      return t1 > 0 ? C.JSString_methods.substring$2(this._uri, t1, this._portStart) : "";
+    },
+    get$port: function(_) {
+      var _this = this;
+      if (_this.get$hasPort())
+        return P.int_parse(C.JSString_methods.substring$2(_this._uri, _this._portStart + 1, _this._pathStart), null);
+      if (_this.get$_isHttp())
+        return 80;
+      if (_this.get$_isHttps())
+        return 443;
+      return 0;
+    },
+    get$path: function(_) {
+      return C.JSString_methods.substring$2(this._uri, this._pathStart, this._queryStart);
+    },
+    get$query: function() {
+      var t1 = this._queryStart,
+        t2 = this._fragmentStart;
+      return t1 < t2 ? C.JSString_methods.substring$2(this._uri, t1 + 1, t2) : "";
+    },
+    get$fragment: function() {
+      var t1 = this._fragmentStart,
+        t2 = this._uri;
+      return t1 < t2.length ? C.JSString_methods.substring$1(t2, t1 + 1) : "";
+    },
+    get$pathSegments: function() {
+      var parts, i,
+        start = this._pathStart,
+        end = this._queryStart,
+        t1 = this._uri;
+      if (C.JSString_methods.startsWith$2(t1, "/", start))
+        ++start;
+      if (start === end)
+        return C.List_empty;
+      parts = H.setRuntimeTypeInfo([], type$.JSArray_String);
+      for (i = start; i < end; ++i)
+        if (C.JSString_methods.codeUnitAt$1(t1, i) === 47) {
+          parts.push(C.JSString_methods.substring$2(t1, start, i));
+          start = i + 1;
+        }
+      parts.push(C.JSString_methods.substring$2(t1, start, end));
+      return P.List_List$unmodifiable(parts, type$.String);
+    },
+    _isPort$1: function(port) {
+      var portDigitStart = this._portStart + 1;
+      return portDigitStart + port.length === this._pathStart && C.JSString_methods.startsWith$2(this._uri, port, portDigitStart);
+    },
+    removeFragment$0: function() {
+      var _this = this,
+        t1 = _this._fragmentStart,
+        t2 = _this._uri;
+      if (t1 >= t2.length)
+        return _this;
+      return new P._SimpleUri(C.JSString_methods.substring$2(t2, 0, t1), _this._schemeEnd, _this._hostStart, _this._portStart, _this._pathStart, _this._queryStart, t1, _this._schemeCache);
+    },
+    resolve$1: function(reference) {
+      return this.resolveUri$1(P.Uri_parse(reference));
+    },
+    resolveUri$1: function(reference) {
+      if (reference instanceof P._SimpleUri)
+        return this._simpleMerge$2(this, reference);
+      return this._toNonSimple$0().resolveUri$1(reference);
+    },
+    _simpleMerge$2: function(base, ref) {
+      var t2, t3, isSimple, delta, refStart, baseStart, baseEnd, baseUri, baseStart0, backCount, refStart0, insert,
+        t1 = ref._schemeEnd;
+      if (t1 > 0)
+        return ref;
+      t2 = ref._hostStart;
+      if (t2 > 0) {
+        t3 = base._schemeEnd;
+        if (t3 <= 0)
+          return ref;
+        if (base.get$_isFile())
+          isSimple = ref._pathStart !== ref._queryStart;
+        else if (base.get$_isHttp())
+          isSimple = !ref._isPort$1("80");
+        else
+          isSimple = !base.get$_isHttps() || !ref._isPort$1("443");
+        if (isSimple) {
+          delta = t3 + 1;
+          return new P._SimpleUri(C.JSString_methods.substring$2(base._uri, 0, delta) + C.JSString_methods.substring$1(ref._uri, t1 + 1), t3, t2 + delta, ref._portStart + delta, ref._pathStart + delta, ref._queryStart + delta, ref._fragmentStart + delta, base._schemeCache);
+        } else
+          return this._toNonSimple$0().resolveUri$1(ref);
+      }
+      refStart = ref._pathStart;
+      t1 = ref._queryStart;
+      if (refStart === t1) {
+        t2 = ref._fragmentStart;
+        if (t1 < t2) {
+          t3 = base._queryStart;
+          delta = t3 - t1;
+          return new P._SimpleUri(C.JSString_methods.substring$2(base._uri, 0, t3) + C.JSString_methods.substring$1(ref._uri, t1), base._schemeEnd, base._hostStart, base._portStart, base._pathStart, t1 + delta, t2 + delta, base._schemeCache);
+        }
+        t1 = ref._uri;
+        if (t2 < t1.length) {
+          t3 = base._fragmentStart;
+          return new P._SimpleUri(C.JSString_methods.substring$2(base._uri, 0, t3) + C.JSString_methods.substring$1(t1, t2), base._schemeEnd, base._hostStart, base._portStart, base._pathStart, base._queryStart, t2 + (t3 - t2), base._schemeCache);
+        }
+        return base.removeFragment$0();
+      }
+      t2 = ref._uri;
+      if (C.JSString_methods.startsWith$2(t2, "/", refStart)) {
+        t3 = base._pathStart;
+        delta = t3 - refStart;
+        return new P._SimpleUri(C.JSString_methods.substring$2(base._uri, 0, t3) + C.JSString_methods.substring$1(t2, refStart), base._schemeEnd, base._hostStart, base._portStart, t3, t1 + delta, ref._fragmentStart + delta, base._schemeCache);
+      }
+      baseStart = base._pathStart;
+      baseEnd = base._queryStart;
+      if (baseStart === baseEnd && base._hostStart > 0) {
+        for (; C.JSString_methods.startsWith$2(t2, "../", refStart);)
+          refStart += 3;
+        delta = baseStart - refStart + 1;
+        return new P._SimpleUri(C.JSString_methods.substring$2(base._uri, 0, baseStart) + "/" + C.JSString_methods.substring$1(t2, refStart), base._schemeEnd, base._hostStart, base._portStart, baseStart, t1 + delta, ref._fragmentStart + delta, base._schemeCache);
+      }
+      baseUri = base._uri;
+      for (baseStart0 = baseStart; C.JSString_methods.startsWith$2(baseUri, "../", baseStart0);)
+        baseStart0 += 3;
+      backCount = 0;
+      while (true) {
+        refStart0 = refStart + 3;
+        if (!(refStart0 <= t1 && C.JSString_methods.startsWith$2(t2, "../", refStart)))
+          break;
+        ++backCount;
+        refStart = refStart0;
+      }
+      for (insert = ""; baseEnd > baseStart0;) {
+        --baseEnd;
+        if (C.JSString_methods.codeUnitAt$1(baseUri, baseEnd) === 47) {
+          if (backCount === 0) {
+            insert = "/";
+            break;
+          }
+          --backCount;
+          insert = "/";
+        }
+      }
+      if (baseEnd === baseStart0 && base._schemeEnd <= 0 && !C.JSString_methods.startsWith$2(baseUri, "/", baseStart)) {
+        refStart -= backCount * 3;
+        insert = "";
+      }
+      delta = baseEnd - refStart + insert.length;
+      return new P._SimpleUri(C.JSString_methods.substring$2(baseUri, 0, baseEnd) + insert + C.JSString_methods.substring$1(t2, refStart), base._schemeEnd, base._hostStart, base._portStart, baseStart, t1 + delta, ref._fragmentStart + delta, base._schemeCache);
+    },
+    toFilePath$0: function() {
+      var t1, t2, t3, _this = this;
+      if (_this._schemeEnd >= 0 && !_this.get$_isFile())
+        throw H.wrapException(P.UnsupportedError$("Cannot extract a file path from a " + _this.get$scheme() + " URI"));
+      t1 = _this._queryStart;
+      t2 = _this._uri;
+      if (t1 < t2.length) {
+        if (t1 < _this._fragmentStart)
+          throw H.wrapException(P.UnsupportedError$(string$.Cannotefq));
+        throw H.wrapException(P.UnsupportedError$(string$.Cannoteff));
+      }
+      t3 = $.$get$_Uri__isWindowsCached();
+      if (t3)
+        t1 = P._Uri__toWindowsFilePath(_this);
+      else {
+        if (_this._hostStart < _this._portStart)
+          H.throwExpression(P.UnsupportedError$(string$.Cannoten));
+        t1 = C.JSString_methods.substring$2(t2, _this._pathStart, t1);
+      }
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this._hashCodeCache;
+      return t1 == null ? this._hashCodeCache = C.JSString_methods.get$hashCode(this._uri) : t1;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      return type$.Uri._is(other) && this._uri === other.toString$0(0);
+    },
+    _toNonSimple$0: function() {
+      var _this = this, _null = null,
+        t1 = _this.get$scheme(),
+        t2 = _this.get$userInfo(),
+        t3 = _this._hostStart > 0 ? _this.get$host() : _null,
+        t4 = _this.get$hasPort() ? _this.get$port(_this) : _null,
+        t5 = _this._uri,
+        t6 = _this._queryStart,
+        t7 = C.JSString_methods.substring$2(t5, _this._pathStart, t6),
+        t8 = _this._fragmentStart;
+      t6 = t6 < t8 ? _this.get$query() : _null;
+      return new P._Uri(t1, t2, t3, t4, t7, t6, t8 < t5.length ? _this.get$fragment() : _null);
+    },
+    toString$0: function(_) {
+      return this._uri;
+    },
+    $isUri: 1
+  };
+  P._DataUri.prototype = {};
+  P._JSRandom.prototype = {
+    nextInt$1: function(max) {
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      return Math.random() * max >>> 0;
+    },
+    nextDouble$0: function() {
+      return Math.random();
+    }
+  };
+  N.ArgParser.prototype = {
+    addFlag$6$abbr$defaultsTo$help$hide$negatable: function($name, abbr, defaultsTo, help, hide, negatable) {
+      var _null = null;
+      this._addOption$11$hide$negatable($name, abbr, help, _null, _null, _null, defaultsTo, _null, C.OptionType_nMZ, hide, negatable);
+    },
+    addFlag$2$hide: function($name, hide) {
+      return this.addFlag$6$abbr$defaultsTo$help$hide$negatable($name, null, false, null, hide, true);
+    },
+    addFlag$2$help: function($name, help) {
+      return this.addFlag$6$abbr$defaultsTo$help$hide$negatable($name, null, false, help, false, true);
+    },
+    addFlag$3$defaultsTo$help: function($name, defaultsTo, help) {
+      return this.addFlag$6$abbr$defaultsTo$help$hide$negatable($name, null, defaultsTo, help, false, true);
+    },
+    addFlag$3$help$negatable: function($name, help, negatable) {
+      return this.addFlag$6$abbr$defaultsTo$help$hide$negatable($name, null, false, help, false, negatable);
+    },
+    addFlag$4$abbr$help$negatable: function($name, abbr, help, negatable) {
+      return this.addFlag$6$abbr$defaultsTo$help$hide$negatable($name, abbr, false, help, false, negatable);
+    },
+    addFlag$3$abbr$help: function($name, abbr, help) {
+      return this.addFlag$6$abbr$defaultsTo$help$hide$negatable($name, abbr, false, help, false, true);
+    },
+    addOption$7$abbr$allowed$defaultsTo$help$hide$valueHelp: function($name, abbr, allowed, defaultsTo, help, hide, valueHelp) {
+      this._addOption$11$hide$splitCommas($name, abbr, help, valueHelp, allowed, null, defaultsTo, null, C.OptionType_YwU, hide, null);
+    },
+    addOption$2$hide: function($name, hide) {
+      return this.addOption$7$abbr$allowed$defaultsTo$help$hide$valueHelp($name, null, null, null, null, hide, null);
+    },
+    addOption$6$abbr$allowed$defaultsTo$help$valueHelp: function($name, abbr, allowed, defaultsTo, help, valueHelp) {
+      return this.addOption$7$abbr$allowed$defaultsTo$help$hide$valueHelp($name, abbr, allowed, defaultsTo, help, false, valueHelp);
+    },
+    addOption$4$allowed$defaultsTo$help: function($name, allowed, defaultsTo, help) {
+      return this.addOption$7$abbr$allowed$defaultsTo$help$hide$valueHelp($name, null, allowed, defaultsTo, help, false, null);
+    },
+    addMultiOption$5$abbr$help$splitCommas$valueHelp: function($name, abbr, help, splitCommas, valueHelp) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      this._addOption$11$hide$splitCommas($name, abbr, help, valueHelp, null, null, t1, null, C.OptionType_qyr, false, false);
+    },
+    _addOption$12$hide$negatable$splitCommas: function($name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo, callback, type, hide, negatable, splitCommas) {
+      var t2, existing, t3, option,
+        t1 = this._arg_parser$_options;
+      if (t1.containsKey$1($name))
+        throw H.wrapException(P.ArgumentError$('Duplicate option "' + $name + '".'));
+      t2 = abbr != null;
+      if (t2) {
+        existing = this.findByAbbreviation$1(abbr);
+        if (existing != null)
+          throw H.wrapException(P.ArgumentError$('Abbreviation "' + abbr + '" is already used by "' + existing.name + '".'));
+      }
+      t3 = allowed == null ? null : P.List_List$unmodifiable(allowed, type$.legacy_String);
+      option = new G.Option($name, abbr, help, valueHelp, t3, null, defaultsTo, negatable, callback, type, splitCommas == null ? type === C.OptionType_qyr : splitCommas, hide);
+      if ($name.length === 0)
+        H.throwExpression(P.ArgumentError$("Name cannot be empty."));
+      else if (C.JSString_methods.startsWith$1($name, "-"))
+        H.throwExpression(P.ArgumentError$("Name " + $name + ' cannot start with "-".'));
+      t3 = $.$get$Option__invalidChars()._nativeRegExp;
+      if (t3.test($name))
+        H.throwExpression(P.ArgumentError$('Name "' + $name + '" contains invalid characters.'));
+      if (t2) {
+        if (abbr.length !== 1)
+          H.throwExpression(P.ArgumentError$("Abbreviation must be null or have length 1."));
+        else if (abbr === "-")
+          H.throwExpression(P.ArgumentError$('Abbreviation cannot be "-".'));
+        if (t3.test(abbr))
+          H.throwExpression(P.ArgumentError$("Abbreviation is an invalid character."));
+      }
+      t1.$indexSet(0, $name, option);
+      this._optionsAndSeparators.push(option);
+    },
+    _addOption$11$hide$splitCommas: function($name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo, callback, type, hide, splitCommas) {
+      return this._addOption$12$hide$negatable$splitCommas($name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo, callback, type, hide, false, splitCommas);
+    },
+    _addOption$11$hide$negatable: function($name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo, callback, type, hide, negatable) {
+      return this._addOption$12$hide$negatable$splitCommas($name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo, callback, type, hide, negatable, null);
+    },
+    findByAbbreviation$1: function(abbr) {
+      var t1 = this.options._collection$_map;
+      return t1.get$values(t1).firstWhere$2$orElse(0, new N.ArgParser_findByAbbreviation_closure(abbr), new N.ArgParser_findByAbbreviation_closure0());
+    }
+  };
+  N.ArgParser_findByAbbreviation_closure.prototype = {
+    call$1: function(option) {
+      return option.abbr === this.abbr;
+    },
+    $signature: 265
+  };
+  N.ArgParser_findByAbbreviation_closure0.prototype = {
+    call$0: function() {
+      return null;
+    },
+    $signature: 0
+  };
+  Z.ArgParserException.prototype = {};
+  V.ArgResults.prototype = {
+    $index: function(_, $name) {
+      var t1 = this._parser.options._collection$_map;
+      if (!t1.containsKey$1($name))
+        throw H.wrapException(P.ArgumentError$('Could not find an option named "' + $name + '".'));
+      return t1.$index(0, $name).getOrDefault$1(this._parsed.$index(0, $name));
+    },
+    wasParsed$1: function($name) {
+      if (this._parser.options._collection$_map.$index(0, $name) == null)
+        throw H.wrapException(P.ArgumentError$('Could not find an option named "' + H.S($name) + '".'));
+      return this._parsed.containsKey$1($name);
+    }
+  };
+  G.Option.prototype = {
+    getOrDefault$1: function(value) {
+      var t1;
+      if (value != null)
+        return value;
+      if (this.type === C.OptionType_qyr) {
+        t1 = this.defaultsTo;
+        return t1 == null ? H.setRuntimeTypeInfo([], type$.JSArray_legacy_String) : t1;
+      }
+      return this.defaultsTo;
+    }
+  };
+  G.OptionType.prototype = {};
+  G.Parser0.prototype = {
+    parse$0: function() {
+      var commandResults, commandName, commandParser, error, t1, t2, t4, t5, t6, t7, t8, t9, command, exception, _i, _this = this,
+        t3 = _this.args;
+      t3.toList$0(0);
+      commandResults = null;
+      for (t4 = _this.rest, t5 = _this.grammar, t6 = !t5.allowTrailingOptions, t7 = t5.commands; !t3.get$isEmpty(t3);) {
+        t8 = t3._collection$_head;
+        t9 = t8 === t3._collection$_tail;
+        if (t9)
+          H.throwExpression(H.IterableElementError_noElement());
+        t8 = t3._collection$_table[t8];
+        if (t8 === "--") {
+          t3.removeFirst$0();
+          break;
+        }
+        if (t9)
+          H.throwExpression(H.IterableElementError_noElement());
+        command = t7._collection$_map.$index(0, t8);
+        if (command != null) {
+          if (t4.length !== 0)
+            H.throwExpression(Z.ArgParserException$("Cannot specify arguments before a command.", null));
+          commandName = t3.removeFirst$0();
+          t6 = type$.JSArray_legacy_String;
+          t7 = H.setRuntimeTypeInfo([], t6);
+          C.JSArray_methods.addAll$1(t7, t4);
+          commandParser = new G.Parser0(commandName, _this, command, t3, t7, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.dynamic));
+          try {
+            commandResults = commandParser.parse$0();
+          } catch (exception) {
+            t3 = H.unwrapException(exception);
+            if (t3 instanceof Z.ArgParserException) {
+              error = t3;
+              if (commandName == null)
+                throw exception;
+              t3 = error.message;
+              t1 = H.setRuntimeTypeInfo([], t6);
+              J.add$1$ax(t1, commandName);
+              for (t4 = error.commands, t5 = t4.length, _i = 0; _i < t5; ++_i) {
+                t2 = t4[_i];
+                J.add$1$ax(t1, t2);
+              }
+              throw H.wrapException(Z.ArgParserException$(t3, t1));
+            } else
+              throw exception;
+          }
+          C.JSArray_methods.set$length(t4, 0);
+          break;
+        }
+        if (_this.parseSoloOption$0())
+          continue;
+        if (_this.parseAbbreviation$1(_this))
+          continue;
+        if (_this.parseLongOption$0())
+          continue;
+        if (t6)
+          break;
+        t4.push(t3.removeFirst$0());
+      }
+      t5.options._collection$_map.forEach$1(0, new G.Parser_parse_closure(_this));
+      C.JSArray_methods.addAll$1(t4, t3);
+      t3.clear$0(0);
+      return new V.ArgResults(t5, _this.results, _this.commandName, new P.UnmodifiableListView(t4, type$.UnmodifiableListView_legacy_String));
+    },
+    readNextArgAsValue$1: function(option) {
+      var t1 = this.args,
+        t2 = t1.get$isEmpty(t1),
+        t3 = 'Missing argument for "' + option.name + '".';
+      if (t2)
+        H.throwExpression(Z.ArgParserException$(t3, null));
+      this.setOption$3(this.results, option, t1.get$first(t1));
+      t1.removeFirst$0();
+    },
+    parseSoloOption$0: function() {
+      var opt, option, t2, _this = this,
+        t1 = _this.args;
+      if (t1.get$first(t1).length !== 2)
+        return false;
+      if (!J.startsWith$1$s(t1.get$first(t1), "-"))
+        return false;
+      opt = t1.get$first(t1)[1];
+      if (!G._isLetterOrDigit(C.JSString_methods._codeUnitAt$1(opt, 0)))
+        return false;
+      option = _this.grammar.findByAbbreviation$1(opt);
+      if (option == null) {
+        t1 = _this.parent;
+        t2 = 'Could not find an option or flag "-' + opt + '".';
+        if (t1 == null)
+          H.throwExpression(Z.ArgParserException$(t2, null));
+        return t1.parseSoloOption$0();
+      }
+      t1.removeFirst$0();
+      if (option.type === C.OptionType_nMZ)
+        _this.results.$indexSet(0, option.name, true);
+      else
+        _this.readNextArgAsValue$1(option);
+      return true;
+    },
+    parseAbbreviation$1: function(innermostCommand) {
+      var index, t2, t3, lettersAndDigits, rest, c, first, i, i0, _this = this,
+        t1 = _this.args;
+      if (t1.get$first(t1).length < 2)
+        return false;
+      if (!J.startsWith$1$s(t1.get$first(t1), "-"))
+        return false;
+      index = 1;
+      while (true) {
+        t2 = t1._collection$_head;
+        t3 = t2 === t1._collection$_tail;
+        if (t3)
+          H.throwExpression(H.IterableElementError_noElement());
+        t2 = t1._collection$_table[t2];
+        if (index < t2.length) {
+          if (t3)
+            H.throwExpression(H.IterableElementError_noElement());
+          t2 = J._codeUnitAt$1$s(t2, index);
+          if (!(t2 >= 65 && t2 <= 90))
+            if (!(t2 >= 97 && t2 <= 122))
+              t2 = t2 >= 48 && t2 <= 57;
+            else
+              t2 = true;
+          else
+            t2 = true;
+        } else
+          t2 = false;
+        if (!t2)
+          break;
+        ++index;
+      }
+      if (index === 1)
+        return false;
+      lettersAndDigits = J.substring$2$s(t1.get$first(t1), 1, index);
+      rest = J.substring$1$s(t1.get$first(t1), index);
+      if (C.JSString_methods.contains$1(rest, "\n") || C.JSString_methods.contains$1(rest, "\r"))
+        return false;
+      c = C.JSString_methods.substring$2(lettersAndDigits, 0, 1);
+      first = _this.grammar.findByAbbreviation$1(c);
+      if (first == null) {
+        t1 = _this.parent;
+        t2 = string$.Could_ + c + '".';
+        if (t1 == null)
+          H.throwExpression(Z.ArgParserException$(t2, null));
+        return t1.parseAbbreviation$1(innermostCommand);
+      } else if (first.type !== C.OptionType_nMZ)
+        _this.setOption$3(_this.results, first, C.JSString_methods.substring$1(lettersAndDigits, 1) + rest);
+      else {
+        t2 = 'Option "-' + c + '" is a flag and cannot handle value "' + C.JSString_methods.substring$1(lettersAndDigits, 1) + rest + '".';
+        if (rest !== "")
+          H.throwExpression(Z.ArgParserException$(t2, null));
+        for (t2 = lettersAndDigits.length, i = 0; i < t2; i = i0) {
+          i0 = i + 1;
+          innermostCommand.parseShortFlag$1(C.JSString_methods.substring$2(lettersAndDigits, i, i0));
+        }
+      }
+      t1.removeFirst$0();
+      return true;
+    },
+    parseShortFlag$1: function(c) {
+      var t1, t2,
+        option = this.grammar.findByAbbreviation$1(c);
+      if (option == null) {
+        t1 = this.parent;
+        t2 = string$.Could_ + c + '".';
+        if (t1 == null)
+          H.throwExpression(Z.ArgParserException$(t2, null));
+        t1.parseShortFlag$1(c);
+        return;
+      }
+      t1 = option.type;
+      t2 = 'Option "-' + c + '" must be a flag to be in a collapsed "-".';
+      if (t1 !== C.OptionType_nMZ)
+        H.throwExpression(Z.ArgParserException$(t2, null));
+      this.results.$indexSet(0, option.name, true);
+    },
+    parseLongOption$0: function() {
+      var index, t2, $name, t3, i, t4, t5, value, option, _this = this, _null = null,
+        _s32_ = 'Could not find an option named "',
+        t1 = _this.args;
+      if (!J.startsWith$1$s(t1.get$first(t1), "--"))
+        return false;
+      index = J.indexOf$1$asx(t1.get$first(t1), "=");
+      t2 = index === -1;
+      $name = t2 ? J.substring$1$s(t1.get$first(t1), 2) : J.substring$2$s(t1.get$first(t1), 2, index);
+      for (t3 = $name.length, i = 0; i !== t3; ++i) {
+        t4 = C.JSString_methods._codeUnitAt$1($name, i);
+        if (!(t4 >= 65 && t4 <= 90))
+          if (!(t4 >= 97 && t4 <= 122))
+            t5 = t4 >= 48 && t4 <= 57;
+          else
+            t5 = true;
+        else
+          t5 = true;
+        if (!(t5 || t4 === 45 || t4 === 95))
+          return false;
+      }
+      value = t2 ? _null : J.substring$1$s(t1.get$first(t1), index + 1);
+      t2 = value != null;
+      if (t2)
+        t3 = C.JSString_methods.contains$1(value, "\n") || C.JSString_methods.contains$1(value, "\r");
+      else
+        t3 = false;
+      if (t3)
+        return false;
+      t3 = _this.grammar.options._collection$_map;
+      option = t3.$index(0, $name);
+      if (option != null) {
+        t1.removeFirst$0();
+        if (option.type === C.OptionType_nMZ) {
+          t1 = 'Flag option "' + $name + '" should not be given a value.';
+          if (t2)
+            H.throwExpression(Z.ArgParserException$(t1, _null));
+          _this.results.$indexSet(0, option.name, true);
+        } else if (t2)
+          _this.setOption$3(_this.results, option, value);
+        else
+          _this.readNextArgAsValue$1(option);
+      } else if (C.JSString_methods.startsWith$1($name, "no-")) {
+        $name = C.JSString_methods.substring$1($name, 3);
+        option = t3.$index(0, $name);
+        if (option == null) {
+          t1 = _this.parent;
+          t2 = _s32_ + $name + '".';
+          if (t1 == null)
+            H.throwExpression(Z.ArgParserException$(t2, _null));
+          return t1.parseLongOption$0();
+        }
+        t1.removeFirst$0();
+        t1 = option.type;
+        t2 = 'Cannot negate non-flag option "' + $name + '".';
+        if (t1 !== C.OptionType_nMZ)
+          H.throwExpression(Z.ArgParserException$(t2, _null));
+        t1 = option.negatable;
+        t2 = 'Cannot negate option "' + $name + '".';
+        if (!t1)
+          H.throwExpression(Z.ArgParserException$(t2, _null));
+        _this.results.$indexSet(0, option.name, false);
+      } else {
+        t1 = _this.parent;
+        t2 = _s32_ + $name + '".';
+        if (t1 == null)
+          H.throwExpression(Z.ArgParserException$(t2, _null));
+        return t1.parseLongOption$0();
+      }
+      return true;
+    },
+    setOption$3: function(results, option, value) {
+      var list, t1, t2, t3, _i, element;
+      if (option.type !== C.OptionType_qyr) {
+        this._validateAllowed$2(option, value);
+        results.$indexSet(0, option.name, value);
+        return;
+      }
+      list = results.putIfAbsent$2(option.name, new G.Parser_setOption_closure());
+      if (option.splitCommas)
+        for (t1 = value.split(","), t2 = t1.length, t3 = J.getInterceptor$ax(list), _i = 0; _i < t2; ++_i) {
+          element = t1[_i];
+          this._validateAllowed$2(option, element);
+          t3.add$1(list, element);
+        }
+      else {
+        this._validateAllowed$2(option, value);
+        J.add$1$ax(list, value);
+      }
+    },
+    _validateAllowed$2: function(option, value) {
+      var t2,
+        t1 = option.allowed;
+      if (t1 == null)
+        return;
+      t1 = C.JSArray_methods.contains$1(t1, value);
+      t2 = '"' + H.S(value) + '" is not an allowed value for option "' + option.name + '".';
+      if (!t1)
+        H.throwExpression(Z.ArgParserException$(t2, null));
+    }
+  };
+  G.Parser_parse_closure.prototype = {
+    call$2: function($name, option) {
+      var t1 = option.callback;
+      if (t1 == null)
+        return;
+      t1.call$1(option.getOrDefault$1(this.$this.results.$index(0, $name)));
+    },
+    $signature: 280
+  };
+  G.Parser_setOption_closure.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+    },
+    $signature: 40
+  };
+  G.Usage.prototype = {
+    generate$0: function() {
+      var t1, t2, t3, t4, _i, optionOrSeparator, t5, t6, allowedNames, t7, t8, _i0, $name, isDefault, t9, _this = this;
+      _this.buffer = new P.StringBuffer("");
+      _this.calculateColumnWidths$0();
+      for (t1 = _this.optionsAndSeparators, t2 = t1.length, t3 = type$.legacy_Option, t4 = type$.legacy_List_dynamic, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        optionOrSeparator = t1[_i];
+        if (typeof optionOrSeparator == "string") {
+          t5 = _this.buffer;
+          t6 = t5._contents;
+          t5._contents = (t6.length !== 0 ? t5._contents = t6 + "\n\n" : t6) + optionOrSeparator;
+          _this.newlinesNeeded = 1;
+          continue;
+        }
+        t3._as(optionOrSeparator);
+        if (optionOrSeparator.hide)
+          continue;
+        t5 = optionOrSeparator.abbr;
+        _this.write$2(0, 0, t5 == null ? "" : "-" + t5 + ", ");
+        _this.write$2(0, 1, _this.getLongOption$1(optionOrSeparator));
+        t5 = optionOrSeparator.help;
+        if (t5 != null)
+          _this.write$2(0, 2, t5);
+        t5 = optionOrSeparator.allowedHelp;
+        if (t5 != null) {
+          allowedNames = J.toList$1$growable$ax(t5.get$keys(t5), false);
+          if (!!allowedNames.immutable$list)
+            H.throwExpression(P.UnsupportedError$("sort"));
+          t6 = allowedNames.length - 1;
+          if (t6 - 0 <= 32)
+            H.Sort__insertionSort(allowedNames, 0, t6, J._interceptors_JSArray__compareAny$closure());
+          else
+            H.Sort__dualPivotQuicksort(allowedNames, 0, t6, J._interceptors_JSArray__compareAny$closure());
+          ++_this.newlinesNeeded;
+          _this.numHelpLines = _this.currentColumn = 0;
+          for (t6 = allowedNames.length, t7 = optionOrSeparator.defaultsTo, t8 = t4._is(t7), _i0 = 0; _i0 < allowedNames.length; allowedNames.length === t6 || (0, H.throwConcurrentModificationError)(allowedNames), ++_i0) {
+            $name = allowedNames[_i0];
+            isDefault = t8 ? C.JSArray_methods.contains$1(t7, $name) : t7 == null ? $name == null : t7 === $name;
+            t9 = "      [" + H.S($name) + "]";
+            _this.write$2(0, 1, t9 + (isDefault ? " (default)" : ""));
+            _this.write$2(0, 2, t5.$index(0, $name));
+          }
+          ++_this.newlinesNeeded;
+          _this.numHelpLines = _this.currentColumn = 0;
+        } else if (optionOrSeparator.allowed != null)
+          _this.write$2(0, 2, _this.buildAllowedList$1(optionOrSeparator));
+        else {
+          t5 = optionOrSeparator.type;
+          if (t5 === C.OptionType_nMZ) {
+            if (optionOrSeparator.defaultsTo === true)
+              _this.write$2(0, 2, "(defaults to on)");
+          } else if (t5 === C.OptionType_qyr) {
+            t5 = optionOrSeparator.defaultsTo;
+            if (t5 != null && J.get$isNotEmpty$asx(t5))
+              _this.write$2(0, 2, "(defaults to " + J.map$1$ax(t5, new G.Usage_generate_closure()).join$1(0, ", ") + ")");
+          } else {
+            t5 = optionOrSeparator.defaultsTo;
+            if (t5 != null)
+              _this.write$2(0, 2, '(defaults to "' + H.S(t5) + '")');
+          }
+        }
+      }
+      return J.toString$0$(_this.buffer);
+    },
+    getLongOption$1: function(option) {
+      var t1 = option.name,
+        result = option.negatable ? "--[no-]" + t1 : "--" + t1;
+      t1 = option.valueHelp;
+      return t1 != null ? result + ("=<" + t1 + ">") : result;
+    },
+    calculateColumnWidths$0: function() {
+      var t1, t2, t3, abbr, title, _i, option, t4, t5, t6, allowed, isDefault, t7;
+      for (t1 = this.optionsAndSeparators, t2 = t1.length, t3 = type$.legacy_List_dynamic, abbr = 0, title = 0, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        option = t1[_i];
+        if (!(option instanceof G.Option))
+          continue;
+        if (option.hide)
+          continue;
+        t4 = option.abbr;
+        abbr = Math.max(abbr, (t4 == null ? "" : "-" + t4 + ", ").length);
+        title = Math.max(title, this.getLongOption$1(option).length);
+        t4 = option.allowedHelp;
+        if (t4 != null)
+          for (t4 = J.get$iterator$ax(t4.get$keys(t4)), t5 = option.defaultsTo, t6 = t3._is(t5); t4.moveNext$0();) {
+            allowed = t4.get$current(t4);
+            isDefault = t6 ? C.JSArray_methods.contains$1(t5, allowed) : t5 == null ? allowed == null : t5 === allowed;
+            t7 = "      [" + H.S(allowed) + "]";
+            title = Math.max(title, (t7 + (isDefault ? " (default)" : "")).length);
+          }
+      }
+      this.columnWidths = H.setRuntimeTypeInfo([abbr, title + 4], type$.JSArray_legacy_int);
+    },
+    write$2: function(_, column, text) {
+      var t1, _i,
+        lines = H.setRuntimeTypeInfo(text.split("\n"), type$.JSArray_String);
+      this.columnWidths.length;
+      while (true) {
+        if (!(lines.length !== 0 && J.trim$0$s(lines[0]) === ""))
+          break;
+        if (!!lines.fixed$length)
+          H.throwExpression(P.UnsupportedError$("removeRange"));
+        P.RangeError_checkValidRange(0, 1, lines.length);
+        lines.splice(0, 1);
+      }
+      while (true) {
+        t1 = lines.length;
+        if (!(t1 !== 0 && J.trim$0$s(lines[t1 - 1]) === ""))
+          break;
+        lines.pop();
+      }
+      for (t1 = lines.length, _i = 0; _i < lines.length; lines.length === t1 || (0, H.throwConcurrentModificationError)(lines), ++_i)
+        this.writeLine$2(column, lines[_i]);
+    },
+    writeLine$2: function(column, text) {
+      var t1, t2, _this = this;
+      for (; t1 = _this.newlinesNeeded, t1 > 0;) {
+        _this.buffer._contents += "\n";
+        _this.newlinesNeeded = t1 - 1;
+      }
+      for (; t1 = _this.currentColumn, t1 !== column;) {
+        t2 = _this.buffer;
+        if (t1 < 2)
+          t2._contents += C.JSString_methods.$mul(" ", _this.columnWidths[t1]);
+        else
+          t2._contents += "\n";
+        _this.currentColumn = (_this.currentColumn + 1) % 3;
+      }
+      t1 = _this.columnWidths;
+      t1.length;
+      t2 = _this.buffer;
+      if (column < 2)
+        t2._contents += J.padRight$1$s(text, t1[column]);
+      else {
+        t2.toString;
+        t2._contents += H.S(text);
+      }
+      _this.currentColumn = (_this.currentColumn + 1) % 3;
+      t1 = column === 2;
+      if (t1)
+        ++_this.newlinesNeeded;
+      if (t1)
+        ++_this.numHelpLines;
+      else
+        _this.numHelpLines = 0;
+    },
+    buildAllowedList$1: function(option) {
+      var t2, first, _i, t3, allowed,
+        t1 = option.defaultsTo,
+        isDefault = type$.legacy_List_dynamic._is(t1) ? C.JSArray_methods.get$contains(t1) : new G.Usage_buildAllowedList_closure(option);
+      for (t1 = option.allowed, t2 = t1.length, first = true, _i = 0, t3 = "["; _i < t2; ++_i, first = false) {
+        allowed = t1[_i];
+        if (!first)
+          t3 += ", ";
+        t3 += H.S(allowed);
+        if (isDefault.call$1(allowed))
+          t3 += " (default)";
+      }
+      t1 = t3 + "]";
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  G.Usage_generate_closure.prototype = {
+    call$1: function(value) {
+      return '"' + H.S(value) + '"';
+    },
+    $signature: 107
+  };
+  G.Usage_buildAllowedList_closure.prototype = {
+    call$1: function(value) {
+      var t1 = this.option.defaultsTo;
+      return value == null ? t1 == null : value === t1;
+    },
+    $signature: 151
+  };
+  V.ErrorResult.prototype = {
+    complete$1: function(completer) {
+      completer.completeError$2(this.error, this.stackTrace);
+    },
+    get$hashCode: function(_) {
+      return (J.get$hashCode$(this.error) ^ J.get$hashCode$(this.stackTrace) ^ 492929599) >>> 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof V.ErrorResult && J.$eq$(this.error, other.error) && this.stackTrace == other.stackTrace;
+    },
+    $isResult: 1
+  };
+  F.ValueResult.prototype = {
+    complete$1: function(completer) {
+      completer.complete$1(this.value);
+    },
+    get$hashCode: function(_) {
+      return (J.get$hashCode$(this.value) ^ 842997089) >>> 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof F.ValueResult && J.$eq$(this.value, other.value);
+    },
+    $isResult: 1
+  };
+  Y.StreamCompleter.prototype = {
+    setSourceStream$1: function(sourceStream) {
+      var t1 = this._stream_completer$_stream;
+      if (t1._sourceStream != null)
+        throw H.wrapException(P.StateError$("Source stream already set"));
+      t1._sourceStream = sourceStream;
+      if (t1._stream_completer$_controller != null)
+        t1._linkStreamToController$0();
+    },
+    setError$2: function(error, stackTrace) {
+      var t1 = this.$ti._eval$1("1*");
+      this.setSourceStream$1(P.Stream_Stream$fromFuture(P.Future_Future$error(error, stackTrace, t1), t1));
+    },
+    setError$1: function(error) {
+      return this.setError$2(error, null);
+    }
+  };
+  Y._CompleterStream.prototype = {
+    listen$4$cancelOnError$onDone$onError: function(_, onData, cancelOnError, onDone, onError) {
+      var t1, _this = this, _null = null;
+      if (_this._stream_completer$_controller == null) {
+        t1 = _this._sourceStream;
+        if (t1 != null && !t1.get$isBroadcast())
+          return _this._sourceStream.listen$4$cancelOnError$onDone$onError(0, onData, cancelOnError, onDone, onError);
+        _this._stream_completer$_controller = P.StreamController_StreamController(_null, _null, _null, _null, true, _this.$ti._eval$1("1*"));
+        if (_this._sourceStream != null)
+          _this._linkStreamToController$0();
+      }
+      t1 = _this._stream_completer$_controller;
+      t1.toString;
+      return new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$4$cancelOnError$onDone$onError(0, onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function($receiver, onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError($receiver, onData, null, onDone, onError);
+    },
+    listen$1: function($receiver, onData) {
+      return this.listen$4$cancelOnError$onDone$onError($receiver, onData, null, null, null);
+    },
+    _linkStreamToController$0: function() {
+      var t1 = this._stream_completer$_controller.addStream$2$cancelOnError(this._sourceStream, false),
+        t2 = this._stream_completer$_controller;
+      t1.whenComplete$1(t2.get$close(t2));
+    }
+  };
+  L.StreamGroup.prototype = {
+    add$1: function(_, stream) {
+      var t1, _this = this;
+      if (_this._closed)
+        throw H.wrapException(P.StateError$("Can't add a Stream to a closed StreamGroup."));
+      t1 = _this._stream_group$_state;
+      if (t1 === C._StreamGroupState_dormant)
+        _this._subscriptions.putIfAbsent$2(stream, new L.StreamGroup_add_closure());
+      else if (t1 === C._StreamGroupState_canceled)
+        return stream.listen$1(0, null).cancel$0();
+      else
+        _this._subscriptions.putIfAbsent$2(stream, new L.StreamGroup_add_closure0(_this, stream));
+      return null;
+    },
+    remove$1: function(_, stream) {
+      var t1 = this._subscriptions,
+        subscription = t1.remove$1(0, stream),
+        future = subscription == null ? null : subscription.cancel$0();
+      if (this._closed && t1.get$isEmpty(t1))
+        this._controller.close$0(0);
+      return future;
+    },
+    _onListen$0: function() {
+      this._stream_group$_state = C._StreamGroupState_listening;
+      this._subscriptions.forEach$1(0, new L.StreamGroup__onListen_closure(this));
+    },
+    _onPause$0: function() {
+      this._stream_group$_state = C._StreamGroupState_paused;
+      for (var t1 = this._subscriptions, t1 = t1.get$values(t1), t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        t1.get$current(t1).pause$0(0);
+    },
+    _onResume$0: function() {
+      this._stream_group$_state = C._StreamGroupState_listening;
+      for (var t1 = this._subscriptions, t1 = t1.get$values(t1), t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        t1.get$current(t1).resume$0(0);
+    },
+    _onCancel$0: function() {
+      var t1, t2, t3, futures;
+      this._stream_group$_state = C._StreamGroupState_canceled;
+      t1 = this._subscriptions;
+      t2 = t1.get$values(t1);
+      t2 = H.MappedIterable_MappedIterable(t2, new L.StreamGroup__onCancel_closure(this), H._instanceType(t2)._eval$1("Iterable.E"), type$.legacy_Future_void);
+      t3 = H._instanceType(t2)._eval$1("WhereIterable<Iterable.E>");
+      futures = P.List_List$from(new H.WhereIterable(t2, new L.StreamGroup__onCancel_closure0(), t3), true, t3._eval$1("Iterable.E"));
+      t1.clear$0(0);
+      return futures.length === 0 ? null : P.Future_wait(futures, type$.void);
+    },
+    _listenToStream$1: function(stream) {
+      var t1 = this._controller,
+        subscription = stream.listen$3$onDone$onError(0, t1.get$add(t1), new L.StreamGroup__listenToStream_closure(this, stream), t1.get$addError());
+      if (this._stream_group$_state === C._StreamGroupState_paused)
+        subscription.pause$0(0);
+      return subscription;
+    }
+  };
+  L.StreamGroup_add_closure.prototype = {
+    call$0: function() {
+      return null;
+    },
+    $signature: 0
+  };
+  L.StreamGroup_add_closure0.prototype = {
+    call$0: function() {
+      return this.$this._listenToStream$1(this.stream);
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("StreamSubscription<1*>*()");
+    }
+  };
+  L.StreamGroup__onListen_closure.prototype = {
+    call$2: function(stream, subscription) {
+      var t1;
+      if (subscription != null)
+        return;
+      t1 = this.$this;
+      t1._subscriptions.$indexSet(0, stream, t1._listenToStream$1(stream));
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("Null(Stream<1*>*,StreamSubscription<1*>*)");
+    }
+  };
+  L.StreamGroup__onCancel_closure.prototype = {
+    call$1: function(subscription) {
+      return subscription.cancel$0();
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("Future<~>*(StreamSubscription<1*>*)");
+    }
+  };
+  L.StreamGroup__onCancel_closure0.prototype = {
+    call$1: function(future) {
+      return future != null;
+    },
+    $signature: 302
+  };
+  L.StreamGroup__listenToStream_closure.prototype = {
+    call$0: function() {
+      return this.$this.remove$1(0, this.stream);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 139
+  };
+  L._StreamGroupState.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  G.StreamQueue.prototype = {
+    get$next: function() {
+      var t1 = this.$ti,
+        t2 = new P._Future($.Zone__current, t1._eval$1("_Future<1*>"));
+      this._addRequest$1(new G._NextRequest(new P._AsyncCompleter(t2, t1._eval$1("_AsyncCompleter<1*>")), t1._eval$1("_NextRequest<1*>")));
+      return t2;
+    },
+    _updateRequests$0: function() {
+      var t1, t2, t3, _this = this;
+      for (t1 = _this._requestQueue, t2 = _this._eventQueue; !t1.get$isEmpty(t1);) {
+        t3 = t1._collection$_head;
+        if (t3 === t1._collection$_tail)
+          H.throwExpression(H.IterableElementError_noElement());
+        if (t1._collection$_table[t3].update$2(t2, _this._isDone))
+          t1.removeFirst$0();
+        else
+          return;
+      }
+      if (!_this._isDone)
+        _this._stream_queue$_subscription.pause$0(0);
+    },
+    _ensureListening$0: function() {
+      var t1, _this = this;
+      if (_this._isDone)
+        return;
+      t1 = _this._stream_queue$_subscription;
+      if (t1 == null)
+        _this._stream_queue$_subscription = _this._stream_queue$_source.listen$3$onDone$onError(0, new G.StreamQueue__ensureListening_closure(_this), new G.StreamQueue__ensureListening_closure0(_this), new G.StreamQueue__ensureListening_closure1(_this));
+      else
+        t1.resume$0(0);
+    },
+    _addResult$1: function(result) {
+      ++this._eventsReceived;
+      this._eventQueue._queue_list$_add$1(result);
+      this._updateRequests$0();
+    },
+    _addRequest$1: function(request) {
+      var _this = this,
+        t1 = _this._requestQueue;
+      if (t1._collection$_head === t1._collection$_tail) {
+        if (request.update$2(_this._eventQueue, _this._isDone))
+          return;
+        _this._ensureListening$0();
+      }
+      t1._add$1(request);
+    }
+  };
+  G.StreamQueue__ensureListening_closure.prototype = {
+    call$1: function(data) {
+      var t1 = this.$this;
+      t1._addResult$1(new F.ValueResult(data, t1.$ti._eval$1("ValueResult<1*>")));
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("Null(1*)");
+    }
+  };
+  G.StreamQueue__ensureListening_closure1.prototype = {
+    call$2: function(error, stackTrace) {
+      this.$this._addResult$1(new V.ErrorResult(error, stackTrace));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 133
+  };
+  G.StreamQueue__ensureListening_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._stream_queue$_subscription = null;
+      t1._isDone = true;
+      t1._updateRequests$0();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  G._NextRequest.prototype = {
+    update$2: function(events, isDone) {
+      if (!events.get$isEmpty(events)) {
+        events.removeFirst$0().complete$1(this._completer);
+        return true;
+      }
+      if (isDone) {
+        this._completer.completeError$2(new P.StateError("No elements"), P.StackTrace_current());
+        return true;
+      }
+      return false;
+    },
+    $is_EventRequest: 1
+  };
+  Q.Repl.prototype = {};
+  Q.closure113.prototype = {
+    call$1: function(text) {
+      return true;
+    },
+    $signature: 6
+  };
+  B.ReplAdapter.prototype = {
+    runAsync$0: function() {
+      var $async$runAsync$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        switch ($async$errorCode) {
+          case 2:
+            $async$next = $async$nextWhenCanceled;
+            $async$goto = $async$next.pop();
+            break;
+          case 1:
+            $async$currentError = $async$result;
+            $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = J.get$isTTY$x(self.process.stdin);
+              output = (t1 == null ? false : t1) ? self.process.stdout : null;
+              t1 = $async$self.repl;
+              $prompt = t1.prompt;
+              $async$self.rl = J.createInterface$1$x($.$get$readline(), {input: self.process.stdin, output: output, prompt: $prompt});
+              controller = P.StreamController_StreamController(null, null, null, null, false, type$.legacy_String);
+              queue = new G.StreamQueue(new P._ControllerStream(controller, H._instanceType(controller)._eval$1("_ControllerStream<1>")), Q.QueueList$(null, type$.legacy_Result_legacy_String), P.ListQueue$(type$.legacy__EventRequest_dynamic), type$.StreamQueue_legacy_String);
+              J.on$2$x($async$self.rl, "line", P.allowInterop(new B.ReplAdapter_runAsync_closure(controller)));
+              prompt0 = t1.continuation, prompt1 = $prompt, statement = "";
+            case 3:
+              // for condition
+              // trivial condition
+              t2 = J.get$isTTY$x(self.process.stdin);
+              if (t2 == null ? false : t2)
+                J.write$1$x(self.process.stdout, prompt1);
+              $async$goto = 5;
+              return P._asyncStarHelper(queue.get$next(), $async$runAsync$0, $async$controller);
+            case 5:
+              // returning from await.
+              line = $async$result;
+              t2 = J.get$isTTY$x(self.process.stdin);
+              if (!(t2 == null ? false : t2)) {
+                line0 = prompt1 + H.S(line);
+                toZone = $.printToZone;
+                if (toZone == null)
+                  H.printString(line0);
+                else
+                  toZone.call$1(line0);
+              }
+              statement = C.JSString_methods.$add(statement, line);
+              $async$goto = t1.validator.call$1(statement) ? 6 : 8;
+              break;
+            case 6:
+              // then
+              $async$goto = 9;
+              $async$nextWhenCanceled = [1];
+              return P._asyncStarHelper(P._IterationMarker_yieldSingle(statement), $async$runAsync$0, $async$controller);
+            case 9:
+              // after yield
+              J.setPrompt$1$x($async$self.rl, $prompt);
+              prompt1 = $prompt;
+              statement = "";
+              // goto join
+              $async$goto = 7;
+              break;
+            case 8:
+              // else
+              statement += "\n";
+              J.setPrompt$1$x($async$self.rl, prompt0);
+              prompt1 = prompt0;
+            case 7:
+              // join
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 4:
+              // after for
+            case 1:
+              // return
+              return P._asyncStarHelper(null, 0, $async$controller);
+            case 2:
+              // rethrow
+              return P._asyncStarHelper($async$currentError, 1, $async$controller);
+          }
+      });
+      var $async$goto = 0,
+        $async$controller = P._makeAsyncStarStreamController($async$runAsync$0, type$.legacy_String),
+        $async$nextWhenCanceled, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, $prompt, controller, queue, prompt0, prompt1, statement, t2, line, line0, toZone, t1, output;
+      return P._streamOfController($async$controller);
+    }
+  };
+  B.ReplAdapter_runAsync_closure.prototype = {
+    call$1: function(value) {
+      this.controller.add$1(0, value);
+    },
+    call$0: function() {
+      return this.call$1(null);
+    },
+    "call*": "call$1",
+    $requiredArgCount: 0,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 96
+  };
+  B.Stdin.prototype = {};
+  B.Stdout.prototype = {};
+  B.ReadlineModule.prototype = {};
+  B.ReadlineOptions.prototype = {};
+  B.ReadlineInterface.prototype = {};
+  O.EmptyUnmodifiableSet.prototype = {
+    get$iterator: function(_) {
+      return C.C_EmptyIterator;
+    },
+    get$length: function(_) {
+      return 0;
+    },
+    cast$1$0: function(_, $T) {
+      return new O.EmptyUnmodifiableSet($T._eval$1("EmptyUnmodifiableSet<0*>"));
+    },
+    contains$1: function(_, element) {
+      return false;
+    },
+    toSet$0: function(_) {
+      return P.LinkedHashSet_LinkedHashSet$_empty(this.$ti._eval$1("1*"));
+    },
+    add$1: function(_, value) {
+      return O.EmptyUnmodifiableSet__throw();
+    },
+    addAll$1: function(_, elements) {
+      return O.EmptyUnmodifiableSet__throw();
+    },
+    $isEfficientLengthIterable: 1,
+    $isSet: 1
+  };
+  U.DefaultEquality.prototype = {};
+  U.IterableEquality.prototype = {
+    equals$2: function(_, elements1, elements2) {
+      var it1, it2, hasNext;
+      if (elements1 === elements2)
+        return true;
+      it1 = J.get$iterator$ax(elements1);
+      it2 = J.get$iterator$ax(elements2);
+      for (; true;) {
+        hasNext = it1.moveNext$0();
+        if (hasNext !== it2.moveNext$0())
+          return false;
+        if (!hasNext)
+          return true;
+        if (!J.$eq$(it1.get$current(it1), it2.get$current(it2)))
+          return false;
+      }
+    }
+  };
+  U.ListEquality.prototype = {
+    equals$2: function(_, list1, list2) {
+      var t1, $length, t2, i;
+      if (list1 == null ? list2 == null : list1 === list2)
+        return true;
+      if (list1 == null || list2 == null)
+        return false;
+      t1 = J.getInterceptor$asx(list1);
+      $length = t1.get$length(list1);
+      t2 = J.getInterceptor$asx(list2);
+      if ($length !== t2.get$length(list2))
+        return false;
+      for (i = 0; i < $length; ++i)
+        if (!J.$eq$(t1.$index(list1, i), t2.$index(list2, i)))
+          return false;
+      return true;
+    },
+    hash$1: function(list) {
+      var t1, hash, i;
+      for (t1 = list.length, hash = 0, i = 0; i < t1; ++i) {
+        hash = hash + J.get$hashCode$(list[i]) & 2147483647;
+        hash = hash + (hash << 10 >>> 0) & 2147483647;
+        hash ^= hash >>> 6;
+      }
+      hash = hash + (hash << 3 >>> 0) & 2147483647;
+      hash ^= hash >>> 11;
+      return hash + (hash << 15 >>> 0) & 2147483647;
+    }
+  };
+  U._MapEntry.prototype = {
+    get$hashCode: function(_) {
+      return 3 * J.get$hashCode$(this.key) + 7 * J.get$hashCode$(this.value) & 2147483647;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof U._MapEntry && J.$eq$(this.key, other.key) && J.$eq$(this.value, other.value);
+    }
+  };
+  U.MapEquality.prototype = {
+    equals$2: function(_, map1, map2) {
+      var equalElementCounts, t1, key, entry, count;
+      if (map1 === map2)
+        return true;
+      if (map1.get$length(map1) !== map2.get$length(map2))
+        return false;
+      equalElementCounts = P.HashMap_HashMap(type$.legacy__MapEntry, type$.legacy_int);
+      for (t1 = J.get$iterator$ax(map1.get$keys(map1)); t1.moveNext$0();) {
+        key = t1.get$current(t1);
+        entry = new U._MapEntry(this, key, map1.$index(0, key));
+        count = equalElementCounts.$index(0, entry);
+        equalElementCounts.$indexSet(0, entry, (count == null ? 0 : count) + 1);
+      }
+      for (t1 = J.get$iterator$ax(map2.get$keys(map2)); t1.moveNext$0();) {
+        key = t1.get$current(t1);
+        entry = new U._MapEntry(this, key, map2.$index(0, key));
+        count = equalElementCounts.$index(0, entry);
+        if (count == null || count === 0)
+          return false;
+        equalElementCounts.$indexSet(0, entry, count - 1);
+      }
+      return true;
+    },
+    hash$1: function(map) {
+      var t1, hash, key;
+      for (t1 = J.get$iterator$ax(map.get$keys(map)), hash = 0; t1.moveNext$0();) {
+        key = t1.get$current(t1);
+        hash = hash + 3 * J.get$hashCode$(key) + 7 * J.get$hashCode$(map.$index(0, key)) & 2147483647;
+      }
+      hash = hash + (hash << 3 >>> 0) & 2147483647;
+      hash ^= hash >>> 11;
+      return hash + (hash << 15 >>> 0) & 2147483647;
+    }
+  };
+  Q.QueueList.prototype = {
+    QueueList$1: function(initialCapacity, $E) {
+      var t1;
+      if (initialCapacity == null || initialCapacity < 8)
+        initialCapacity = 8;
+      else if ((initialCapacity & initialCapacity - 1) >>> 0 !== 0)
+        initialCapacity = Q.QueueList__nextPowerOf2(initialCapacity);
+      t1 = new Array(initialCapacity);
+      t1.fixed$length = Array;
+      this._table = H.setRuntimeTypeInfo(t1, $E._eval$1("JSArray<0*>"));
+    },
+    add$1: function(_, element) {
+      this._queue_list$_add$1(element);
+    },
+    addAll$1: function(_, iterable) {
+      var addCount, $length, t1, endSpace, preSpace, _this = this;
+      if (type$.legacy_List_dynamic._is(iterable)) {
+        addCount = J.get$length$asx(iterable);
+        $length = _this.get$length(_this);
+        t1 = $length + addCount;
+        if (t1 >= J.get$length$asx(_this._table)) {
+          _this._preGrow$1(t1);
+          J.setRange$4$ax(_this._table, $length, t1, iterable, 0);
+          _this.set$_tail(_this.get$_tail() + addCount);
+        } else {
+          endSpace = J.get$length$asx(_this._table) - _this.get$_tail();
+          t1 = _this._table;
+          if (addCount < endSpace) {
+            J.setRange$4$ax(t1, _this.get$_tail(), _this.get$_tail() + addCount, iterable, 0);
+            _this.set$_tail(_this.get$_tail() + addCount);
+          } else {
+            preSpace = addCount - endSpace;
+            J.setRange$4$ax(t1, _this.get$_tail(), _this.get$_tail() + endSpace, iterable, 0);
+            J.setRange$4$ax(_this._table, 0, preSpace, iterable, endSpace);
+            _this.set$_tail(preSpace);
+          }
+        }
+      } else
+        for (t1 = J.get$iterator$ax(iterable); t1.moveNext$0();)
+          _this._queue_list$_add$1(t1.get$current(t1));
+    },
+    cast$1$0: function(_, $T) {
+      var t1 = $T._eval$1("0*"),
+        t2 = new Q._CastQueueList(this, null, null, H._instanceType(this)._eval$1("@<QueueList.E*>")._bind$1(t1)._eval$1("_CastQueueList<1,2>"));
+      t2._table = J.cast$1$0$ax(this._table, t1);
+      return t2;
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    addFirst$1: function(element) {
+      var _this = this;
+      _this.set$_head((_this.get$_head() - 1 & J.get$length$asx(_this._table) - 1) >>> 0);
+      J.$indexSet$ax(_this._table, _this.get$_head(), element);
+      if (_this.get$_head() == _this.get$_tail())
+        _this._grow$0();
+    },
+    removeFirst$0: function() {
+      var result, _this = this;
+      if (_this.get$_head() == _this.get$_tail())
+        throw H.wrapException(P.StateError$("No element"));
+      result = J.$index$asx(_this._table, _this.get$_head());
+      J.$indexSet$ax(_this._table, _this.get$_head(), null);
+      _this.set$_head((_this.get$_head() + 1 & J.get$length$asx(_this._table) - 1) >>> 0);
+      return result;
+    },
+    get$length: function(_) {
+      return (this.get$_tail() - this.get$_head() & J.get$length$asx(this._table) - 1) >>> 0;
+    },
+    set$length: function(_, value) {
+      var delta, newTail, t1, t2, _this = this;
+      if (value < 0)
+        throw H.wrapException(P.RangeError$("Length " + value + " may not be negative."));
+      delta = value - _this.get$length(_this);
+      if (delta >= 0) {
+        if (J.get$length$asx(_this._table) <= value)
+          _this._preGrow$1(value);
+        _this.set$_tail((_this.get$_tail() + delta & J.get$length$asx(_this._table) - 1) >>> 0);
+        return;
+      }
+      newTail = _this.get$_tail() + delta;
+      t1 = _this._table;
+      if (newTail >= 0)
+        J.fillRange$3$ax(t1, newTail, _this.get$_tail(), null);
+      else {
+        newTail += J.get$length$asx(t1);
+        J.fillRange$3$ax(_this._table, 0, _this.get$_tail(), null);
+        t1 = _this._table;
+        t2 = J.getInterceptor$asx(t1);
+        t2.fillRange$3(t1, newTail, t2.get$length(t1), null);
+      }
+      _this.set$_tail(newTail);
+    },
+    $index: function(_, index) {
+      var _this = this;
+      if (index < 0 || index >= _this.get$length(_this))
+        throw H.wrapException(P.RangeError$("Index " + H.S(index) + " must be in the range [0.." + _this.get$length(_this) + ")."));
+      return J.$index$asx(_this._table, (_this.get$_head() + index & J.get$length$asx(_this._table) - 1) >>> 0);
+    },
+    $indexSet: function(_, index, value) {
+      var _this = this;
+      if (index < 0 || index >= _this.get$length(_this))
+        throw H.wrapException(P.RangeError$("Index " + H.S(index) + " must be in the range [0.." + _this.get$length(_this) + ")."));
+      J.$indexSet$ax(_this._table, (_this.get$_head() + index & J.get$length$asx(_this._table) - 1) >>> 0, value);
+    },
+    _queue_list$_add$1: function(element) {
+      var _this = this;
+      J.$indexSet$ax(_this._table, _this.get$_tail(), element);
+      _this.set$_tail((_this.get$_tail() + 1 & J.get$length$asx(_this._table) - 1) >>> 0);
+      if (_this.get$_head() == _this.get$_tail())
+        _this._grow$0();
+    },
+    _grow$0: function() {
+      var newTable, split, _this = this,
+        t1 = new Array(J.get$length$asx(_this._table) * 2);
+      t1.fixed$length = Array;
+      newTable = H.setRuntimeTypeInfo(t1, H._instanceType(_this)._eval$1("JSArray<QueueList.E*>"));
+      split = J.get$length$asx(_this._table) - _this.get$_head();
+      C.JSArray_methods.setRange$4(newTable, 0, split, _this._table, _this.get$_head());
+      C.JSArray_methods.setRange$4(newTable, split, split + _this.get$_head(), _this._table, 0);
+      _this.set$_head(0);
+      _this.set$_tail(J.get$length$asx(_this._table));
+      _this._table = newTable;
+    },
+    _writeToList$1: function(target) {
+      var $length, firstPartSize, _this = this;
+      if (_this.get$_head() <= _this.get$_tail()) {
+        $length = _this.get$_tail() - _this.get$_head();
+        C.JSArray_methods.setRange$4(target, 0, $length, _this._table, _this.get$_head());
+        return $length;
+      } else {
+        firstPartSize = J.get$length$asx(_this._table) - _this.get$_head();
+        C.JSArray_methods.setRange$4(target, 0, firstPartSize, _this._table, _this.get$_head());
+        C.JSArray_methods.setRange$4(target, firstPartSize, firstPartSize + _this.get$_tail(), _this._table, 0);
+        return _this.get$_tail() + firstPartSize;
+      }
+    },
+    _preGrow$1: function(newElementCount) {
+      var newTable, _this = this,
+        t1 = new Array(Q.QueueList__nextPowerOf2(newElementCount + C.JSInt_methods._shrOtherPositive$1(newElementCount, 1)));
+      t1.fixed$length = Array;
+      newTable = H.setRuntimeTypeInfo(t1, H._instanceType(_this)._eval$1("JSArray<QueueList.E*>"));
+      _this.set$_tail(_this._writeToList$1(newTable));
+      _this._table = newTable;
+      _this.set$_head(0);
+    },
+    $isEfficientLengthIterable: 1,
+    $isQueue: 1,
+    $isIterable: 1,
+    $isList: 1,
+    get$_head: function() {
+      return this._head;
+    },
+    get$_tail: function() {
+      return this._tail;
+    },
+    set$_head: function(val) {
+      return this._head = val;
+    },
+    set$_tail: function(val) {
+      return this._tail = val;
+    }
+  };
+  Q._CastQueueList.prototype = {
+    get$_head: function() {
+      return this._queue_list$_delegate.get$_head();
+    },
+    set$_head: function(value) {
+      this._queue_list$_delegate.set$_head(value);
+    },
+    get$_tail: function() {
+      return this._queue_list$_delegate.get$_tail();
+    },
+    set$_tail: function(value) {
+      this._queue_list$_delegate.set$_tail(value);
+    }
+  };
+  Q._QueueList_Object_ListMixin.prototype = {};
+  L.UnmodifiableSetView.prototype = {};
+  L.UnmodifiableSetMixin.prototype = {
+    add$1: function(_, value) {
+      return L.UnmodifiableSetMixin__throw();
+    },
+    addAll$1: function(_, elements) {
+      return L.UnmodifiableSetMixin__throw();
+    }
+  };
+  L._UnmodifiableSetView_DelegatingSet_UnmodifiableSetMixin.prototype = {};
+  B.defaultCompare_closure.prototype = {
+    call$2: function(value1, value2) {
+      return J.compareTo$1$ns(type$.legacy_Comparable_dynamic._as(value1), value2);
+    },
+    $signature: function() {
+      return this.T._eval$1("int*(0*,0*)");
+    }
+  };
+  M._DelegatingIterableBase.prototype = {
+    cast$1$0: function(_, $T) {
+      return J.cast$1$0$ax(this.get$_base(), $T._eval$1("0*"));
+    },
+    contains$1: function(_, element) {
+      return J.contains$1$asx(this.get$_base(), element);
+    },
+    elementAt$1: function(_, index) {
+      return J.elementAt$1$ax(this.get$_base(), index);
+    },
+    get$first: function(_) {
+      return J.get$first$ax(this.get$_base());
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this.get$_base());
+    },
+    get$isNotEmpty: function(_) {
+      return J.get$isNotEmpty$asx(this.get$_base());
+    },
+    get$iterator: function(_) {
+      return J.get$iterator$ax(this.get$_base());
+    },
+    join$1: function(_, separator) {
+      return J.join$1$ax(this.get$_base(), separator);
+    },
+    join$0: function($receiver) {
+      return this.join$1($receiver, "");
+    },
+    get$last: function(_) {
+      return J.get$last$ax(this.get$_base());
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this.get$_base());
+    },
+    map$1$1: function(_, f, $T) {
+      return J.map$1$1$ax(this.get$_base(), f, $T._eval$1("0*"));
+    },
+    get$single: function(_) {
+      return J.get$single$ax(this.get$_base());
+    },
+    skip$1: function(_, n) {
+      return J.skip$1$ax(this.get$_base(), n);
+    },
+    take$1: function(_, n) {
+      return J.take$1$ax(this.get$_base(), n);
+    },
+    toList$1$growable: function(_, growable) {
+      return J.toList$1$growable$ax(this.get$_base(), growable);
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    toSet$0: function(_) {
+      return J.toSet$0$ax(this.get$_base());
+    },
+    where$1: function(_, test) {
+      return J.where$1$ax(this.get$_base(), test);
+    },
+    toString$0: function(_) {
+      return J.toString$0$(this.get$_base());
+    },
+    $isIterable: 1
+  };
+  M.DelegatingIterable.prototype = {
+    get$_base: function() {
+      return this._base;
+    }
+  };
+  M.DelegatingSet.prototype = {
+    add$1: function(_, value) {
+      return this._base.add$1(0, value);
+    },
+    addAll$1: function(_, elements) {
+      this._base.addAll$1(0, elements);
+    },
+    cast$1$0: function(_, $T) {
+      var t1 = this._base;
+      return P.Set_castFrom(t1, t1.get$_newSimilarSet(), H._instanceType(t1)._precomputed1, $T._eval$1("0*"));
+    },
+    toSet$0: function(_) {
+      return new M.DelegatingSet(this._base.toSet$0(0), H._instanceType(this)._eval$1("DelegatingSet<DelegatingSet.E*>"));
+    },
+    $isEfficientLengthIterable: 1,
+    $isSet: 1
+  };
+  M.MapKeySet.prototype = {
+    get$_base: function() {
+      var t1 = this._baseMap;
+      return t1.get$keys(t1);
+    },
+    cast$1$0: function(_, $T) {
+      var _this = this,
+        t1 = $T._eval$1("MapKeySet<0*>*");
+      if (t1._is(_this))
+        return t1._as(_this);
+      return P.Set_castFrom(_this, null, _this.$ti._eval$1("1*"), $T._eval$1("0*"));
+    },
+    contains$1: function(_, element) {
+      return this._baseMap.containsKey$1(element);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._baseMap;
+      return t1.get$isEmpty(t1);
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._baseMap;
+      return t1.get$isNotEmpty(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._baseMap;
+      return t1.get$length(t1);
+    },
+    toString$0: function(_) {
+      var t1 = this._baseMap;
+      return "{" + J.join$1$ax(t1.get$keys(t1), ", ") + "}";
+    },
+    $isEfficientLengthIterable: 1,
+    $isSet: 1
+  };
+  M._MapKeySet__DelegatingIterableBase_UnmodifiableSetMixin.prototype = {};
+  V.BufferModule.prototype = {};
+  V.BufferConstants.prototype = {};
+  V.Buffer.prototype = {};
+  F.ConsoleModule.prototype = {};
+  F.Console.prototype = {};
+  F.EventEmitter.prototype = {};
+  D.FS.prototype = {};
+  D.FSConstants.prototype = {};
+  D.FSWatcher.prototype = {};
+  D.ReadStream.prototype = {};
+  D.ReadStreamOptions.prototype = {};
+  D.WriteStream.prototype = {};
+  D.WriteStreamOptions.prototype = {};
+  D.Stats.prototype = {};
+  E.Promise.prototype = {};
+  E.Date.prototype = {};
+  E.JsError.prototype = {};
+  E.Atomics.prototype = {};
+  Y.Modules.prototype = {};
+  Y.Module1.prototype = {};
+  Y.Net.prototype = {};
+  Y.Socket.prototype = {};
+  Y.NetAddress.prototype = {};
+  Y.NetServer.prototype = {};
+  X.NodeJsError.prototype = {};
+  X.JsAssertionError.prototype = {};
+  X.JsRangeError.prototype = {};
+  X.JsReferenceError.prototype = {};
+  X.JsSyntaxError.prototype = {};
+  X.JsTypeError.prototype = {};
+  X.JsSystemError.prototype = {};
+  X.Process.prototype = {};
+  X.CPUUsage.prototype = {};
+  X.Release.prototype = {};
+  D.StreamModule.prototype = {};
+  D.Readable.prototype = {};
+  D.Writable.prototype = {};
+  D.Duplex.prototype = {};
+  D.Transform.prototype = {};
+  D.WritableOptions.prototype = {};
+  D.ReadableOptions.prototype = {};
+  L.Immediate.prototype = {};
+  L.Timeout.prototype = {};
+  N.TTY.prototype = {};
+  N.TTYReadStream.prototype = {};
+  N.TTYWriteStream.prototype = {};
+  M.Util.prototype = {};
+  M.futureToPromise_closure.prototype = {
+    call$2: function(resolve, reject) {
+      this.future.then$1$2$onError(0, resolve, reject, type$.dynamic);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 316
+  };
+  M.Context.prototype = {
+    absolute$7: function(part1, part2, part3, part4, part5, part6, part7) {
+      var t1;
+      M._validateArgList("absolute", H.setRuntimeTypeInfo([part1, part2, part3, part4, part5, part6, part7], type$.JSArray_legacy_String));
+      t1 = this.style;
+      t1 = t1.rootLength$1(part1) > 0 && !t1.isRootRelative$1(part1);
+      if (t1)
+        return part1;
+      t1 = this._context$_current;
+      return this.join$8(0, t1 == null ? D.current() : t1, part1, part2, part3, part4, part5, part6, part7);
+    },
+    absolute$1: function(part1) {
+      return this.absolute$7(part1, null, null, null, null, null, null);
+    },
+    dirname$1: function(path) {
+      var t1, t2,
+        parsed = X.ParsedPath_ParsedPath$parse(path, this.style);
+      parsed.removeTrailingSeparators$0();
+      t1 = parsed.parts;
+      t2 = t1.length;
+      if (t2 === 0) {
+        t1 = parsed.root;
+        return t1 == null ? "." : t1;
+      }
+      if (t2 === 1) {
+        t1 = parsed.root;
+        return t1 == null ? "." : t1;
+      }
+      C.JSArray_methods.removeLast$0(t1);
+      C.JSArray_methods.removeLast$0(parsed.separators);
+      parsed.removeTrailingSeparators$0();
+      return parsed.toString$0(0);
+    },
+    join$8: function(_, part1, part2, part3, part4, part5, part6, part7, part8) {
+      var parts = H.setRuntimeTypeInfo([part1, part2, part3, part4, part5, part6, part7, part8], type$.JSArray_legacy_String);
+      M._validateArgList("join", parts);
+      return this.joinAll$1(new H.WhereIterable(parts, new M.Context_join_closure(), type$.WhereIterable_legacy_String));
+    },
+    join$2: function($receiver, part1, part2) {
+      return this.join$8($receiver, part1, part2, null, null, null, null, null, null);
+    },
+    joinAll$1: function(parts) {
+      var t1, t2, t3, needsSeparator, isAbsoluteAndNotRootRelative, t4, t5, parsed, path;
+      for (t1 = parts.get$iterator(parts), t2 = new H.WhereIterator(t1, new M.Context_joinAll_closure()), t3 = this.style, needsSeparator = false, isAbsoluteAndNotRootRelative = false, t4 = ""; t2.moveNext$0();) {
+        t5 = t1.get$current(t1);
+        if (t3.isRootRelative$1(t5) && isAbsoluteAndNotRootRelative) {
+          parsed = X.ParsedPath_ParsedPath$parse(t5, t3);
+          path = t4.charCodeAt(0) == 0 ? t4 : t4;
+          t4 = C.JSString_methods.substring$2(path, 0, t3.rootLength$2$withDrive(path, true));
+          parsed.root = t4;
+          if (t3.needsSeparator$1(t4))
+            parsed.separators[0] = t3.get$separator();
+          t4 = parsed.toString$0(0);
+        } else if (t3.rootLength$1(t5) > 0) {
+          isAbsoluteAndNotRootRelative = !t3.isRootRelative$1(t5);
+          t4 = H.S(t5);
+        } else {
+          if (!(t5.length !== 0 && t3.containsSeparator$1(t5[0])))
+            if (needsSeparator)
+              t4 += t3.get$separator();
+          t4 += t5;
+        }
+        needsSeparator = t3.needsSeparator$1(t5);
+      }
+      return t4.charCodeAt(0) == 0 ? t4 : t4;
+    },
+    split$1: function(_, path) {
+      var parsed = X.ParsedPath_ParsedPath$parse(path, this.style),
+        t1 = parsed.parts,
+        t2 = H._arrayInstanceType(t1)._eval$1("WhereIterable<1>");
+      t2 = P.List_List$from(new H.WhereIterable(t1, new M.Context_split_closure(), t2), true, t2._eval$1("Iterable.E"));
+      parsed.parts = t2;
+      t1 = parsed.root;
+      if (t1 != null)
+        C.JSArray_methods.insert$2(t2, 0, t1);
+      return parsed.parts;
+    },
+    canonicalize$1: function(path) {
+      var t1, parsed;
+      path = this.absolute$1(path);
+      t1 = this.style;
+      if (t1 != $.$get$Style_windows() && !this._needsNormalization$1(path))
+        return path;
+      parsed = X.ParsedPath_ParsedPath$parse(path, t1);
+      parsed.normalize$1$canonicalize(true);
+      return parsed.toString$0(0);
+    },
+    normalize$1: function(path) {
+      var parsed;
+      if (!this._needsNormalization$1(path))
+        return path;
+      parsed = X.ParsedPath_ParsedPath$parse(path, this.style);
+      parsed.normalize$0();
+      return parsed.toString$0(0);
+    },
+    _needsNormalization$1: function(path) {
+      var t1, root, i, start, previous, t2, t3, previousPrevious, codeUnit, t4;
+      path.toString;
+      t1 = this.style;
+      root = t1.rootLength$1(path);
+      if (root !== 0) {
+        if (t1 === $.$get$Style_windows())
+          for (i = 0; i < root; ++i)
+            if (C.JSString_methods._codeUnitAt$1(path, i) === 47)
+              return true;
+        start = root;
+        previous = 47;
+      } else {
+        start = 0;
+        previous = null;
+      }
+      for (t2 = new H.CodeUnits(path)._string, t3 = t2.length, i = start, previousPrevious = null; i < t3; ++i, previousPrevious = previous, previous = codeUnit) {
+        codeUnit = C.JSString_methods.codeUnitAt$1(t2, i);
+        if (t1.isSeparator$1(codeUnit)) {
+          if (t1 === $.$get$Style_windows() && codeUnit === 47)
+            return true;
+          if (previous != null && t1.isSeparator$1(previous))
+            return true;
+          if (previous === 46)
+            t4 = previousPrevious == null || previousPrevious === 46 || t1.isSeparator$1(previousPrevious);
+          else
+            t4 = false;
+          if (t4)
+            return true;
+        }
+      }
+      if (previous == null)
+        return true;
+      if (t1.isSeparator$1(previous))
+        return true;
+      if (previous === 46)
+        t1 = previousPrevious == null || t1.isSeparator$1(previousPrevious) || previousPrevious === 46;
+      else
+        t1 = false;
+      if (t1)
+        return true;
+      return false;
+    },
+    relative$2$from: function(path, from) {
+      var fromParsed, pathParsed, t2, t3, _this = this,
+        _s26_ = 'Unable to find a path to "',
+        t1 = from == null;
+      if (t1 && _this.style.rootLength$1(path) <= 0)
+        return _this.normalize$1(path);
+      if (t1) {
+        t1 = _this._context$_current;
+        from = t1 == null ? D.current() : t1;
+      } else
+        from = _this.absolute$1(from);
+      t1 = _this.style;
+      if (t1.rootLength$1(from) <= 0 && t1.rootLength$1(path) > 0)
+        return _this.normalize$1(path);
+      if (t1.rootLength$1(path) <= 0 || t1.isRootRelative$1(path))
+        path = _this.absolute$1(path);
+      if (t1.rootLength$1(path) <= 0 && t1.rootLength$1(from) > 0)
+        throw H.wrapException(X.PathException$(_s26_ + H.S(path) + '" from "' + H.S(from) + '".'));
+      fromParsed = X.ParsedPath_ParsedPath$parse(from, t1);
+      fromParsed.normalize$0();
+      pathParsed = X.ParsedPath_ParsedPath$parse(path, t1);
+      pathParsed.normalize$0();
+      t2 = fromParsed.parts;
+      if (t2.length !== 0 && J.$eq$(t2[0], "."))
+        return pathParsed.toString$0(0);
+      t2 = fromParsed.root;
+      t3 = pathParsed.root;
+      if (t2 != t3)
+        t2 = t2 == null || t3 == null || !t1.pathsEqual$2(t2, t3);
+      else
+        t2 = false;
+      if (t2)
+        return pathParsed.toString$0(0);
+      while (true) {
+        t2 = fromParsed.parts;
+        if (t2.length !== 0) {
+          t3 = pathParsed.parts;
+          t2 = t3.length !== 0 && t1.pathsEqual$2(t2[0], t3[0]);
+        } else
+          t2 = false;
+        if (!t2)
+          break;
+        C.JSArray_methods.removeAt$1(fromParsed.parts, 0);
+        C.JSArray_methods.removeAt$1(fromParsed.separators, 1);
+        C.JSArray_methods.removeAt$1(pathParsed.parts, 0);
+        C.JSArray_methods.removeAt$1(pathParsed.separators, 1);
+      }
+      t2 = fromParsed.parts;
+      if (t2.length !== 0 && J.$eq$(t2[0], ".."))
+        throw H.wrapException(X.PathException$(_s26_ + H.S(path) + '" from "' + H.S(from) + '".'));
+      t2 = type$.legacy_String;
+      C.JSArray_methods.insertAll$2(pathParsed.parts, 0, P.List_List$filled(fromParsed.parts.length, "..", false, t2));
+      t3 = pathParsed.separators;
+      t3[0] = "";
+      C.JSArray_methods.insertAll$2(t3, 1, P.List_List$filled(fromParsed.parts.length, t1.get$separator(), false, t2));
+      t1 = pathParsed.parts;
+      t2 = t1.length;
+      if (t2 === 0)
+        return ".";
+      if (t2 > 1 && J.$eq$(C.JSArray_methods.get$last(t1), ".")) {
+        C.JSArray_methods.removeLast$0(pathParsed.parts);
+        t1 = pathParsed.separators;
+        C.JSArray_methods.removeLast$0(t1);
+        C.JSArray_methods.removeLast$0(t1);
+        C.JSArray_methods.add$1(t1, "");
+      }
+      pathParsed.root = "";
+      pathParsed.removeTrailingSeparators$0();
+      return pathParsed.toString$0(0);
+    },
+    relative$1: function(path) {
+      return this.relative$2$from(path, null);
+    },
+    _isWithinOrEquals$2: function($parent, child) {
+      var relative, t1, parentIsAbsolute, childIsAbsolute, childIsRootRelative, parentIsRootRelative, result, exception, _this = this;
+      $parent = $parent;
+      child = child;
+      t1 = _this.style;
+      parentIsAbsolute = t1.rootLength$1($parent) > 0;
+      childIsAbsolute = t1.rootLength$1(child) > 0;
+      if (parentIsAbsolute && !childIsAbsolute) {
+        child = _this.absolute$1(child);
+        if (t1.isRootRelative$1($parent))
+          $parent = _this.absolute$1($parent);
+      } else if (childIsAbsolute && !parentIsAbsolute) {
+        $parent = _this.absolute$1($parent);
+        if (t1.isRootRelative$1(child))
+          child = _this.absolute$1(child);
+      } else if (childIsAbsolute && parentIsAbsolute) {
+        childIsRootRelative = t1.isRootRelative$1(child);
+        parentIsRootRelative = t1.isRootRelative$1($parent);
+        if (childIsRootRelative && !parentIsRootRelative)
+          child = _this.absolute$1(child);
+        else if (parentIsRootRelative && !childIsRootRelative)
+          $parent = _this.absolute$1($parent);
+      }
+      result = _this._isWithinOrEqualsFast$2($parent, child);
+      if (result !== C._PathRelation_inconclusive)
+        return result;
+      relative = null;
+      try {
+        relative = _this.relative$2$from(child, $parent);
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof X.PathException)
+          return C._PathRelation_different;
+        else
+          throw exception;
+      }
+      if (t1.rootLength$1(relative) > 0)
+        return C._PathRelation_different;
+      if (J.$eq$(relative, "."))
+        return C._PathRelation_equal;
+      if (J.$eq$(relative, ".."))
+        return C._PathRelation_different;
+      return J.get$length$asx(relative) >= 3 && J.startsWith$1$s(relative, "..") && t1.isSeparator$1(J.codeUnitAt$1$s(relative, 2)) ? C._PathRelation_different : C._PathRelation_within;
+    },
+    _isWithinOrEqualsFast$2: function($parent, child) {
+      var t1, parentRootLength, childRootLength, t2, t3, i, childIndex, parentIndex, lastCodeUnit, lastParentSeparator, parentCodeUnit, childCodeUnit, parentIndex0, t4, direction, _this = this;
+      if ($parent === ".")
+        $parent = "";
+      t1 = _this.style;
+      parentRootLength = t1.rootLength$1($parent);
+      childRootLength = t1.rootLength$1(child);
+      if (parentRootLength !== childRootLength)
+        return C._PathRelation_different;
+      for (t2 = J.getInterceptor$s($parent), t3 = J.getInterceptor$s(child), i = 0; i < parentRootLength; ++i)
+        if (!t1.codeUnitsEqual$2(t2._codeUnitAt$1($parent, i), t3._codeUnitAt$1(child, i)))
+          return C._PathRelation_different;
+      t2 = $parent.length;
+      childIndex = childRootLength;
+      parentIndex = parentRootLength;
+      lastCodeUnit = 47;
+      lastParentSeparator = null;
+      while (true) {
+        if (!(parentIndex < t2 && childIndex < child.length))
+          break;
+        c$0: {
+          parentCodeUnit = C.JSString_methods.codeUnitAt$1($parent, parentIndex);
+          childCodeUnit = t3.codeUnitAt$1(child, childIndex);
+          if (t1.codeUnitsEqual$2(parentCodeUnit, childCodeUnit)) {
+            if (t1.isSeparator$1(parentCodeUnit))
+              lastParentSeparator = parentIndex;
+            ++parentIndex;
+            ++childIndex;
+            lastCodeUnit = parentCodeUnit;
+            break c$0;
+          }
+          if (t1.isSeparator$1(parentCodeUnit) && t1.isSeparator$1(lastCodeUnit)) {
+            parentIndex0 = parentIndex + 1;
+            lastParentSeparator = parentIndex;
+            parentIndex = parentIndex0;
+            break c$0;
+          } else if (t1.isSeparator$1(childCodeUnit) && t1.isSeparator$1(lastCodeUnit)) {
+            ++childIndex;
+            break c$0;
+          }
+          if (parentCodeUnit === 46 && t1.isSeparator$1(lastCodeUnit)) {
+            ++parentIndex;
+            if (parentIndex === t2)
+              break;
+            parentCodeUnit = C.JSString_methods.codeUnitAt$1($parent, parentIndex);
+            if (t1.isSeparator$1(parentCodeUnit)) {
+              parentIndex0 = parentIndex + 1;
+              lastParentSeparator = parentIndex;
+              parentIndex = parentIndex0;
+              break c$0;
+            }
+            if (parentCodeUnit === 46) {
+              ++parentIndex;
+              if (parentIndex === t2 || t1.isSeparator$1(C.JSString_methods.codeUnitAt$1($parent, parentIndex)))
+                return C._PathRelation_inconclusive;
+            }
+          }
+          if (childCodeUnit === 46 && t1.isSeparator$1(lastCodeUnit)) {
+            ++childIndex;
+            t4 = child.length;
+            if (childIndex === t4)
+              break;
+            childCodeUnit = C.JSString_methods.codeUnitAt$1(child, childIndex);
+            if (t1.isSeparator$1(childCodeUnit)) {
+              ++childIndex;
+              break c$0;
+            }
+            if (childCodeUnit === 46) {
+              ++childIndex;
+              if (childIndex === t4 || t1.isSeparator$1(C.JSString_methods.codeUnitAt$1(child, childIndex)))
+                return C._PathRelation_inconclusive;
+            }
+          }
+          if (_this._pathDirection$2(child, childIndex) !== C._PathDirection_988)
+            return C._PathRelation_inconclusive;
+          if (_this._pathDirection$2($parent, parentIndex) !== C._PathDirection_988)
+            return C._PathRelation_inconclusive;
+          return C._PathRelation_different;
+        }
+      }
+      if (childIndex === child.length) {
+        if (parentIndex === t2 || t1.isSeparator$1(C.JSString_methods.codeUnitAt$1($parent, parentIndex)))
+          lastParentSeparator = parentIndex;
+        else if (lastParentSeparator == null)
+          lastParentSeparator = Math.max(0, parentRootLength - 1);
+        direction = _this._pathDirection$2($parent, lastParentSeparator);
+        if (direction === C._PathDirection_8Gl)
+          return C._PathRelation_equal;
+        return direction === C._PathDirection_ZGD ? C._PathRelation_inconclusive : C._PathRelation_different;
+      }
+      direction = _this._pathDirection$2(child, childIndex);
+      if (direction === C._PathDirection_8Gl)
+        return C._PathRelation_equal;
+      if (direction === C._PathDirection_ZGD)
+        return C._PathRelation_inconclusive;
+      return t1.isSeparator$1(C.JSString_methods.codeUnitAt$1(child, childIndex)) || t1.isSeparator$1(lastCodeUnit) ? C._PathRelation_within : C._PathRelation_different;
+    },
+    _pathDirection$2: function(path, index) {
+      var t1, t2, i, depth, reachedRoot, i0, t3;
+      for (t1 = path.length, t2 = this.style, i = index, depth = 0, reachedRoot = false; i < t1;) {
+        while (true) {
+          if (!(i < t1 && t2.isSeparator$1(C.JSString_methods.codeUnitAt$1(path, i))))
+            break;
+          ++i;
+        }
+        if (i === t1)
+          break;
+        i0 = i;
+        while (true) {
+          if (!(i0 < t1 && !t2.isSeparator$1(C.JSString_methods.codeUnitAt$1(path, i0))))
+            break;
+          ++i0;
+        }
+        t3 = i0 - i;
+        if (!(t3 === 1 && C.JSString_methods.codeUnitAt$1(path, i) === 46))
+          if (t3 === 2 && C.JSString_methods.codeUnitAt$1(path, i) === 46 && C.JSString_methods.codeUnitAt$1(path, i + 1) === 46) {
+            --depth;
+            if (depth < 0)
+              break;
+            if (depth === 0)
+              reachedRoot = true;
+          } else
+            ++depth;
+        if (i0 === t1)
+          break;
+        i = i0 + 1;
+      }
+      if (depth < 0)
+        return C._PathDirection_ZGD;
+      if (depth === 0)
+        return C._PathDirection_8Gl;
+      if (reachedRoot)
+        return C._PathDirection_FIw;
+      return C._PathDirection_988;
+    },
+    hash$1: function(path) {
+      var result, parsed, _this = this;
+      path = _this.absolute$1(path);
+      result = _this._hashFast$1(path);
+      if (result != null)
+        return result;
+      parsed = X.ParsedPath_ParsedPath$parse(path, _this.style);
+      parsed.normalize$0();
+      return _this._hashFast$1(parsed.toString$0(0));
+    },
+    _hashFast$1: function(path) {
+      var t1, t2, hash, beginning, wasSeparator, i, codeUnit, t3, next;
+      for (t1 = path.length, t2 = this.style, hash = 4603, beginning = true, wasSeparator = true, i = 0; i < t1; ++i) {
+        codeUnit = t2.canonicalizeCodeUnit$1(C.JSString_methods._codeUnitAt$1(path, i));
+        if (t2.isSeparator$1(codeUnit)) {
+          wasSeparator = true;
+          continue;
+        }
+        if (codeUnit === 46 && wasSeparator) {
+          t3 = i + 1;
+          if (t3 === t1)
+            break;
+          next = C.JSString_methods._codeUnitAt$1(path, t3);
+          if (t2.isSeparator$1(next))
+            continue;
+          if (!beginning)
+            if (next === 46) {
+              t3 = i + 2;
+              t3 = t3 === t1 || t2.isSeparator$1(C.JSString_methods._codeUnitAt$1(path, t3));
+            } else
+              t3 = false;
+          else
+            t3 = false;
+          if (t3)
+            return null;
+        }
+        hash = ((hash & 67108863) * 33 ^ codeUnit) >>> 0;
+        beginning = false;
+        wasSeparator = false;
+      }
+      return hash;
+    },
+    withoutExtension$1: function(path) {
+      var i, t1,
+        parsed = X.ParsedPath_ParsedPath$parse(path, this.style);
+      for (i = parsed.parts.length - 1; i >= 0; --i) {
+        t1 = parsed.parts[i];
+        t1.toString;
+        if (J.get$length$asx(t1) !== 0) {
+          parsed.parts[i] = parsed._splitExtension$0()[0];
+          break;
+        }
+      }
+      return parsed.toString$0(0);
+    },
+    toUri$1: function(path) {
+      var t2,
+        t1 = this.style;
+      if (t1.rootLength$1(path) <= 0)
+        return t1.relativePathToUri$1(path);
+      else {
+        t2 = this._context$_current;
+        return t1.absolutePathToUri$1(this.join$2(0, t2 == null ? D.current() : t2, path));
+      }
+    },
+    prettyUri$1: function(uri) {
+      var path, rel, _this = this,
+        typedUri = M._parseUri(uri);
+      if (typedUri.get$scheme() === "file" && _this.style == $.$get$Style_url())
+        return typedUri.toString$0(0);
+      else if (typedUri.get$scheme() !== "file" && typedUri.get$scheme() !== "" && _this.style != $.$get$Style_url())
+        return typedUri.toString$0(0);
+      path = _this.normalize$1(_this.style.pathFromUri$1(M._parseUri(typedUri)));
+      rel = _this.relative$1(path);
+      return _this.split$1(0, rel).length > _this.split$1(0, path).length ? path : rel;
+    }
+  };
+  M.Context_join_closure.prototype = {
+    call$1: function(part) {
+      return part != null;
+    },
+    $signature: 6
+  };
+  M.Context_joinAll_closure.prototype = {
+    call$1: function(part) {
+      return part !== "";
+    },
+    $signature: 6
+  };
+  M.Context_split_closure.prototype = {
+    call$1: function(part) {
+      return part.length !== 0;
+    },
+    $signature: 6
+  };
+  M._validateArgList_closure.prototype = {
+    call$1: function(arg) {
+      return arg == null ? "null" : '"' + arg + '"';
+    },
+    $signature: 4
+  };
+  M._PathDirection.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  M._PathRelation.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  B.InternalStyle.prototype = {
+    getRoot$1: function(path) {
+      var $length = this.rootLength$1(path);
+      if ($length > 0)
+        return J.substring$2$s(path, 0, $length);
+      return this.isRootRelative$1(path) ? path[0] : null;
+    },
+    relativePathToUri$1: function(path) {
+      var segments = M.Context_Context(this).split$1(0, path);
+      if (this.isSeparator$1(J.codeUnitAt$1$s(path, path.length - 1)))
+        C.JSArray_methods.add$1(segments, "");
+      return P._Uri__Uri(null, null, segments, null);
+    },
+    codeUnitsEqual$2: function(codeUnit1, codeUnit2) {
+      return codeUnit1 === codeUnit2;
+    },
+    pathsEqual$2: function(path1, path2) {
+      return path1 == path2;
+    },
+    canonicalizeCodeUnit$1: function(codeUnit) {
+      return codeUnit;
+    },
+    canonicalizePart$1: function(part) {
+      return part;
+    }
+  };
+  X.ParsedPath.prototype = {
+    get$basename: function() {
+      var _this = this,
+        t1 = type$.legacy_String,
+        copy = new X.ParsedPath(_this.style, _this.root, _this.isRootRelative, P.List_List$from(_this.parts, true, t1), P.List_List$from(_this.separators, true, t1));
+      copy.removeTrailingSeparators$0();
+      t1 = copy.parts;
+      if (t1.length === 0) {
+        t1 = _this.root;
+        return t1 == null ? "" : t1;
+      }
+      return C.JSArray_methods.get$last(t1);
+    },
+    get$hasTrailingSeparator: function() {
+      var t1 = this.parts;
+      if (t1.length !== 0)
+        t1 = J.$eq$(C.JSArray_methods.get$last(t1), "") || !J.$eq$(C.JSArray_methods.get$last(this.separators), "");
+      else
+        t1 = false;
+      return t1;
+    },
+    removeTrailingSeparators$0: function() {
+      var t1, t2, _this = this;
+      while (true) {
+        t1 = _this.parts;
+        if (!(t1.length !== 0 && J.$eq$(C.JSArray_methods.get$last(t1), "")))
+          break;
+        C.JSArray_methods.removeLast$0(_this.parts);
+        C.JSArray_methods.removeLast$0(_this.separators);
+      }
+      t1 = _this.separators;
+      t2 = t1.length;
+      if (t2 !== 0)
+        t1[t2 - 1] = "";
+    },
+    normalize$1$canonicalize: function(canonicalize) {
+      var t1, t2, t3, leadingDoubles, _i, part, t4, newSeparators, _this = this,
+        newParts = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      for (t1 = _this.parts, t2 = t1.length, t3 = _this.style, leadingDoubles = 0, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        part = t1[_i];
+        t4 = J.getInterceptor$(part);
+        if (!(t4.$eq(part, ".") || t4.$eq(part, "")))
+          if (t4.$eq(part, ".."))
+            if (newParts.length !== 0)
+              newParts.pop();
+            else
+              ++leadingDoubles;
+          else
+            newParts.push(canonicalize ? t3.canonicalizePart$1(part) : part);
+      }
+      if (_this.root == null)
+        C.JSArray_methods.insertAll$2(newParts, 0, P.List_List$filled(leadingDoubles, "..", false, type$.legacy_String));
+      if (newParts.length === 0 && _this.root == null)
+        newParts.push(".");
+      newSeparators = P.List_List$generate(newParts.length, new X.ParsedPath_normalize_closure(_this), true, type$.legacy_String);
+      t1 = _this.root;
+      C.JSArray_methods.insert$2(newSeparators, 0, t1 != null && newParts.length !== 0 && t3.needsSeparator$1(t1) ? t3.get$separator() : "");
+      _this.parts = newParts;
+      _this.separators = newSeparators;
+      t1 = _this.root;
+      if (t1 != null && t3 === $.$get$Style_windows()) {
+        if (canonicalize)
+          t1 = _this.root = t1.toLowerCase();
+        t1.toString;
+        _this.root = H.stringReplaceAllUnchecked(t1, "/", "\\");
+      }
+      _this.removeTrailingSeparators$0();
+    },
+    normalize$0: function() {
+      return this.normalize$1$canonicalize(false);
+    },
+    toString$0: function(_) {
+      var i, _this = this,
+        t1 = _this.root;
+      t1 = t1 != null ? t1 : "";
+      for (i = 0; i < _this.parts.length; ++i)
+        t1 = t1 + H.S(_this.separators[i]) + H.S(_this.parts[i]);
+      t1 += H.S(C.JSArray_methods.get$last(_this.separators));
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _kthLastIndexOf$3: function(path, character, k) {
+      var index, count, leftMostIndexedCharacter;
+      for (index = path.length - 1, count = 0, leftMostIndexedCharacter = 0; index >= 0; --index)
+        if (path[index] === character) {
+          ++count;
+          if (count === k)
+            return index;
+          leftMostIndexedCharacter = index;
+        }
+      return leftMostIndexedCharacter;
+    },
+    _splitExtension$1: function(level) {
+      var file, lastDot;
+      if (level <= 0)
+        throw H.wrapException(P.RangeError$value(level, "level", "level's value must be greater than 0"));
+      file = C.JSArray_methods.lastWhere$2$orElse(this.parts, new X.ParsedPath__splitExtension_closure(), new X.ParsedPath__splitExtension_closure0());
+      if (file == null)
+        return H.setRuntimeTypeInfo(["", ""], type$.JSArray_legacy_String);
+      if (file === "..")
+        return H.setRuntimeTypeInfo(["..", ""], type$.JSArray_legacy_String);
+      lastDot = this._kthLastIndexOf$3(file, ".", level);
+      if (lastDot <= 0)
+        return H.setRuntimeTypeInfo([file, ""], type$.JSArray_legacy_String);
+      return H.setRuntimeTypeInfo([C.JSString_methods.substring$2(file, 0, lastDot), C.JSString_methods.substring$1(file, lastDot)], type$.JSArray_legacy_String);
+    },
+    _splitExtension$0: function() {
+      return this._splitExtension$1(1);
+    }
+  };
+  X.ParsedPath_normalize_closure.prototype = {
+    call$1: function(_) {
+      return this.$this.style.get$separator();
+    },
+    $signature: 84
+  };
+  X.ParsedPath__splitExtension_closure.prototype = {
+    call$1: function(p) {
+      return p !== "";
+    },
+    $signature: 6
+  };
+  X.ParsedPath__splitExtension_closure0.prototype = {
+    call$0: function() {
+      return null;
+    },
+    $signature: 0
+  };
+  X.PathException.prototype = {
+    toString$0: function(_) {
+      return "PathException: " + this.message;
+    },
+    $isException: 1,
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  K.PathMap.prototype = {};
+  K.PathMap__create_closure.prototype = {
+    call$2: function(path1, path2) {
+      if (path1 == null)
+        return path2 == null;
+      if (path2 == null)
+        return false;
+      return this._box_0.context._isWithinOrEquals$2(path1, path2) === C._PathRelation_equal;
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 372
+  };
+  K.PathMap__create_closure0.prototype = {
+    call$1: function(path) {
+      return path == null ? 0 : this._box_0.context.hash$1(path);
+    },
+    $signature: 381
+  };
+  K.PathMap__create_closure1.prototype = {
+    call$1: function(path) {
+      return typeof path == "string" || path == null;
+    },
+    $signature: 151
+  };
+  O.Style.prototype = {
+    toString$0: function(_) {
+      return this.get$name(this);
+    }
+  };
+  E.PosixStyle.prototype = {
+    containsSeparator$1: function(path) {
+      return C.JSString_methods.contains$1(path, "/");
+    },
+    isSeparator$1: function(codeUnit) {
+      return codeUnit === 47;
+    },
+    needsSeparator$1: function(path) {
+      var t1 = path.length;
+      return t1 !== 0 && C.JSString_methods.codeUnitAt$1(path, t1 - 1) !== 47;
+    },
+    rootLength$2$withDrive: function(path, withDrive) {
+      if (path.length !== 0 && C.JSString_methods._codeUnitAt$1(path, 0) === 47)
+        return 1;
+      return 0;
+    },
+    rootLength$1: function(path) {
+      return this.rootLength$2$withDrive(path, false);
+    },
+    isRootRelative$1: function(path) {
+      return false;
+    },
+    pathFromUri$1: function(uri) {
+      var t1;
+      if (uri.get$scheme() === "" || uri.get$scheme() === "file") {
+        t1 = uri.get$path(uri);
+        return P._Uri__uriDecode(t1, 0, t1.length, C.C_Utf8Codec, false);
+      }
+      throw H.wrapException(P.ArgumentError$("Uri " + uri.toString$0(0) + " must have scheme 'file:'."));
+    },
+    absolutePathToUri$1: function(path) {
+      var parsed = X.ParsedPath_ParsedPath$parse(path, this),
+        t1 = parsed.parts;
+      if (t1.length === 0)
+        C.JSArray_methods.addAll$1(t1, H.setRuntimeTypeInfo(["", ""], type$.JSArray_legacy_String));
+      else if (parsed.get$hasTrailingSeparator())
+        C.JSArray_methods.add$1(parsed.parts, "");
+      return P._Uri__Uri(null, null, parsed.parts, "file");
+    },
+    get$name: function() {
+      return "posix";
+    },
+    get$separator: function() {
+      return "/";
+    }
+  };
+  F.UrlStyle.prototype = {
+    containsSeparator$1: function(path) {
+      return C.JSString_methods.contains$1(path, "/");
+    },
+    isSeparator$1: function(codeUnit) {
+      return codeUnit === 47;
+    },
+    needsSeparator$1: function(path) {
+      var t1 = path.length;
+      if (t1 === 0)
+        return false;
+      if (C.JSString_methods.codeUnitAt$1(path, t1 - 1) !== 47)
+        return true;
+      return C.JSString_methods.endsWith$1(path, "://") && this.rootLength$1(path) === t1;
+    },
+    rootLength$2$withDrive: function(path, withDrive) {
+      var i, codeUnit, index, t2,
+        t1 = path.length;
+      if (t1 === 0)
+        return 0;
+      if (C.JSString_methods._codeUnitAt$1(path, 0) === 47)
+        return 1;
+      for (i = 0; i < t1; ++i) {
+        codeUnit = C.JSString_methods._codeUnitAt$1(path, i);
+        if (codeUnit === 47)
+          return 0;
+        if (codeUnit === 58) {
+          if (i === 0)
+            return 0;
+          index = C.JSString_methods.indexOf$2(path, "/", C.JSString_methods.startsWith$2(path, "//", i + 1) ? i + 3 : i);
+          if (index <= 0)
+            return t1;
+          if (!withDrive || t1 < index + 3)
+            return index;
+          if (!C.JSString_methods.startsWith$1(path, "file://"))
+            return index;
+          if (!B.isDriveLetter(path, index + 1))
+            return index;
+          t2 = index + 3;
+          return t1 === t2 ? t2 : index + 4;
+        }
+      }
+      return 0;
+    },
+    rootLength$1: function(path) {
+      return this.rootLength$2$withDrive(path, false);
+    },
+    isRootRelative$1: function(path) {
+      return path.length !== 0 && C.JSString_methods._codeUnitAt$1(path, 0) === 47;
+    },
+    pathFromUri$1: function(uri) {
+      return uri.toString$0(0);
+    },
+    relativePathToUri$1: function(path) {
+      return P.Uri_parse(path);
+    },
+    absolutePathToUri$1: function(path) {
+      return P.Uri_parse(path);
+    },
+    get$name: function() {
+      return "url";
+    },
+    get$separator: function() {
+      return "/";
+    }
+  };
+  L.WindowsStyle.prototype = {
+    containsSeparator$1: function(path) {
+      return C.JSString_methods.contains$1(path, "/");
+    },
+    isSeparator$1: function(codeUnit) {
+      return codeUnit === 47 || codeUnit === 92;
+    },
+    needsSeparator$1: function(path) {
+      var t1 = path.length;
+      if (t1 === 0)
+        return false;
+      t1 = C.JSString_methods.codeUnitAt$1(path, t1 - 1);
+      return !(t1 === 47 || t1 === 92);
+    },
+    rootLength$2$withDrive: function(path, withDrive) {
+      var t2, index,
+        t1 = path.length;
+      if (t1 === 0)
+        return 0;
+      t2 = C.JSString_methods._codeUnitAt$1(path, 0);
+      if (t2 === 47)
+        return 1;
+      if (t2 === 92) {
+        if (t1 < 2 || C.JSString_methods._codeUnitAt$1(path, 1) !== 92)
+          return 1;
+        index = C.JSString_methods.indexOf$2(path, "\\", 2);
+        if (index > 0) {
+          index = C.JSString_methods.indexOf$2(path, "\\", index + 1);
+          if (index > 0)
+            return index;
+        }
+        return t1;
+      }
+      if (t1 < 3)
+        return 0;
+      if (!B.isAlphabetic(t2))
+        return 0;
+      if (C.JSString_methods._codeUnitAt$1(path, 1) !== 58)
+        return 0;
+      t1 = C.JSString_methods._codeUnitAt$1(path, 2);
+      if (!(t1 === 47 || t1 === 92))
+        return 0;
+      return 3;
+    },
+    rootLength$1: function(path) {
+      return this.rootLength$2$withDrive(path, false);
+    },
+    isRootRelative$1: function(path) {
+      return this.rootLength$1(path) === 1;
+    },
+    pathFromUri$1: function(uri) {
+      var path, t1;
+      if (uri.get$scheme() !== "" && uri.get$scheme() !== "file")
+        throw H.wrapException(P.ArgumentError$("Uri " + uri.toString$0(0) + " must have scheme 'file:'."));
+      path = uri.get$path(uri);
+      if (uri.get$host() === "") {
+        if (path.length >= 3 && C.JSString_methods.startsWith$1(path, "/") && B.isDriveLetter(path, 1))
+          path = C.JSString_methods.replaceFirst$2(path, "/", "");
+      } else
+        path = "\\\\" + uri.get$host() + path;
+      t1 = H.stringReplaceAllUnchecked(path, "/", "\\");
+      return P._Uri__uriDecode(t1, 0, t1.length, C.C_Utf8Codec, false);
+    },
+    absolutePathToUri$1: function(path) {
+      var rootParts, t2,
+        parsed = X.ParsedPath_ParsedPath$parse(path, this),
+        t1 = parsed.root;
+      if (J.startsWith$1$s(t1, "\\\\")) {
+        rootParts = new H.WhereIterable(H.setRuntimeTypeInfo(t1.split("\\"), type$.JSArray_String), new L.WindowsStyle_absolutePathToUri_closure(), type$.WhereIterable_String);
+        C.JSArray_methods.insert$2(parsed.parts, 0, rootParts.get$last(rootParts));
+        if (parsed.get$hasTrailingSeparator())
+          C.JSArray_methods.add$1(parsed.parts, "");
+        return P._Uri__Uri(rootParts.get$first(rootParts), null, parsed.parts, "file");
+      } else {
+        if (parsed.parts.length === 0 || parsed.get$hasTrailingSeparator())
+          C.JSArray_methods.add$1(parsed.parts, "");
+        t1 = parsed.parts;
+        t2 = parsed.root;
+        t2.toString;
+        t2 = H.stringReplaceAllUnchecked(t2, "/", "");
+        C.JSArray_methods.insert$2(t1, 0, H.stringReplaceAllUnchecked(t2, "\\", ""));
+        return P._Uri__Uri(null, null, parsed.parts, "file");
+      }
+    },
+    codeUnitsEqual$2: function(codeUnit1, codeUnit2) {
+      var upperCase1;
+      if (codeUnit1 === codeUnit2)
+        return true;
+      if (codeUnit1 === 47)
+        return codeUnit2 === 92;
+      if (codeUnit1 === 92)
+        return codeUnit2 === 47;
+      if ((codeUnit1 ^ codeUnit2) !== 32)
+        return false;
+      upperCase1 = codeUnit1 | 32;
+      return upperCase1 >= 97 && upperCase1 <= 122;
+    },
+    pathsEqual$2: function(path1, path2) {
+      var t1, t2, i;
+      if (path1 == path2)
+        return true;
+      t1 = path1.length;
+      if (t1 !== path2.length)
+        return false;
+      for (t2 = J.getInterceptor$s(path2), i = 0; i < t1; ++i)
+        if (!this.codeUnitsEqual$2(C.JSString_methods._codeUnitAt$1(path1, i), t2._codeUnitAt$1(path2, i)))
+          return false;
+      return true;
+    },
+    canonicalizeCodeUnit$1: function(codeUnit) {
+      if (codeUnit === 47)
+        return 92;
+      if (codeUnit < 65)
+        return codeUnit;
+      if (codeUnit > 90)
+        return codeUnit;
+      return codeUnit | 32;
+    },
+    canonicalizePart$1: function(part) {
+      return part.toLowerCase();
+    },
+    get$name: function() {
+      return "windows";
+    },
+    get$separator: function() {
+      return "\\";
+    }
+  };
+  L.WindowsStyle_absolutePathToUri_closure.prototype = {
+    call$1: function(part) {
+      return part !== "";
+    },
+    $signature: 6
+  };
+  F.CssMediaQuery.prototype = {
+    merge$1: function(other) {
+      var _i, t8, negativeFeatures, features, type, modifier, fewerFeatures, fewerFeatures0, moreFeatures, _this = this, _null = null, _s3_ = "all",
+        t1 = _this.modifier,
+        ourModifier = t1 == null ? _null : t1.toLowerCase(),
+        t2 = _this.type,
+        t3 = t2 == null,
+        ourType = t3 ? _null : t2.toLowerCase(),
+        t4 = other.modifier,
+        theirModifier = t4 == null ? _null : t4.toLowerCase(),
+        t5 = other.type,
+        t6 = t5 == null,
+        theirType = t6 ? _null : t5.toLowerCase(),
+        t7 = ourType == null;
+      if (t7 && theirType == null) {
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+        for (t2 = _this.features, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t1.push(t2[_i]);
+        for (t2 = other.features, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t1.push(t2[_i]);
+        return new F.MediaQuerySuccessfulMergeResult(new F.CssMediaQuery(_null, _null, P.List_List$unmodifiable(t1, type$.legacy_String)));
+      }
+      t8 = ourModifier === "not";
+      if (t8 !== (theirModifier === "not")) {
+        if (ourType == theirType) {
+          negativeFeatures = t8 ? _this.features : other.features;
+          if (C.JSArray_methods.every$1(negativeFeatures, C.JSArray_methods.get$contains(t8 ? other.features : _this.features)))
+            return C._SingletonCssMediaQueryMergeResult_empty;
+          else
+            return C._SingletonCssMediaQueryMergeResult_unrepresentable;
+        } else if (t3 || B.equalsIgnoreCase(t2, _s3_) || t6 || B.equalsIgnoreCase(t5, _s3_))
+          return C._SingletonCssMediaQueryMergeResult_unrepresentable;
+        if (t8) {
+          features = other.features;
+          type = theirType;
+          modifier = theirModifier;
+        } else {
+          features = _this.features;
+          type = ourType;
+          modifier = ourModifier;
+        }
+      } else if (t8) {
+        if (ourType != theirType)
+          return C._SingletonCssMediaQueryMergeResult_unrepresentable;
+        fewerFeatures = _this.features;
+        fewerFeatures0 = other.features;
+        t3 = fewerFeatures.length > fewerFeatures0.length;
+        moreFeatures = t3 ? fewerFeatures : fewerFeatures0;
+        if (t3)
+          fewerFeatures = fewerFeatures0;
+        if (!C.JSArray_methods.every$1(fewerFeatures, C.JSArray_methods.get$contains(moreFeatures)))
+          return C._SingletonCssMediaQueryMergeResult_unrepresentable;
+        features = moreFeatures;
+        type = ourType;
+        modifier = ourModifier;
+      } else if (t3 || B.equalsIgnoreCase(t2, _s3_)) {
+        type = (t6 || B.equalsIgnoreCase(t5, _s3_)) && t7 ? _null : theirType;
+        t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+        for (t6 = _this.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+          t3.push(t6[_i]);
+        for (t6 = other.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+          t3.push(t6[_i]);
+        features = t3;
+        modifier = theirModifier;
+      } else {
+        if (t6 || B.equalsIgnoreCase(t5, _s3_)) {
+          t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+          for (t6 = _this.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+            t3.push(t6[_i]);
+          for (t6 = other.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+            t3.push(t6[_i]);
+          features = t3;
+          modifier = ourModifier;
+        } else {
+          if (ourType != theirType)
+            return C._SingletonCssMediaQueryMergeResult_empty;
+          else {
+            modifier = ourModifier == null ? theirModifier : ourModifier;
+            t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+            for (t6 = _this.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+              t3.push(t6[_i]);
+            for (t6 = other.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+              t3.push(t6[_i]);
+          }
+          features = t3;
+        }
+        type = ourType;
+      }
+      t2 = type == ourType ? t2 : t5;
+      t1 = modifier == ourModifier ? t1 : t4;
+      t3 = P.List_List$unmodifiable(features, type$.legacy_String);
+      return new F.MediaQuerySuccessfulMergeResult(new F.CssMediaQuery(t1, t2, t3));
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof F.CssMediaQuery && other.modifier == this.modifier && other.type == this.type && C.C_ListEquality.equals$2(0, other.features, this.features);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.modifier) ^ J.get$hashCode$(this.type) ^ C.C_ListEquality.hash$1(this.features);
+    },
+    toString$0: function(_) {
+      var t2, _this = this,
+        t1 = _this.modifier;
+      t1 = t1 != null ? t1 + " " : "";
+      t2 = _this.type;
+      if (t2 != null) {
+        t1 += t2;
+        if (_this.features.length !== 0)
+          t1 += " and ";
+      }
+      t1 += C.JSArray_methods.join$1(_this.features, " and ");
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  F._SingletonCssMediaQueryMergeResult.prototype = {
+    toString$0: function(_) {
+      return this._media_query$_name;
+    }
+  };
+  F.MediaQuerySuccessfulMergeResult.prototype = {};
+  U.ModifiableCssAtRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssAtRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      var _this = this;
+      return U.ModifiableCssAtRule$(_this.name, _this.span, _this.isChildless, _this.value);
+    },
+    addChild$1: function(child) {
+      this.super$ModifiableCssParentNode$addChild(child);
+    },
+    $isCssAtRule: 1,
+    get$isChildless: function() {
+      return this.isChildless;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  R.ModifiableCssComment.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssComment$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    $isCssComment: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.ModifiableCssDeclaration.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssDeclaration$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return H.S(this.name) + ": " + this.value.toString$0(0) + ";";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.ModifiableCssImport.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssImport$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    $isCssImport: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  U.ModifiableCssKeyframeBlock.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssKeyframeBlock$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return U.ModifiableCssKeyframeBlock$(this.selector, this.span);
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  G.ModifiableCssMediaRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssMediaRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return G.ModifiableCssMediaRule$(this.queries, this.span);
+    },
+    $isCssMediaRule: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.ModifiableCssNode.prototype = {
+    get$hasFollowingSibling: function() {
+      var siblings, i, t2,
+        t1 = this._parent;
+      if (t1 == null)
+        return false;
+      siblings = t1.children;
+      for (i = this._indexInParent + 1, t1 = siblings._collection$_source, t2 = J.getInterceptor$asx(t1); i < t2.get$length(t1); ++i)
+        if (!this._node0$_isInvisible$1(t2.elementAt$1(t1, i)))
+          return true;
+      return false;
+    },
+    _node0$_isInvisible$1: function(node) {
+      if (type$.legacy_CssParentNode._is(node)) {
+        if (type$.legacy_CssAtRule._is(node))
+          return false;
+        if (type$.legacy_CssStyleRule._is(node) && node.selector.value.get$isInvisible())
+          return true;
+        return J.every$1$ax(node.get$children(node), this.get$_node0$_isInvisible());
+      } else
+        return false;
+    },
+    get$isGroupEnd: function() {
+      return this.isGroupEnd;
+    }
+  };
+  B.ModifiableCssParentNode.prototype = {
+    get$isChildless: function() {
+      return false;
+    },
+    addChild$1: function(child) {
+      var t1;
+      child._parent = this;
+      t1 = this._children;
+      child._indexInParent = t1.length;
+      t1.push(child);
+    },
+    $isCssParentNode: 1,
+    get$children: function(receiver) {
+      return this.children;
+    }
+  };
+  X.ModifiableCssStyleRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssStyleRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return X.ModifiableCssStyleRule$(this.selector, this.span, this.originalSelector);
+    },
+    $isCssStyleRule: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.ModifiableCssStylesheet.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssStylesheet$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return V.ModifiableCssStylesheet$(this.span);
+    },
+    $isCssStylesheet: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.ModifiableCssSupportsRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssSupportsRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return B.ModifiableCssSupportsRule$(this.condition, this.span);
+    },
+    $isCssSupportsRule: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.ModifiableCssValue.prototype = {
+    toString$0: function(_) {
+      return J.toString$0$(this.value);
+    },
+    $isCssValue: 1,
+    $isAstNode: 1,
+    get$value: function(receiver) {
+      return this.value;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.CssNode.prototype = {
+    toString$0: function(_) {
+      return N.serialize(this, true, null, true, null, false, null, true).css;
+    }
+  };
+  B.CssParentNode.prototype = {};
+  V.CssStylesheet.prototype = {
+    get$isGroupEnd: function() {
+      return false;
+    },
+    get$isChildless: function() {
+      return false;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitCssStylesheet$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    get$children: function(receiver) {
+      return this.children;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.CssValue.prototype = {
+    toString$0: function(_) {
+      return J.toString$0$(this.value);
+    },
+    $isAstNode: 1,
+    get$value: function(receiver) {
+      return this.value;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.AstNode.prototype = {};
+  B._FakeAstNode.prototype = {
+    get$span: function() {
+      return this._callback.call$0();
+    },
+    $isAstNode: 1
+  };
+  Z.Argument.prototype = {
+    toString$0: function(_) {
+      var t1 = this.defaultValue,
+        t2 = this.name;
+      return t1 == null ? t2 : t2 + ": " + t1.toString$0(0);
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.ArgumentDeclaration.prototype = {
+    get$spanWithName: function() {
+      var t3, t4,
+        t1 = this.span,
+        t2 = t1.file,
+        text = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t2._decodedChars, 0, null), 0, null),
+        i = Y.FileLocation$_(t2, t1._file$_start).offset - 1;
+      while (true) {
+        if (i > 0) {
+          t3 = C.JSString_methods.codeUnitAt$1(text, i);
+          t3 = t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        --i;
+      }
+      t3 = C.JSString_methods.codeUnitAt$1(text, i);
+      if (!(t3 === 95 || T.isAlphabetic0(t3) || t3 >= 128 || T.isDigit(t3) || t3 === 45))
+        return t1;
+      --i;
+      while (true) {
+        if (i >= 0) {
+          t3 = C.JSString_methods.codeUnitAt$1(text, i);
+          if (t3 !== 95) {
+            if (!(t3 >= 97 && t3 <= 122))
+              t4 = t3 >= 65 && t3 <= 90;
+            else
+              t4 = true;
+            t4 = t4 || t3 >= 128;
+          } else
+            t4 = true;
+          if (!t4) {
+            t4 = t3 >= 48 && t3 <= 57;
+            t3 = t4 || t3 === 45;
+          } else
+            t3 = true;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        --i;
+      }
+      t3 = i + 1;
+      t4 = C.JSString_methods.codeUnitAt$1(text, t3);
+      if (!(t4 === 95 || T.isAlphabetic0(t4) || t4 >= 128))
+        return t1;
+      return B.SpanExtensions_trim(t2.span$2(t3, Y.FileLocation$_(t2, t1._end).offset));
+    },
+    get$originalRestArgument: function() {
+      var t1, text;
+      if (this.restArgument == null)
+        return null;
+      t1 = this.span;
+      text = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1.file._decodedChars, t1._file$_start, t1._end), 0, null);
+      return C.JSString_methods.substring$2(C.JSString_methods.substring$1(text, C.JSString_methods.lastIndexOf$1(text, "$")), 0, C.JSString_methods.indexOf$1(text, "."));
+    },
+    verify$2: function(positional, names) {
+      var t1, t2, t3, namedUsed, i, argument, t4, unknownNames, _this = this,
+        _s10_ = "invocation",
+        _s8_ = "argument";
+      for (t1 = _this.$arguments, t2 = t1.length, t3 = names._baseMap, namedUsed = 0, i = 0; i < t2; ++i) {
+        argument = t1[i];
+        if (i < positional) {
+          t4 = argument.name;
+          if (t3.containsKey$1(t4))
+            throw H.wrapException(E.SassScriptException$("Argument " + H.S(_this._originalArgumentName$1(t4)) + string$.x20was_p));
+        } else {
+          t4 = argument.name;
+          if (t3.containsKey$1(t4))
+            ++namedUsed;
+          else if (argument.defaultValue == null)
+            throw H.wrapException(E.MultiSpanSassScriptException$("Missing argument " + H.S(_this._originalArgumentName$1(t4)) + ".", _s10_, P.LinkedHashMap_LinkedHashMap$_literal([_this.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String)));
+        }
+      }
+      if (_this.restArgument != null)
+        return;
+      if (positional > t2) {
+        t1 = "Only " + t2 + " ";
+        throw H.wrapException(E.MultiSpanSassScriptException$(t1 + (names.get$isEmpty(names) ? "" : "positional ") + B.pluralize(_s8_, t2, null) + " allowed, but " + positional + " " + B.pluralize("was", positional, "were") + " passed.", _s10_, P.LinkedHashMap_LinkedHashMap$_literal([_this.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+      if (namedUsed < t3.get$length(t3)) {
+        t2 = type$.legacy_String;
+        unknownNames = P.LinkedHashSet_LinkedHashSet$of(names, t2);
+        unknownNames.removeAll$1(new H.MappedListIterable(t1, new B.ArgumentDeclaration_verify_closure(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Object*>")));
+        throw H.wrapException(E.MultiSpanSassScriptException$("No " + B.pluralize(_s8_, unknownNames._collection$_length, null) + " named " + H.S(B.toSentence(unknownNames.map$1$1(0, new B.ArgumentDeclaration_verify_closure0(), type$.legacy_Object), "or")) + ".", _s10_, P.LinkedHashMap_LinkedHashMap$_literal([_this.get$spanWithName(), "declaration"], type$.legacy_FileSpan, t2)));
+      }
+    },
+    _originalArgumentName$1: function($name) {
+      var t1, t2, _i, argument, t3, t4, text, end;
+      if ($name === this.restArgument)
+        return this.get$originalRestArgument();
+      for (t1 = this.$arguments, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        argument = t1[_i];
+        if (argument.name === $name) {
+          t1 = argument.defaultValue;
+          t2 = argument.span;
+          t3 = t2.file;
+          t4 = t2._file$_start;
+          t2 = t2._end;
+          if (t1 == null) {
+            t1 = t3._decodedChars;
+            t1 = P.String_String$fromCharCodes(new Uint32Array(t1.subarray(t4, H._checkValidRange(t4, t2, t1.length))), 0, null);
+          } else {
+            t1 = t3._decodedChars;
+            text = P.String_String$fromCharCodes(new Uint32Array(t1.subarray(t4, H._checkValidRange(t4, t2, t1.length))), 0, null);
+            t1 = C.JSString_methods.substring$2(text, 0, C.JSString_methods.indexOf$1(text, ":"));
+            end = B._lastNonWhitespace(t1, false);
+            t1 = end == null ? "" : C.JSString_methods.substring$2(t1, 0, end + 1);
+          }
+          return t1;
+        }
+      }
+      throw H.wrapException(P.ArgumentError$(string$.This_d + $name + '".'));
+    },
+    matches$2: function(positional, names) {
+      var t1, t2, t3, namedUsed, i, argument;
+      for (t1 = this.$arguments, t2 = t1.length, t3 = names._baseMap, namedUsed = 0, i = 0; i < t2; ++i) {
+        argument = t1[i];
+        if (i < positional) {
+          if (t3.containsKey$1(argument.name))
+            return false;
+        } else if (t3.containsKey$1(argument.name))
+          ++namedUsed;
+        else if (argument.defaultValue == null)
+          return false;
+      }
+      if (this.restArgument != null)
+        return true;
+      if (positional > t2)
+        return false;
+      if (namedUsed < t3.get$length(t3))
+        return false;
+      return true;
+    },
+    toString$0: function(_) {
+      var t2, t3, _i,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      for (t2 = this.$arguments, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t1.push(J.toString$0$(t2[_i]));
+      t2 = this.restArgument;
+      if (t2 != null)
+        t1.push(t2 + "...");
+      return C.JSArray_methods.join$1(t1, ", ");
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.ArgumentDeclaration_verify_closure.prototype = {
+    call$1: function(argument) {
+      return argument.name;
+    },
+    $signature: 478
+  };
+  B.ArgumentDeclaration_verify_closure0.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  X.ArgumentInvocation.prototype = {
+    get$isEmpty: function(_) {
+      var t1;
+      if (this.positional.length === 0) {
+        t1 = this.named;
+        t1 = t1.get$isEmpty(t1) && this.rest == null;
+      } else
+        t1 = false;
+      return t1;
+    },
+    toString$0: function(_) {
+      var t2, t3, _i, t4, _this = this,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
+      for (t2 = _this.positional, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t1.push(t2[_i]);
+      for (t2 = _this.named, t3 = J.get$iterator$ax(t2.get$keys(t2)); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t1.push(H.S(t4) + ": " + H.S(t2.$index(0, t4)));
+      }
+      t2 = _this.rest;
+      if (t2 != null)
+        t1.push(t2.toString$0(0) + "...");
+      t2 = _this.keywordRest;
+      if (t2 != null)
+        t1.push(t2.toString$0(0) + "...");
+      return "(" + C.JSArray_methods.join$1(t1, ", ") + ")";
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.AtRootQuery.prototype = {
+    excludes$1: function(node) {
+      var t1, _this = this;
+      if (_this._all)
+        return !_this.include;
+      if (type$.legacy_CssStyleRule._is(node))
+        return _this._at_root_query$_rule !== _this.include;
+      if (type$.legacy_CssMediaRule._is(node))
+        return _this.excludesName$1("media");
+      if (type$.legacy_CssSupportsRule._is(node))
+        return _this.excludesName$1("supports");
+      if (type$.legacy_CssAtRule._is(node)) {
+        t1 = node.name;
+        return _this.excludesName$1(t1.get$value(t1).toLowerCase());
+      }
+      return false;
+    },
+    excludesName$1: function($name) {
+      var t1 = this._all || this.names.contains$1(0, $name);
+      return t1 !== this.include;
+    }
+  };
+  Z.ConfiguredVariable.prototype = {
+    toString$0: function(_) {
+      var t1 = "$" + this.name + ": " + H.S(this.expression);
+      return t1 + (this.isGuarded ? " !default" : "");
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.BinaryOperationExpression.prototype = {
+    get$span: function() {
+      var right,
+        left = this.left;
+      for (; left instanceof V.BinaryOperationExpression;)
+        left = left.left;
+      right = this.right;
+      for (; right instanceof V.BinaryOperationExpression;)
+        right = right.right;
+      return B.spanForList(H.setRuntimeTypeInfo([left, right], type$.JSArray_legacy_AstNode));
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitBinaryOperationExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t2, right, rightNeedsParens, _this = this,
+        left = _this.left,
+        leftNeedsParens = left instanceof V.BinaryOperationExpression && left.operator.precedence < _this.operator.precedence,
+        t1 = leftNeedsParens ? H.Primitives_stringFromCharCode(40) : "";
+      t1 += H.S(left);
+      if (leftNeedsParens)
+        t1 += H.Primitives_stringFromCharCode(41);
+      t2 = _this.operator;
+      t1 = t1 + H.Primitives_stringFromCharCode(32) + t2.operator + H.Primitives_stringFromCharCode(32);
+      right = _this.right;
+      rightNeedsParens = right instanceof V.BinaryOperationExpression && right.operator.precedence <= t2.precedence;
+      if (rightNeedsParens)
+        t1 += H.Primitives_stringFromCharCode(40);
+      t1 += H.S(right);
+      if (rightNeedsParens)
+        t1 += H.Primitives_stringFromCharCode(41);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode: 1,
+    $isExpression: 1
+  };
+  V.BinaryOperator.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  Z.BooleanExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitBooleanExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return String(this.value);
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  K.ColorExpression.prototype = {
+    get$span: function() {
+      return this.value.originalSpan;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitColorExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return N.serializeValue0(this.value, true, true);
+    },
+    $isAstNode: 1,
+    $isExpression: 1
+  };
+  F.FunctionExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitFunctionExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.namespace;
+      t1 = t1 != null ? t1 + "." : "";
+      t1 += this.name.toString$0(0) + this.$arguments.toString$0(0);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.IfExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitIfExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "if" + this.$arguments.toString$0(0);
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  D.ListExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitListExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var _this = this,
+        t1 = _this.hasBrackets,
+        t2 = t1 ? H.Primitives_stringFromCharCode(91) : "",
+        t3 = _this.contents,
+        t4 = _this.separator === C.ListSeparator_comma ? ", " : " ";
+      t4 = t2 + new H.MappedListIterable(t3, new D.ListExpression_toString_closure(_this), H._arrayInstanceType(t3)._eval$1("MappedListIterable<1,String*>")).join$1(0, t4);
+      t1 = t1 ? t4 + H.Primitives_stringFromCharCode(93) : t4;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _list0$_elementNeedsParens$1: function(expression) {
+      var t1, t2;
+      if (expression instanceof D.ListExpression) {
+        if (expression.contents.length < 2)
+          return false;
+        if (expression.hasBrackets)
+          return false;
+        t1 = this.separator;
+        t2 = t1 === C.ListSeparator_comma;
+        return t2 ? t2 : t1 !== C.ListSeparator_undecided;
+      }
+      if (this.separator !== C.ListSeparator_space)
+        return false;
+      if (expression instanceof X.UnaryOperationExpression) {
+        t1 = expression.operator;
+        return t1 === C.UnaryOperator_j2w || t1 === C.UnaryOperator_U4G;
+      }
+      return false;
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  D.ListExpression_toString_closure.prototype = {
+    call$1: function(element) {
+      return this.$this._list0$_elementNeedsParens$1(element) ? "(" + H.S(element) + ")" : J.toString$0$(element);
+    },
+    $signature: 471
+  };
+  A.MapExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitMapExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.pairs;
+      return "(" + new H.MappedListIterable(t1, new A.MapExpression_toString_closure(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$1(0, ", ") + ")";
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  A.MapExpression_toString_closure.prototype = {
+    call$1: function(pair) {
+      return H.S(pair.item1) + ": " + H.S(pair.item2);
+    },
+    $signature: 470
+  };
+  O.NullExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitNullExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "null";
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  T.NumberExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitNumberExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = H.S(this.value),
+        t2 = this.unit;
+      return t1 + (t2 == null ? "" : t2);
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  T.ParenthesizedExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitParenthesizedExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return J.toString$0$(this.expression);
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  T.SelectorExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitSelectorExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "&";
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  D.StringExpression.prototype = {
+    get$span: function() {
+      return this.text.span;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitStringExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    asInterpolation$1$static: function($static) {
+      var quote, t1, t2, buffer, t3, t4, t5, t6, _i, value, t7, t8, i, codeUnit, next, t9, _this = this;
+      if (!_this.hasQuotes)
+        return _this.text;
+      quote = _this._bestQuote$0();
+      t1 = new P.StringBuffer("");
+      t2 = [];
+      buffer = new Z.InterpolationBuffer(t1, t2);
+      t1._contents += H.Primitives_stringFromCharCode(quote);
+      for (t3 = _this.text, t4 = t3.contents, t5 = t4.length, t6 = type$.legacy_Expression, _i = 0; _i < t5; ++_i) {
+        value = t4[_i];
+        if (t6._is(value)) {
+          buffer._flushText$0();
+          t2.push(value);
+        } else if (typeof value == "string")
+          for (t7 = value.length, t8 = t7 - 1, i = 0; i < t7; ++i) {
+            codeUnit = C.JSString_methods._codeUnitAt$1(value, i);
+            if (codeUnit === 10 || codeUnit === 13 || codeUnit === 12) {
+              t1._contents += H.Primitives_stringFromCharCode(92);
+              t1._contents += H.Primitives_stringFromCharCode(97);
+              if (i !== t8) {
+                next = C.JSString_methods._codeUnitAt$1(value, i + 1);
+                if (next === 32 || next === 9 || next === 10 || next === 13 || next === 12 || T.isHex(next))
+                  t1._contents += H.Primitives_stringFromCharCode(32);
+              }
+            } else {
+              if (codeUnit !== quote)
+                if (codeUnit !== 92)
+                  t9 = $static && codeUnit === 35 && i < t8 && C.JSString_methods._codeUnitAt$1(value, i + 1) === 123;
+                else
+                  t9 = true;
+              else
+                t9 = true;
+              if (t9)
+                t1._contents += H.Primitives_stringFromCharCode(92);
+              t1._contents += H.Primitives_stringFromCharCode(codeUnit);
+            }
+          }
+      }
+      t1._contents += H.Primitives_stringFromCharCode(quote);
+      return buffer.interpolation$1(t3.span);
+    },
+    asInterpolation$0: function() {
+      return this.asInterpolation$1$static(false);
+    },
+    _bestQuote$0: function() {
+      var t1, t2, containsDoubleQuote, _i, value, t3, i, codeUnit;
+      for (t1 = this.text.contents, t2 = t1.length, containsDoubleQuote = false, _i = 0; _i < t2; ++_i) {
+        value = t1[_i];
+        if (typeof value == "string")
+          for (t3 = value.length, i = 0; i < t3; ++i) {
+            codeUnit = C.JSString_methods._codeUnitAt$1(value, i);
+            if (codeUnit === 39)
+              return 34;
+            if (codeUnit === 34)
+              containsDoubleQuote = true;
+          }
+      }
+      return containsDoubleQuote ? 39 : 34;
+    },
+    toString$0: function(_) {
+      return this.asInterpolation$0().toString$0(0);
+    },
+    $isAstNode: 1,
+    $isExpression: 1
+  };
+  X.UnaryOperationExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitUnaryOperationExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.operator,
+        t2 = t1.operator;
+      t1 = t1 === C.UnaryOperator_not_not ? t2 + H.Primitives_stringFromCharCode(32) : t2;
+      t1 += H.S(this.operand);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.UnaryOperator.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  F.ValueExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitValueExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return J.toString$0$(this.value);
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  S.VariableExpression.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitVariableExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.namespace;
+      t1 = t1 != null ? "$" + (t1 + ".") : "$";
+      t1 += this.name;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode: 1,
+    $isExpression: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.DynamicImport.prototype = {
+    toString$0: function(_) {
+      return new D.StringExpression(X.Interpolation$(H.setRuntimeTypeInfo([this.url], type$.JSArray_legacy_Object), null), true).asInterpolation$1$static(true).get$asPlain();
+    },
+    $isAstNode: 1,
+    $isImport: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Q.StaticImport.prototype = {
+    toString$0: function(_) {
+      var t1 = this.url.toString$0(0),
+        t2 = this.supports;
+      if (t2 != null)
+        t1 += " supports(" + t2.toString$0(0) + ")";
+      t2 = this.media;
+      if (t2 != null)
+        t1 += " " + t2.toString$0(0);
+      t1 += H.Primitives_stringFromCharCode(59);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode: 1,
+    $isImport: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.Interpolation.prototype = {
+    get$asPlain: function() {
+      var first,
+        t1 = this.contents,
+        t2 = t1.length;
+      if (t2 === 0)
+        return "";
+      if (t2 > 1)
+        return null;
+      first = C.JSArray_methods.get$first(t1);
+      return typeof first == "string" ? first : null;
+    },
+    get$initialPlain: function() {
+      var first = C.JSArray_methods.get$first(this.contents);
+      return typeof first == "string" ? first : "";
+    },
+    Interpolation$2: function(contents, span) {
+      var t1, t2, t3, i, t4, t5,
+        _s8_ = "contents";
+      for (t1 = this.contents, t2 = t1.length, t3 = type$.legacy_Expression, i = 0; i < t2; ++i) {
+        t4 = t1[i];
+        t5 = typeof t4 == "string";
+        if (!t5 && !t3._is(t4))
+          throw H.wrapException(P.ArgumentError$value(t1, _s8_, string$.May_on));
+        if (i !== 0 && typeof t1[i - 1] == "string" && t5)
+          throw H.wrapException(P.ArgumentError$value(t1, _s8_, "May not contain adjacent Strings."));
+      }
+    },
+    toString$0: function(_) {
+      var t1 = this.contents;
+      return new H.MappedListIterable(t1, new X.Interpolation_toString_closure(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0);
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.Interpolation_toString_closure.prototype = {
+    call$1: function(value) {
+      return typeof value == "string" ? value : "#{" + H.S(value) + "}";
+    },
+    $signature: 41
+  };
+  V.AtRootRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitAtRootRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var buffer = new P.StringBuffer("@at-root "),
+        t1 = this.query;
+      if (t1 != null)
+        buffer._contents = "@at-root " + (t1.toString$0(0) + " ");
+      t1 = this.children;
+      return buffer.toString$0(0) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  U.AtRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitAtRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = "@" + this.name.toString$0(0),
+        buffer = new P.StringBuffer(t1),
+        t2 = this.value;
+      if (t2 != null)
+        buffer._contents = t1 + (" " + t2.toString$0(0));
+      t1 = this.children;
+      return t1 == null ? buffer.toString$0(0) + ";" : buffer.toString$0(0) + " {" + C.JSArray_methods.join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  M.CallableDeclaration.prototype = {
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Y.ContentBlock.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitContentBlock$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t2,
+        t1 = this.$arguments;
+      t1 = t1.$arguments.length === 0 && t1.restArgument == null ? "" : " using (" + t1.toString$0(0) + ")";
+      t2 = this.children;
+      return t1 + (" {" + (t2 && C.JSArray_methods).join$1(t2, " ") + "}");
+    }
+  };
+  Q.ContentRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitContentRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.$arguments;
+      return t1.get$isEmpty(t1) ? "@content;" : "@content(" + t1.toString$0(0) + ");";
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Q.DebugRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitDebugRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@debug " + H.S(this.expression) + ";";
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.Declaration.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitDeclaration$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.EachRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitEachRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.variables,
+        t2 = this.children;
+      return "@each " + new H.MappedListIterable(t1, new V.EachRule_toString_closure(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$1(0, ", ") + " in " + H.S(this.list) + " {" + (t2 && C.JSArray_methods).join$1(t2, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.EachRule_toString_closure.prototype = {
+    call$1: function(variable) {
+      return C.JSString_methods.$add("$", variable);
+    },
+    $signature: 4
+  };
+  D.ErrorRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitErrorRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@error " + H.S(this.expression) + ";";
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.ExtendRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitExtendRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@extend " + this.selector.toString$0(0);
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.ForRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitForRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var _this = this,
+        t1 = "@for $" + _this.variable + " from " + H.S(_this.from) + " ",
+        t2 = _this.children;
+      return t1 + (_this.isExclusive ? "to" : "through") + " " + H.S(_this.to) + " {" + (t2 && C.JSArray_methods).join$1(t2, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.ForwardRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitForwardRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t3, _this = this,
+        t1 = "@forward " + H.S(new D.StringExpression(X.Interpolation$(H.setRuntimeTypeInfo([J.toString$0$(_this.url)], type$.JSArray_legacy_Object), null), true).asInterpolation$1$static(true).get$asPlain()),
+        t2 = _this.shownMixinsAndFunctions;
+      if (t2 != null)
+        t1 = t1 + " show " + _this._forward_rule$_memberList$2(t2, _this.shownVariables);
+      else {
+        t2 = _this.hiddenMixinsAndFunctions;
+        if (t2 != null) {
+          t3 = t2._base;
+          t3 = t3.get$isNotEmpty(t3);
+        } else
+          t3 = false;
+        if (t3)
+          t1 = t1 + " hide " + _this._forward_rule$_memberList$2(t2, _this.hiddenVariables);
+      }
+      t2 = _this.prefix;
+      if (t2 != null)
+        t1 += " as " + t2 + "*";
+      t2 = _this.configuration;
+      t1 = (t2.length !== 0 ? t1 + (" with (" + C.JSArray_methods.join$1(t2, ", ") + ")") : t1) + ";";
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _forward_rule$_memberList$2: function(mixinsAndFunctions, variables) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String),
+        t2 = this.shownMixinsAndFunctions;
+      if (t2 != null)
+        for (t2 = t2._base, t2 = t2.get$iterator(t2); t2.moveNext$0();)
+          t1.push(t2.get$current(t2));
+      t2 = this.shownVariables;
+      if (t2 != null)
+        for (t2 = t2._base, t2 = t2.get$iterator(t2); t2.moveNext$0();)
+          t1.push("$" + H.S(t2.get$current(t2)));
+      return C.JSArray_methods.join$1(t1, ", ");
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  M.FunctionRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitFunctionRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return "@function " + H.S(this.name) + "(" + H.S(this.$arguments) + ") {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    }
+  };
+  V.IfRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitIfRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t2, t1 = {};
+      t1.first = true;
+      t2 = this.clauses;
+      return new H.MappedListIterable(t2, new V.IfRule_toString_closure(t1), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,String*>")).join$1(0, " ");
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.IfRule_toString_closure.prototype = {
+    call$1: function(clause) {
+      var t1 = this._box_0,
+        $name = t1.first ? "if" : "else";
+      t1.first = false;
+      return "@" + $name + " " + H.S(clause.expression) + " {" + C.JSArray_methods.join$1(clause.children, " ") + "}";
+    },
+    $signature: 454
+  };
+  V.IfClause.prototype = {
+    toString$0: function(_) {
+      var t1 = this.expression;
+      t1 = t1 == null ? "@else" : "@if " + t1.toString$0(0);
+      return t1 + (" {" + C.JSArray_methods.join$1(this.children, " ") + "}");
+    }
+  };
+  V.IfClause$__closure.prototype = {
+    call$1: function(child) {
+      var t1;
+      if (!(child instanceof Z.VariableDeclaration))
+        if (!(child instanceof M.FunctionRule))
+          if (!(child instanceof T.MixinRule))
+            t1 = child instanceof B.ImportRule && C.JSArray_methods.any$1(child.imports, new V.IfClause$___closure());
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 182
+  };
+  V.IfClause$___closure.prototype = {
+    call$1: function($import) {
+      return $import instanceof B.DynamicImport;
+    },
+    $signature: 190
+  };
+  B.ImportRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitImportRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@import " + C.JSArray_methods.join$1(this.imports, ", ") + ";";
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  A.IncludeRule.prototype = {
+    get$spanWithoutContent: function() {
+      var t2, t3,
+        t1 = this.span;
+      if (!(this.content == null)) {
+        t2 = t1.file;
+        t3 = this.$arguments.span;
+        t3 = B.SpanExtensions_trim(t2.span$2(Y.FileLocation$_(t2, t1._file$_start).offset, Y.FileLocation$_(t3.file, t3._end).offset));
+        t1 = t3;
+      }
+      return t1;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitIncludeRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t2, _this = this,
+        t1 = _this.namespace;
+      t1 = t1 != null ? "@include " + (t1 + ".") : "@include ";
+      t1 += _this.name;
+      t2 = _this.$arguments;
+      if (!t2.get$isEmpty(t2))
+        t1 += "(" + t2.toString$0(0) + ")";
+      t2 = _this.content;
+      t1 += t2 == null ? ";" : " " + t2.toString$0(0);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.LoudComment.prototype = {
+    get$span: function() {
+      return this.text.span;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitLoudComment$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return this.text.toString$0(0);
+    },
+    $isAstNode: 1,
+    $isStatement: 1
+  };
+  G.MediaRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitMediaRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return "@media " + this.query.toString$0(0) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  T.MixinRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitMixinRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = "@mixin " + H.S(this.name),
+        t2 = this.$arguments;
+      if (!(t2.$arguments.length === 0 && t2.restArgument == null))
+        t1 += "(" + t2.toString$0(0) + ")";
+      t2 = this.children;
+      t2 = t1 + (" {" + (t2 && C.JSArray_methods).join$1(t2, " ") + "}");
+      return t2.charCodeAt(0) == 0 ? t2 : t2;
+    }
+  };
+  M.ParentStatement.prototype = {$isAstNode: 1, $isStatement: 1};
+  M.ParentStatement_closure.prototype = {
+    call$1: function(child) {
+      var t1;
+      if (!(child instanceof Z.VariableDeclaration))
+        if (!(child instanceof M.FunctionRule))
+          if (!(child instanceof T.MixinRule))
+            t1 = child instanceof B.ImportRule && C.JSArray_methods.any$1(child.imports, new M.ParentStatement__closure());
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 182
+  };
+  M.ParentStatement__closure.prototype = {
+    call$1: function($import) {
+      return $import instanceof B.DynamicImport;
+    },
+    $signature: 190
+  };
+  B.ReturnRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitReturnRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@return " + H.S(this.expression) + ";";
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.SilentComment.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitSilentComment$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return this.text;
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.StyleRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitStyleRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return this.selector.toString$0(0) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.Stylesheet.prototype = {
+    Stylesheet$3$plainCss: function(children, span, plainCss) {
+      var t1, t2, t3, t4, _i, child;
+      for (t1 = this.children, t2 = t1.length, t3 = this._forwards, t4 = this._uses, _i = 0; _i < t2; ++_i) {
+        child = t1[_i];
+        if (child instanceof T.UseRule)
+          t4.push(child);
+        else if (child instanceof L.ForwardRule)
+          t3.push(child);
+        else if (!(child instanceof B.SilentComment) && !(child instanceof L.LoudComment) && !(child instanceof Z.VariableDeclaration))
+          break;
+      }
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitStylesheet$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return (t1 && C.JSArray_methods).join$1(t1, " ");
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.SupportsRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitSupportsRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return "@supports " + this.condition.toString$0(0) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  T.UseRule.prototype = {
+    UseRule$4$configuration: function(url, namespace, span, configuration) {
+      var t1, t2, _i, variable;
+      for (t1 = this.configuration, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        variable = t1[_i];
+        if (variable.isGuarded)
+          throw H.wrapException(P.ArgumentError$value(variable, "configured variable", "can't be guarded in a @use rule."));
+      }
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitUseRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.url,
+        t2 = "@use " + H.S(new D.StringExpression(X.Interpolation$(H.setRuntimeTypeInfo([J.toString$0$(t1)], type$.JSArray_legacy_Object), null), true).asInterpolation$1$static(true).get$asPlain()),
+        basename = t1.get$pathSegments().length === 0 ? "" : C.JSArray_methods.get$last(t1.get$pathSegments()),
+        dot = J.getInterceptor$asx(basename).indexOf$1(basename, ".");
+      t1 = this.namespace;
+      if (t1 !== C.JSString_methods.substring$2(basename, 0, dot === -1 ? basename.length : dot))
+        t1 = t2 + (" as " + (t1 == null ? "*" : t1));
+      else
+        t1 = t2;
+      t2 = this.configuration;
+      t1 = (t2.length !== 0 ? t1 + (" with (" + C.JSArray_methods.join$1(t2, ", ") + ")") : t1) + ";";
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Z.VariableDeclaration.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitVariableDeclaration$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.namespace;
+      t1 = t1 != null ? "$" + (t1 + ".") : "$";
+      t1 += this.name + ": " + H.S(this.expression) + ";";
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Y.WarnRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitWarnRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@warn " + H.S(this.expression) + ";";
+    },
+    $isAstNode: 1,
+    $isStatement: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  G.WhileRule.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitWhileRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return "@while " + H.S(this.condition) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Y.SupportsAnything.prototype = {
+    toString$0: function(_) {
+      return "(" + this.contents.toString$0(0) + ")";
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.SupportsDeclaration.prototype = {
+    toString$0: function(_) {
+      return "(" + H.S(this.name) + ": " + H.S(this.value) + ")";
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.SupportsFunction.prototype = {
+    toString$0: function(_) {
+      return this.name.toString$0(0) + "(" + this.$arguments.toString$0(0) + ")";
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.SupportsInterpolation.prototype = {
+    toString$0: function(_) {
+      return "#{" + H.S(this.expression) + "}";
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  M.SupportsNegation.prototype = {
+    toString$0: function(_) {
+      var t1 = this.condition;
+      if (t1 instanceof M.SupportsNegation || t1 instanceof U.SupportsOperation)
+        return "not (" + t1.toString$0(0) + ")";
+      else
+        return "not " + t1.toString$0(0);
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  U.SupportsOperation.prototype = {
+    toString$0: function(_) {
+      var _this = this;
+      return _this._operation$_parenthesize$1(_this.left) + " " + _this.operator + " " + _this._operation$_parenthesize$1(_this.right);
+    },
+    _operation$_parenthesize$1: function(condition) {
+      var t1;
+      if (!(condition instanceof M.SupportsNegation))
+        t1 = condition instanceof U.SupportsOperation && condition.operator === this.operator;
+      else
+        t1 = true;
+      return t1 ? "(" + condition.toString$0(0) + ")" : condition.toString$0(0);
+    },
+    $isAstNode: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  T.Selector.prototype = {
+    get$isInvisible: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      var visitor = N._SerializeVisitor$0(null, true, null, true, false, null, true);
+      this.accept$1(visitor);
+      return visitor._serialize$_buffer.toString$0(0);
+    }
+  };
+  N.AttributeSelector.prototype = {
+    accept$1$1: function(visitor) {
+      var t2, _this = this,
+        t1 = visitor._serialize$_buffer;
+      t1.writeCharCode$1(91);
+      t1.write$1(0, _this.name);
+      t2 = _this.op;
+      if (t2 != null) {
+        t1.write$1(0, t2);
+        t2 = _this.value;
+        if (G.Parser_isIdentifier(t2) && !J.startsWith$1$s(t2, "--")) {
+          t1.write$1(0, t2);
+          t2 = _this.modifier;
+          if (t2 != null)
+            t1.writeCharCode$1(32);
+        } else {
+          visitor._visitQuotedString$1(t2);
+          t2 = _this.modifier;
+          if (t2 != null)
+            if (visitor._style !== C.OutputStyle_compressed)
+              t1.writeCharCode$1(32);
+        }
+        if (t2 != null)
+          t1.write$1(0, t2);
+      }
+      t1.writeCharCode$1(93);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      return other instanceof N.AttributeSelector && other.name.$eq(0, _this.name) && other.op == _this.op && other.value == _this.value && other.modifier == _this.modifier;
+    },
+    get$hashCode: function(_) {
+      var _this = this,
+        t1 = _this.name;
+      return (C.JSString_methods.get$hashCode(t1.name) ^ J.get$hashCode$(t1.namespace) ^ J.get$hashCode$(_this.op) ^ J.get$hashCode$(_this.value) ^ J.get$hashCode$(_this.modifier)) >>> 0;
+    }
+  };
+  N.AttributeOperator.prototype = {
+    toString$0: function(_) {
+      return this._attribute$_text;
+    }
+  };
+  X.ClassSelector.prototype = {
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof X.ClassSelector && other.name === this.name;
+    },
+    accept$1$1: function(visitor) {
+      var t1 = visitor._serialize$_buffer;
+      t1.writeCharCode$1(46);
+      t1.write$1(0, this.name);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    addSuffix$1: function(suffix) {
+      return new X.ClassSelector(this.name + suffix);
+    },
+    get$hashCode: function(_) {
+      return C.JSString_methods.get$hashCode(this.name);
+    }
+  };
+  S.ComplexSelector.prototype = {
+    get$minSpecificity: function() {
+      if (this._minSpecificity == null)
+        this._computeSpecificity$0();
+      return this._minSpecificity;
+    },
+    get$maxSpecificity: function() {
+      if (this._maxSpecificity == null)
+        this._computeSpecificity$0();
+      return this._maxSpecificity;
+    },
+    get$isInvisible: function() {
+      var t1 = this._complex$_isInvisible;
+      if (t1 != null)
+        return t1;
+      return this._complex$_isInvisible = C.JSArray_methods.any$1(this.components, new S.ComplexSelector_isInvisible_closure());
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitComplexSelector$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    _computeSpecificity$0: function() {
+      var t1, t2, component, t3, _this = this,
+        _i = _this._maxSpecificity = _this._minSpecificity = 0;
+      for (t1 = _this.components, t2 = t1.length; _i < t2; ++_i) {
+        component = t1[_i];
+        if (component instanceof X.CompoundSelector) {
+          t3 = _this._minSpecificity;
+          if (component._compound$_minSpecificity == null)
+            component._compound$_computeSpecificity$0();
+          _this._minSpecificity = t3 + component._compound$_minSpecificity;
+          t3 = _this._maxSpecificity;
+          if (component._compound$_maxSpecificity == null)
+            component._compound$_computeSpecificity$0();
+          _this._maxSpecificity = t3 + component._compound$_maxSpecificity;
+        }
+      }
+    },
+    get$hashCode: function(_) {
+      return C.C_ListEquality.hash$1(this.components);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof S.ComplexSelector && C.C_ListEquality.equals$2(0, this.components, other.components);
+    }
+  };
+  S.ComplexSelector_isInvisible_closure.prototype = {
+    call$1: function(component) {
+      return component instanceof X.CompoundSelector && component.get$isInvisible();
+    },
+    $signature: 91
+  };
+  S.Combinator.prototype = {
+    toString$0: function(_) {
+      return this._complex$_text;
+    },
+    $isComplexSelectorComponent: 1
+  };
+  X.CompoundSelector.prototype = {
+    get$isInvisible: function() {
+      return C.JSArray_methods.any$1(this.components, new X.CompoundSelector_isInvisible_closure());
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitCompoundSelector$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    _compound$_computeSpecificity$0: function() {
+      var t1, t2, simple, _this = this,
+        _i = _this._compound$_maxSpecificity = _this._compound$_minSpecificity = 0;
+      for (t1 = _this.components, t2 = t1.length; _i < t2; ++_i) {
+        simple = t1[_i];
+        _this._compound$_minSpecificity = _this._compound$_minSpecificity + simple.get$minSpecificity();
+        _this._compound$_maxSpecificity = _this._compound$_maxSpecificity + simple.get$maxSpecificity();
+      }
+    },
+    get$hashCode: function(_) {
+      return C.C_ListEquality.hash$1(this.components);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof X.CompoundSelector && C.C_ListEquality.equals$2(0, this.components, other.components);
+    },
+    $isComplexSelectorComponent: 1
+  };
+  X.CompoundSelector_isInvisible_closure.prototype = {
+    call$1: function(component) {
+      return component.get$isInvisible();
+    },
+    $signature: 18
+  };
+  N.IDSelector.prototype = {
+    get$minSpecificity: function() {
+      return H._asIntS(Math.pow(M.SimpleSelector.prototype.get$minSpecificity.call(this), 2));
+    },
+    accept$1$1: function(visitor) {
+      var t1 = visitor._serialize$_buffer;
+      t1.writeCharCode$1(35);
+      t1.write$1(0, this.name);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    addSuffix$1: function(suffix) {
+      return new N.IDSelector(this.name + suffix);
+    },
+    unify$1: function(compound) {
+      if (C.JSArray_methods.any$1(compound, new N.IDSelector_unify_closure(this)))
+        return null;
+      return this.super$SimpleSelector$unify(compound);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof N.IDSelector && other.name === this.name;
+    },
+    get$hashCode: function(_) {
+      return C.JSString_methods.get$hashCode(this.name);
+    }
+  };
+  N.IDSelector_unify_closure.prototype = {
+    call$1: function(simple) {
+      var t1;
+      if (simple instanceof N.IDSelector) {
+        t1 = simple.name;
+        t1 = this.$this.name !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 18
+  };
+  D.SelectorList.prototype = {
+    get$isInvisible: function() {
+      return C.JSArray_methods.every$1(this.components, new D.SelectorList_isInvisible_closure());
+    },
+    get$asSassList: function() {
+      var t1 = this.components;
+      return D.SassList$(new H.MappedListIterable(t1, new D.SelectorList_asSassList_closure(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Value*>")), C.ListSeparator_comma, false);
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitSelectorList$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unify$1: function(other) {
+      var t1 = this.components,
+        t2 = H._arrayInstanceType(t1)._eval$1("ExpandIterable<1,ComplexSelector*>"),
+        contents = P.List_List$from(new H.ExpandIterable(t1, new D.SelectorList_unify_closure(other), t2), true, t2._eval$1("Iterable.E"));
+      return contents.length === 0 ? null : D.SelectorList$(contents);
+    },
+    resolveParentSelectors$2$implicitParent: function($parent, implicitParent) {
+      var t1, _this = this;
+      if ($parent == null) {
+        if (!C.JSArray_methods.any$1(_this.components, _this.get$_complexContainsParentSelector()))
+          return _this;
+        throw H.wrapException(E.SassScriptException$(string$.Top_le));
+      }
+      t1 = _this.components;
+      return D.SelectorList$(B.flattenVertically(new H.MappedListIterable(t1, new D.SelectorList_resolveParentSelectors_closure(_this, implicitParent, $parent), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Iterable<ComplexSelector*>*>")), type$.legacy_ComplexSelector));
+    },
+    resolveParentSelectors$1: function($parent) {
+      return this.resolveParentSelectors$2$implicitParent($parent, true);
+    },
+    _complexContainsParentSelector$1: function(complex) {
+      return C.JSArray_methods.any$1(complex.components, new D.SelectorList__complexContainsParentSelector_closure());
+    },
+    _resolveParentSelectorsCompound$2: function(compound, $parent) {
+      var resolvedMembers0, parentSelector, t1,
+        resolvedMembers = compound.components,
+        containsSelectorPseudo = C.JSArray_methods.any$1(resolvedMembers, new D.SelectorList__resolveParentSelectorsCompound_closure());
+      if (!containsSelectorPseudo && !(C.JSArray_methods.get$first(resolvedMembers) instanceof M.ParentSelector))
+        return null;
+      resolvedMembers0 = containsSelectorPseudo ? new H.MappedListIterable(resolvedMembers, new D.SelectorList__resolveParentSelectorsCompound_closure0($parent), H._arrayInstanceType(resolvedMembers)._eval$1("MappedListIterable<1,SimpleSelector*>")) : resolvedMembers;
+      parentSelector = C.JSArray_methods.get$first(resolvedMembers);
+      if (parentSelector instanceof M.ParentSelector) {
+        if (resolvedMembers.length === 1 && parentSelector.suffix == null)
+          return $parent.components;
+      } else
+        return H.setRuntimeTypeInfo([S.ComplexSelector$(H.setRuntimeTypeInfo([X.CompoundSelector$(resolvedMembers0)], type$.JSArray_legacy_ComplexSelectorComponent), false)], type$.JSArray_legacy_ComplexSelector);
+      t1 = $parent.components;
+      return new H.MappedListIterable(t1, new D.SelectorList__resolveParentSelectorsCompound_closure1(compound, resolvedMembers0), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,ComplexSelector*>"));
+    },
+    get$hashCode: function(_) {
+      return C.C_ListEquality.hash$1(this.components);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof D.SelectorList && C.C_ListEquality.equals$2(0, this.components, other.components);
+    }
+  };
+  D.SelectorList_isInvisible_closure.prototype = {
+    call$1: function(complex) {
+      return complex.get$isInvisible();
+    },
+    $signature: 15
+  };
+  D.SelectorList_asSassList_closure.prototype = {
+    call$1: function(complex) {
+      var t1 = complex.components;
+      return D.SassList$(new H.MappedListIterable(t1, new D.SelectorList_asSassList__closure(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Value*>")), C.ListSeparator_space, false);
+    },
+    $signature: 439
+  };
+  D.SelectorList_asSassList__closure.prototype = {
+    call$1: function(component) {
+      return new D.SassString(J.toString$0$(component), false);
+    },
+    $signature: 430
+  };
+  D.SelectorList_unify_closure.prototype = {
+    call$1: function(complex1) {
+      var t1 = this.other.components;
+      return new H.ExpandIterable(t1, new D.SelectorList_unify__closure(complex1), H._arrayInstanceType(t1)._eval$1("ExpandIterable<1,ComplexSelector*>"));
+    },
+    $signature: 89
+  };
+  D.SelectorList_unify__closure.prototype = {
+    call$1: function(complex2) {
+      var unified = Y.unifyComplex(H.setRuntimeTypeInfo([this.complex1.components, complex2.components], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+      if (unified == null)
+        return C.List_empty4;
+      return J.map$1$1$ax(unified, new D.SelectorList_unify___closure(), type$.legacy_ComplexSelector);
+    },
+    $signature: 89
+  };
+  D.SelectorList_unify___closure.prototype = {
+    call$1: function(complex) {
+      return S.ComplexSelector$(complex, false);
+    },
+    $signature: 62
+  };
+  D.SelectorList_resolveParentSelectors_closure.prototype = {
+    call$1: function(complex) {
+      var t2, t3, newComplexes, t4, t5, t6, t7, _i, component, resolved, t8, _i0, previousLineBreaks, newComplexes0, t9, i, newComplex, i0, lineBreak, t10, t11, t12, t13, t14, t15, _i1, _this = this, _box_0 = {},
+        t1 = _this.$this;
+      if (!t1._complexContainsParentSelector$1(complex)) {
+        if (!_this.implicitParent)
+          return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector);
+        t1 = _this.parent.components;
+        return new H.MappedListIterable(t1, new D.SelectorList_resolveParentSelectors__closure(complex), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,ComplexSelector*>"));
+      }
+      t2 = type$.JSArray_legacy_ComplexSelectorComponent;
+      t3 = type$.JSArray_legacy_List_legacy_ComplexSelectorComponent;
+      newComplexes = H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([], t2)], t3);
+      t4 = type$.JSArray_legacy_bool;
+      _box_0.lineBreaks = H.setRuntimeTypeInfo([false], t4);
+      for (t5 = complex.components, t6 = t5.length, t7 = _this.parent, _i = 0; _i < t6; ++_i) {
+        component = t5[_i];
+        if (component instanceof X.CompoundSelector) {
+          resolved = t1._resolveParentSelectorsCompound$2(component, t7);
+          if (resolved == null) {
+            for (t8 = newComplexes.length, _i0 = 0; _i0 < newComplexes.length; newComplexes.length === t8 || (0, H.throwConcurrentModificationError)(newComplexes), ++_i0)
+              newComplexes[_i0].push(component);
+            continue;
+          }
+          previousLineBreaks = _box_0.lineBreaks;
+          newComplexes0 = H.setRuntimeTypeInfo([], t3);
+          _box_0.lineBreaks = H.setRuntimeTypeInfo([], t4);
+          for (t8 = newComplexes.length, t9 = J.getInterceptor$ax(resolved), i = 0, _i0 = 0; _i0 < newComplexes.length; newComplexes.length === t8 || (0, H.throwConcurrentModificationError)(newComplexes), ++_i0, i = i0) {
+            newComplex = newComplexes[_i0];
+            i0 = i + 1;
+            lineBreak = previousLineBreaks[i];
+            for (t10 = t9.get$iterator(resolved), t11 = !lineBreak; t10.moveNext$0();) {
+              t12 = t10.get$current(t10);
+              t13 = H.setRuntimeTypeInfo([], t2);
+              for (t14 = C.JSArray_methods.get$iterator(newComplex); t14.moveNext$0();)
+                t13.push(t14.get$current(t14));
+              for (t14 = t12.components, t15 = t14.length, _i1 = 0; _i1 < t15; ++_i1)
+                t13.push(t14[_i1]);
+              newComplexes0.push(t13);
+              t13 = _box_0.lineBreaks;
+              t13.push(!t11 || t12.lineBreak);
+            }
+          }
+          newComplexes = newComplexes0;
+        } else
+          for (t8 = newComplexes.length, _i0 = 0; _i0 < newComplexes.length; newComplexes.length === t8 || (0, H.throwConcurrentModificationError)(newComplexes), ++_i0)
+            newComplexes[_i0].push(component);
+      }
+      _box_0.i = 0;
+      return new H.MappedListIterable(newComplexes, new D.SelectorList_resolveParentSelectors__closure0(_box_0), H._arrayInstanceType(newComplexes)._eval$1("MappedListIterable<1,ComplexSelector*>"));
+    },
+    $signature: 89
+  };
+  D.SelectorList_resolveParentSelectors__closure.prototype = {
+    call$1: function(parentComplex) {
+      var t2, t3, _i, t4,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent);
+      for (t2 = parentComplex.components, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t1.push(t2[_i]);
+      for (t2 = this.complex, t3 = t2.components, t4 = t3.length, _i = 0; _i < t4; ++_i)
+        t1.push(t3[_i]);
+      return S.ComplexSelector$(t1, t2.lineBreak || parentComplex.lineBreak);
+    },
+    $signature: 83
+  };
+  D.SelectorList_resolveParentSelectors__closure0.prototype = {
+    call$1: function(newComplex) {
+      var t1 = this._box_0;
+      return S.ComplexSelector$(newComplex, t1.lineBreaks[t1.i++]);
+    },
+    $signature: 62
+  };
+  D.SelectorList__complexContainsParentSelector_closure.prototype = {
+    call$1: function(component) {
+      return component instanceof X.CompoundSelector && C.JSArray_methods.any$1(component.components, new D.SelectorList__complexContainsParentSelector__closure());
+    },
+    $signature: 91
+  };
+  D.SelectorList__complexContainsParentSelector__closure.prototype = {
+    call$1: function(simple) {
+      var t1;
+      if (!(simple instanceof M.ParentSelector))
+        if (simple instanceof D.PseudoSelector) {
+          t1 = simple.selector;
+          t1 = t1 != null && C.JSArray_methods.any$1(t1.components, t1.get$_complexContainsParentSelector());
+        } else
+          t1 = false;
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 18
+  };
+  D.SelectorList__resolveParentSelectorsCompound_closure.prototype = {
+    call$1: function(simple) {
+      var t1;
+      if (simple instanceof D.PseudoSelector) {
+        t1 = simple.selector;
+        t1 = t1 != null && C.JSArray_methods.any$1(t1.components, t1.get$_complexContainsParentSelector());
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 18
+  };
+  D.SelectorList__resolveParentSelectorsCompound_closure0.prototype = {
+    call$1: function(simple) {
+      var t1, t2, t3;
+      if (simple instanceof D.PseudoSelector) {
+        t1 = simple.selector;
+        if (t1 == null)
+          return simple;
+        if (!C.JSArray_methods.any$1(t1.components, t1.get$_complexContainsParentSelector()))
+          return simple;
+        t1 = t1.resolveParentSelectors$2$implicitParent(this.parent, false);
+        t2 = simple.name;
+        t3 = simple.isClass;
+        return D.PseudoSelector$(t2, simple.argument, !t3, t1);
+      } else
+        return simple;
+    },
+    $signature: 428
+  };
+  D.SelectorList__resolveParentSelectorsCompound_closure1.prototype = {
+    call$1: function(complex) {
+      var suffix, t2, t3, t4, cur, last, _i,
+        t1 = complex.components,
+        lastComponent = C.JSArray_methods.get$last(t1);
+      if (!(lastComponent instanceof X.CompoundSelector))
+        throw H.wrapException(E.SassScriptException$('Parent "' + complex.toString$0(0) + '" is incompatible with this selector.'));
+      suffix = type$.legacy_ParentSelector._as(C.JSArray_methods.get$first(this.compound.components)).suffix;
+      t2 = type$.JSArray_legacy_SimpleSelector;
+      if (suffix != null) {
+        t2 = H.setRuntimeTypeInfo([], t2);
+        for (t3 = lastComponent.components, t4 = H.SubListIterable$(t3, 0, t3.length - 1, H._arrayInstanceType(t3)._precomputed1), t4 = new H.ListIterator(t4, t4.get$length(t4)); t4.moveNext$0();) {
+          cur = t4.__internal$_current;
+          t2.push(cur);
+        }
+        t2.push(C.JSArray_methods.get$last(t3).addSuffix$1(suffix));
+        for (t3 = J.skip$1$ax(this.resolvedMembers, 1), t3 = new H.ListIterator(t3, t3.get$length(t3)); t3.moveNext$0();) {
+          cur = t3.__internal$_current;
+          t2.push(cur);
+        }
+        last = X.CompoundSelector$(t2);
+      } else {
+        t2 = H.setRuntimeTypeInfo([], t2);
+        for (t3 = lastComponent.components, t4 = t3.length, _i = 0; _i < t4; ++_i)
+          t2.push(t3[_i]);
+        for (t3 = J.skip$1$ax(this.resolvedMembers, 1), t3 = new H.ListIterator(t3, t3.get$length(t3)); t3.moveNext$0();) {
+          cur = t3.__internal$_current;
+          t2.push(cur);
+        }
+        last = X.CompoundSelector$(t2);
+      }
+      t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent);
+      for (t1 = H.SubListIterable$(t1, 0, t1.length - 1, H._arrayInstanceType(t1)._precomputed1), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        t2.push(cur);
+      }
+      t2.push(last);
+      return S.ComplexSelector$(t2, complex.lineBreak);
+    },
+    $signature: 83
+  };
+  M.ParentSelector.prototype = {
+    accept$1$1: function(visitor) {
+      var t2,
+        t1 = visitor._serialize$_buffer;
+      t1.writeCharCode$1(38);
+      t2 = this.suffix;
+      if (t2 != null)
+        t1.write$1(0, t2);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unify$1: function(compound) {
+      return H.throwExpression(P.UnsupportedError$("& doesn't support unification."));
+    }
+  };
+  N.PlaceholderSelector.prototype = {
+    get$isInvisible: function() {
+      return true;
+    },
+    accept$1$1: function(visitor) {
+      var t1 = visitor._serialize$_buffer;
+      t1.writeCharCode$1(37);
+      t1.write$1(0, this.name);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    addSuffix$1: function(suffix) {
+      return new N.PlaceholderSelector(this.name + suffix);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof N.PlaceholderSelector && other.name === this.name;
+    },
+    get$hashCode: function(_) {
+      return C.JSString_methods.get$hashCode(this.name);
+    }
+  };
+  D.PseudoSelector.prototype = {
+    get$minSpecificity: function() {
+      if (this._pseudo$_minSpecificity == null)
+        this._pseudo$_computeSpecificity$0();
+      return this._pseudo$_minSpecificity;
+    },
+    get$maxSpecificity: function() {
+      if (this._pseudo$_maxSpecificity == null)
+        this._pseudo$_computeSpecificity$0();
+      return this._pseudo$_maxSpecificity;
+    },
+    get$isInvisible: function() {
+      var t1 = this.selector;
+      if (t1 == null)
+        return false;
+      return this.name !== "not" && t1.get$isInvisible();
+    },
+    addSuffix$1: function(suffix) {
+      var _this = this;
+      if (_this.argument != null || _this.selector != null)
+        _this.super$SimpleSelector$addSuffix(suffix);
+      return D.PseudoSelector$(_this.name + suffix, null, !_this.isClass, null);
+    },
+    unify$1: function(compound) {
+      var result, t1, t2, addedThis, _i, simple, _this = this;
+      if (compound.length === 1 && C.JSArray_methods.get$first(compound) instanceof N.UniversalSelector)
+        return C.JSArray_methods.get$first(compound).unify$1(H.setRuntimeTypeInfo([_this], type$.JSArray_legacy_SimpleSelector));
+      if (C.JSArray_methods.contains$1(compound, _this))
+        return compound;
+      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector);
+      for (t1 = compound.length, t2 = !_this.isClass, addedThis = false, _i = 0; _i < compound.length; compound.length === t1 || (0, H.throwConcurrentModificationError)(compound), ++_i) {
+        simple = compound[_i];
+        if (simple instanceof D.PseudoSelector && !simple.isClass) {
+          if (t2)
+            return null;
+          result.push(_this);
+          addedThis = true;
+        }
+        result.push(simple);
+      }
+      if (!addedThis)
+        result.push(_this);
+      return result;
+    },
+    _pseudo$_computeSpecificity$0: function() {
+      var t1, _i, t2, complex, t3, t4, _this = this;
+      if (!_this.isClass) {
+        _this._pseudo$_maxSpecificity = _this._pseudo$_minSpecificity = 1;
+        return;
+      }
+      t1 = _this.selector;
+      if (t1 == null) {
+        _this._pseudo$_minSpecificity = M.SimpleSelector.prototype.get$minSpecificity.call(_this);
+        _this._pseudo$_maxSpecificity = M.SimpleSelector.prototype.get$maxSpecificity.call(_this);
+        return;
+      }
+      if (_this.name === "not") {
+        _i = _this._pseudo$_maxSpecificity = _this._pseudo$_minSpecificity = 0;
+        for (t1 = t1.components, t2 = t1.length; _i < t2; ++_i) {
+          complex = t1[_i];
+          t3 = _this._pseudo$_minSpecificity;
+          if (complex._minSpecificity == null)
+            complex._computeSpecificity$0();
+          t4 = complex._minSpecificity;
+          _this._pseudo$_minSpecificity = Math.max(H.checkNum(t3), H.checkNum(t4));
+          t4 = _this._pseudo$_maxSpecificity;
+          if (complex._maxSpecificity == null)
+            complex._computeSpecificity$0();
+          t3 = complex._maxSpecificity;
+          _this._pseudo$_maxSpecificity = Math.max(H.checkNum(t4), H.checkNum(t3));
+        }
+      } else {
+        _this._pseudo$_minSpecificity = H._asIntS(Math.pow(M.SimpleSelector.prototype.get$minSpecificity.call(_this), 3));
+        _i = _this._pseudo$_maxSpecificity = 0;
+        for (t1 = t1.components, t2 = t1.length; _i < t2; ++_i) {
+          complex = t1[_i];
+          t3 = _this._pseudo$_minSpecificity;
+          if (complex._minSpecificity == null)
+            complex._computeSpecificity$0();
+          t4 = complex._minSpecificity;
+          _this._pseudo$_minSpecificity = Math.min(H.checkNum(t3), H.checkNum(t4));
+          t4 = _this._pseudo$_maxSpecificity;
+          if (complex._maxSpecificity == null)
+            complex._computeSpecificity$0();
+          t3 = complex._maxSpecificity;
+          _this._pseudo$_maxSpecificity = Math.max(H.checkNum(t4), H.checkNum(t3));
+        }
+      }
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitPseudoSelector$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      return other instanceof D.PseudoSelector && other.name === _this.name && other.isClass === _this.isClass && other.argument == _this.argument && J.$eq$(other.selector, _this.selector);
+    },
+    get$hashCode: function(_) {
+      var _this = this;
+      return (C.JSString_methods.get$hashCode(_this.name) ^ C.JSBool_methods.get$hashCode(!_this.isClass) ^ J.get$hashCode$(_this.argument) ^ J.get$hashCode$(_this.selector)) >>> 0;
+    }
+  };
+  D.QualifiedName.prototype = {
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof D.QualifiedName && other.name === this.name && other.namespace == this.namespace;
+    },
+    get$hashCode: function(_) {
+      return C.JSString_methods.get$hashCode(this.name) ^ J.get$hashCode$(this.namespace);
+    },
+    toString$0: function(_) {
+      var t1 = this.namespace,
+        t2 = this.name;
+      return t1 == null ? t2 : t1 + "|" + t2;
+    }
+  };
+  M.SimpleSelector.prototype = {
+    get$minSpecificity: function() {
+      return 1000;
+    },
+    get$maxSpecificity: function() {
+      return this.get$minSpecificity();
+    },
+    addSuffix$1: function(suffix) {
+      return H.throwExpression(E.SassScriptException$('Invalid parent selector "' + this.toString$0(0) + '"'));
+    },
+    unify$1: function(compound) {
+      var result, t1, addedThis, _i, simple, _this = this;
+      if (compound.length === 1 && C.JSArray_methods.get$first(compound) instanceof N.UniversalSelector)
+        return C.JSArray_methods.get$first(compound).unify$1(H.setRuntimeTypeInfo([_this], type$.JSArray_legacy_SimpleSelector));
+      if (C.JSArray_methods.contains$1(compound, _this))
+        return compound;
+      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector);
+      for (t1 = compound.length, addedThis = false, _i = 0; _i < compound.length; compound.length === t1 || (0, H.throwConcurrentModificationError)(compound), ++_i) {
+        simple = compound[_i];
+        if (!addedThis && simple instanceof D.PseudoSelector) {
+          result.push(_this);
+          addedThis = true;
+        }
+        result.push(simple);
+      }
+      if (!addedThis)
+        result.push(_this);
+      return result;
+    }
+  };
+  F.TypeSelector.prototype = {
+    get$minSpecificity: function() {
+      return 1;
+    },
+    accept$1$1: function(visitor) {
+      visitor._serialize$_buffer.write$1(0, this.name);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    addSuffix$1: function(suffix) {
+      var t1 = this.name;
+      return new F.TypeSelector(new D.QualifiedName(t1.name + suffix, t1.namespace));
+    },
+    unify$1: function(compound) {
+      var unified, t1, t2, cur, _i;
+      if (C.JSArray_methods.get$first(compound) instanceof N.UniversalSelector || C.JSArray_methods.get$first(compound) instanceof F.TypeSelector) {
+        unified = Y.unifyUniversalAndElement(this, C.JSArray_methods.get$first(compound));
+        if (unified == null)
+          return null;
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector);
+        t1.push(unified);
+        for (t2 = H.SubListIterable$(compound, 1, null, H._arrayInstanceType(compound)._precomputed1), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+          cur = t2.__internal$_current;
+          t1.push(cur);
+        }
+        return t1;
+      } else {
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector);
+        t1.push(this);
+        for (t2 = compound.length, _i = 0; _i < compound.length; compound.length === t2 || (0, H.throwConcurrentModificationError)(compound), ++_i)
+          t1.push(compound[_i]);
+        return t1;
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof F.TypeSelector && other.name.$eq(0, this.name);
+    },
+    get$hashCode: function(_) {
+      var t1 = this.name;
+      return C.JSString_methods.get$hashCode(t1.name) ^ J.get$hashCode$(t1.namespace);
+    }
+  };
+  N.UniversalSelector.prototype = {
+    get$minSpecificity: function() {
+      return 0;
+    },
+    accept$1$1: function(visitor) {
+      var t2,
+        t1 = this.namespace;
+      if (t1 != null) {
+        t2 = visitor._serialize$_buffer;
+        t2.write$1(0, t1);
+        t2.writeCharCode$1(124);
+      }
+      visitor._serialize$_buffer.writeCharCode$1(42);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unify$1: function(compound) {
+      var unified, t1, t2, cur, _i, _this = this;
+      if (C.JSArray_methods.get$first(compound) instanceof N.UniversalSelector || C.JSArray_methods.get$first(compound) instanceof F.TypeSelector) {
+        unified = Y.unifyUniversalAndElement(_this, C.JSArray_methods.get$first(compound));
+        if (unified == null)
+          return null;
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector);
+        t1.push(unified);
+        for (t2 = H.SubListIterable$(compound, 1, null, H._arrayInstanceType(compound)._precomputed1), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+          cur = t2.__internal$_current;
+          t1.push(cur);
+        }
+        return t1;
+      }
+      t1 = _this.namespace;
+      if (t1 != null && t1 !== "*") {
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector);
+        t1.push(_this);
+        for (t2 = compound.length, _i = 0; _i < compound.length; compound.length === t2 || (0, H.throwConcurrentModificationError)(compound), ++_i)
+          t1.push(compound[_i]);
+        return t1;
+      }
+      if (compound.length !== 0)
+        return compound;
+      return H.setRuntimeTypeInfo([_this], type$.JSArray_legacy_SimpleSelector);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof N.UniversalSelector && other.namespace == this.namespace;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.namespace);
+    }
+  };
+  X._compileStylesheet_closure0.prototype = {
+    call$1: function(url) {
+      var t1, t2, _null = null;
+      if (url === "")
+        t1 = P.Uri_Uri$dataFromString(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(this.stylesheet.span.file._decodedChars, 0, _null), 0, _null), C.C_Utf8Codec, _null).get$_text();
+      else {
+        t1 = P.Uri_parse(url);
+        t2 = this.importCache._async_import_cache$_resultsCache.$index(0, t1);
+        t2 = t2 == null ? _null : t2.get$sourceMapUrl();
+        t1 = (t2 == null ? t1 : t2).toString$0(0);
+      }
+      return t1;
+    },
+    $signature: 4
+  };
+  X.CompileResult.prototype = {};
+  Q.AsyncEnvironment.prototype = {
+    closure$0: function() {
+      var t5, t6, t7, _this = this,
+        t1 = _this._async_environment$_forwardedModules,
+        t2 = _this._async_environment$_forwardedModuleNodes,
+        t3 = _this._async_environment$_nestedForwardedModules,
+        t4 = _this._async_environment$_variables;
+      t4 = H.setRuntimeTypeInfo(t4.slice(0), H._arrayInstanceType(t4));
+      t5 = _this._async_environment$_variableNodes;
+      if (t5 == null)
+        t5 = null;
+      else
+        t5 = H.setRuntimeTypeInfo(t5.slice(0), H._arrayInstanceType(t5));
+      t6 = _this._async_environment$_functions;
+      t6 = H.setRuntimeTypeInfo(t6.slice(0), H._arrayInstanceType(t6));
+      t7 = _this._async_environment$_mixins;
+      t7 = H.setRuntimeTypeInfo(t7.slice(0), H._arrayInstanceType(t7));
+      return Q.AsyncEnvironment$_(_this._async_environment$_modules, _this._async_environment$_namespaceNodes, _this._async_environment$_globalModules, _this._async_environment$_globalModuleNodes, t1, t2, t3, _this._async_environment$_allModules, t4, t5, t6, t7, _this._async_environment$_content);
+    },
+    addModule$3$namespace: function(module, nodeWithSpan, namespace) {
+      var t1, t2, _this = this;
+      if (namespace == null) {
+        _this._async_environment$_globalModules.add$1(0, module);
+        _this._async_environment$_globalModuleNodes.$indexSet(0, module, nodeWithSpan);
+        _this._async_environment$_allModules.push(module);
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.get$first(_this._async_environment$_variables))); t1.moveNext$0();) {
+          t2 = t1.get$current(t1);
+          if (module.get$variables().containsKey$1(t2))
+            throw H.wrapException(E.SassScriptException$(string$.This_ma + H.S(t2) + '".'));
+        }
+      } else {
+        t1 = _this._async_environment$_modules;
+        if (t1.containsKey$1(namespace))
+          throw H.wrapException(E.MultiSpanSassScriptException$(string$.There_ + namespace + '".', "new @use", P.LinkedHashMap_LinkedHashMap$_literal([_this._async_environment$_namespaceNodes.$index(0, namespace).get$span(), "original @use"], type$.legacy_FileSpan, type$.legacy_String)));
+        t1.$indexSet(0, namespace, module);
+        _this._async_environment$_namespaceNodes.$indexSet(0, namespace, nodeWithSpan);
+        _this._async_environment$_allModules.push(module);
+      }
+    },
+    forwardModule$2: function(module, rule) {
+      var view, t1, t2, _this = this;
+      if (_this._async_environment$_forwardedModules == null)
+        _this._async_environment$_forwardedModules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_Module_legacy_AsyncCallable);
+      if (_this._async_environment$_forwardedModuleNodes == null)
+        _this._async_environment$_forwardedModuleNodes = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Module_legacy_AsyncCallable, type$.legacy_AstNode);
+      view = R.ForwardedModuleView_ifNecessary(module, rule, type$.legacy_AsyncCallable);
+      for (t1 = _this._async_environment$_forwardedModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();) {
+        t2 = t1._collection$_current;
+        _this._async_environment$_assertNoConflicts$6(view.get$variables(), t2.get$variables(), view, t2, "variable", rule);
+        _this._async_environment$_assertNoConflicts$6(view.get$functions(view), t2.get$functions(t2), view, t2, "function", rule);
+        _this._async_environment$_assertNoConflicts$6(view.get$mixins(), t2.get$mixins(), view, t2, "mixin", rule);
+      }
+      _this._async_environment$_allModules.push(module);
+      _this._async_environment$_forwardedModules.add$1(0, view);
+      _this._async_environment$_forwardedModuleNodes.$indexSet(0, view, rule);
+    },
+    _async_environment$_assertNoConflicts$6: function(newMembers, oldMembers, newModule, oldModule, type, newModuleNodeWithSpan) {
+      var larger, smaller, t1, t2, $name;
+      if (newMembers.get$length(newMembers) < oldMembers.get$length(oldMembers)) {
+        larger = oldMembers;
+        smaller = newMembers;
+      } else {
+        larger = newMembers;
+        smaller = oldMembers;
+      }
+      for (t1 = J.get$iterator$ax(smaller.get$keys(smaller)), t2 = type === "variable"; t1.moveNext$0();) {
+        $name = t1.get$current(t1);
+        if (!larger.containsKey$1($name))
+          continue;
+        if (t2 ? newModule.variableIdentity$1($name) === oldModule.variableIdentity$1($name) : J.$eq$(larger.$index(0, $name), smaller.$index(0, $name)))
+          continue;
+        if (t2)
+          $name = "$" + H.S($name);
+        throw H.wrapException(E.MultiSpanSassScriptException$("Two forwarded modules both define a " + type + " named " + H.S($name) + ".", "new @forward", P.LinkedHashMap_LinkedHashMap$_literal([this._async_environment$_forwardedModuleNodes.$index(0, oldModule).get$span(), "original @forward"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+    },
+    importForwards$1: function(module) {
+      var t2, t3, t4, t5, forwardedVariableNames, forwardedFunctionNames, forwardedMixinNames, t6, t7, _i, shadowed, t8, _this = this,
+        t1 = module._async_environment$_environment,
+        forwarded = t1._async_environment$_forwardedModules;
+      if (forwarded == null)
+        return;
+      if (_this._async_environment$_forwardedModules != null) {
+        t2 = P.LinkedHashSet_LinkedHashSet(type$.legacy_Module_legacy_AsyncCallable);
+        for (t3 = P._LinkedHashSetIterator$(forwarded, forwarded._collection$_modifications), t4 = _this._async_environment$_globalModules; t3.moveNext$0();) {
+          t5 = t3._collection$_current;
+          if (!_this._async_environment$_forwardedModules.contains$1(0, t5) || !t4.contains$1(0, t5))
+            t2.add$1(0, t5);
+        }
+        forwarded = t2;
+      }
+      if (_this._async_environment$_forwardedModules == null)
+        _this._async_environment$_forwardedModules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_Module_legacy_AsyncCallable);
+      if (_this._async_environment$_forwardedModuleNodes == null)
+        _this._async_environment$_forwardedModuleNodes = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Module_legacy_AsyncCallable, type$.legacy_AstNode);
+      t2 = H._instanceType(forwarded)._eval$1("ExpandIterable<1,String*>");
+      t3 = t2._eval$1("Iterable.E");
+      forwardedVariableNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new Q.AsyncEnvironment_importForwards_closure(), t2), t3);
+      forwardedFunctionNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new Q.AsyncEnvironment_importForwards_closure0(), t2), t3);
+      forwardedMixinNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new Q.AsyncEnvironment_importForwards_closure1(), t2), t3);
+      t2 = _this._async_environment$_variables;
+      t3 = t2.length;
+      if (t3 === 1) {
+        for (t3 = _this._async_environment$_globalModules, t4 = P.List_List$from(t3, true, H._instanceType(t3)._precomputed1), t5 = t4.length, t6 = type$.legacy_AsyncCallable, t7 = _this._async_environment$_globalModuleNodes, _i = 0; _i < t4.length; t4.length === t5 || (0, H.throwConcurrentModificationError)(t4), ++_i) {
+          module = t4[_i];
+          shadowed = B.ShadowedModuleView_ifNecessary(module, forwardedFunctionNames, forwardedMixinNames, forwardedVariableNames, t6);
+          if (shadowed != null) {
+            t3.remove$1(0, module);
+            t8 = shadowed.variables;
+            if (t8.get$isEmpty(t8)) {
+              t8 = shadowed.functions;
+              if (t8.get$isEmpty(t8)) {
+                t8 = shadowed.mixins;
+                if (t8.get$isEmpty(t8)) {
+                  t8 = shadowed._shadowed_view$_inner;
+                  t8 = t8.get$css(t8);
+                  t8 = J.get$isEmpty$asx(t8.get$children(t8));
+                } else
+                  t8 = false;
+              } else
+                t8 = false;
+            } else
+              t8 = false;
+            if (!t8) {
+              t3.add$1(0, shadowed);
+              t7.$indexSet(0, shadowed, t7.remove$1(0, module));
+            }
+          }
+        }
+        t4 = _this._async_environment$_forwardedModules;
+        t4.toString;
+        t4 = P.List_List$from(t4, true, H._instanceType(t4)._precomputed1);
+        t5 = t4.length;
+        _i = 0;
+        for (; _i < t4.length; t4.length === t5 || (0, H.throwConcurrentModificationError)(t4), ++_i) {
+          module = t4[_i];
+          shadowed = B.ShadowedModuleView_ifNecessary(module, forwardedFunctionNames, forwardedMixinNames, forwardedVariableNames, t6);
+          if (shadowed != null) {
+            _this._async_environment$_forwardedModules.remove$1(0, module);
+            t8 = shadowed.variables;
+            if (t8.get$isEmpty(t8)) {
+              t8 = shadowed.functions;
+              if (t8.get$isEmpty(t8)) {
+                t8 = shadowed.mixins;
+                if (t8.get$isEmpty(t8)) {
+                  t8 = shadowed._shadowed_view$_inner;
+                  t8 = t8.get$css(t8);
+                  t8 = J.get$isEmpty$asx(t8.get$children(t8));
+                } else
+                  t8 = false;
+              } else
+                t8 = false;
+            } else
+              t8 = false;
+            if (!t8) {
+              _this._async_environment$_forwardedModules.add$1(0, shadowed);
+              t8 = _this._async_environment$_forwardedModuleNodes;
+              t8.$indexSet(0, shadowed, t8.remove$1(0, module));
+            }
+          }
+        }
+        t3.addAll$1(0, forwarded);
+        t7.addAll$1(0, t1._async_environment$_forwardedModuleNodes);
+        _this._async_environment$_forwardedModules.addAll$1(0, forwarded);
+        _this._async_environment$_forwardedModuleNodes.addAll$1(0, t1._async_environment$_forwardedModuleNodes);
+      } else {
+        t1 = _this._async_environment$_nestedForwardedModules;
+        J.addAll$1$ax(C.JSArray_methods.get$last(t1 == null ? _this._async_environment$_nestedForwardedModules = P.List_List$generate(t3 - 1, new Q.AsyncEnvironment_importForwards_closure2(), true, type$.legacy_List_legacy_Module_legacy_AsyncCallable) : t1), forwarded);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedVariableNames, forwardedVariableNames._collection$_modifications), t3 = _this._async_environment$_variableNodes, t4 = t3 != null, t5 = _this._async_environment$_variableIndices; t1.moveNext$0();) {
+        t6 = t1._collection$_current;
+        t5.remove$1(0, t6);
+        J.remove$1$ax(C.JSArray_methods.get$last(t2), t6);
+        if (t4)
+          J.remove$1$ax(C.JSArray_methods.get$last(t3), t6);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedFunctionNames, forwardedFunctionNames._collection$_modifications), t2 = _this._async_environment$_functionIndices, t3 = _this._async_environment$_functions; t1.moveNext$0();) {
+        t4 = t1._collection$_current;
+        t2.remove$1(0, t4);
+        J.remove$1$ax(C.JSArray_methods.get$last(t3), t4);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedMixinNames, forwardedMixinNames._collection$_modifications), t2 = _this._async_environment$_mixinIndices, t3 = _this._async_environment$_mixins; t1.moveNext$0();) {
+        t4 = t1._collection$_current;
+        t2.remove$1(0, t4);
+        J.remove$1$ax(C.JSArray_methods.get$last(t3), t4);
+      }
+    },
+    getVariable$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._async_environment$_getModule$1(namespace).get$variables().$index(0, $name);
+      if (_this._async_environment$_lastVariableName === $name) {
+        t1 = J.$index$asx(_this._async_environment$_variables[_this._async_environment$_lastVariableIndex], $name);
+        return t1 == null ? _this._async_environment$_getVariableFromGlobalModule$1($name) : t1;
+      }
+      t1 = _this._async_environment$_variableIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        _this._async_environment$_lastVariableName = $name;
+        _this._async_environment$_lastVariableIndex = index;
+        t1 = J.$index$asx(_this._async_environment$_variables[index], $name);
+        return t1 == null ? _this._async_environment$_getVariableFromGlobalModule$1($name) : t1;
+      }
+      index = _this._async_environment$_variableIndex$1($name);
+      if (index == null)
+        return _this._async_environment$_getVariableFromGlobalModule$1($name);
+      _this._async_environment$_lastVariableName = $name;
+      _this._async_environment$_lastVariableIndex = index;
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._async_environment$_variables[index], $name);
+      return t1 == null ? _this._async_environment$_getVariableFromGlobalModule$1($name) : t1;
+    },
+    getVariable$1: function($name) {
+      return this.getVariable$2$namespace($name, null);
+    },
+    _async_environment$_getVariableFromGlobalModule$1: function($name) {
+      return this._async_environment$_fromOneModule$3($name, "variable", new Q.AsyncEnvironment__getVariableFromGlobalModule_closure($name));
+    },
+    getVariableNode$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._async_environment$_getModule$1(namespace).get$variableNodes().$index(0, $name);
+      if (_this._async_environment$_lastVariableName === $name) {
+        t1 = J.$index$asx(_this._async_environment$_variableNodes[_this._async_environment$_lastVariableIndex], $name);
+        return t1 == null ? _this._async_environment$_getVariableNodeFromGlobalModule$1($name) : t1;
+      }
+      t1 = _this._async_environment$_variableIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        _this._async_environment$_lastVariableName = $name;
+        _this._async_environment$_lastVariableIndex = index;
+        t1 = J.$index$asx(_this._async_environment$_variableNodes[index], $name);
+        return t1 == null ? _this._async_environment$_getVariableNodeFromGlobalModule$1($name) : t1;
+      }
+      index = _this._async_environment$_variableIndex$1($name);
+      if (index == null)
+        return _this._async_environment$_getVariableNodeFromGlobalModule$1($name);
+      _this._async_environment$_lastVariableName = $name;
+      _this._async_environment$_lastVariableIndex = index;
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._async_environment$_variableNodes[index], $name);
+      return t1 == null ? _this._async_environment$_getVariableNodeFromGlobalModule$1($name) : t1;
+    },
+    _async_environment$_getVariableNodeFromGlobalModule$1: function($name) {
+      var t1, value;
+      for (t1 = this._async_environment$_globalModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();) {
+        value = t1._collection$_current.get$variableNodes().$index(0, $name);
+        if (value != null)
+          return value;
+      }
+      return null;
+    },
+    globalVariableExists$2$namespace: function($name, namespace) {
+      if (namespace != null)
+        return this._async_environment$_getModule$1(namespace).get$variables().containsKey$1($name);
+      if (C.JSArray_methods.get$first(this._async_environment$_variables).containsKey$1($name))
+        return true;
+      return this._async_environment$_getVariableFromGlobalModule$1($name) != null;
+    },
+    globalVariableExists$1: function($name) {
+      return this.globalVariableExists$2$namespace($name, null);
+    },
+    _async_environment$_variableIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._async_environment$_variables, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    setVariable$5$global$namespace: function($name, value, nodeWithSpan, global, namespace) {
+      var t1, moduleWithName, cur, t2, index, _this = this;
+      if (namespace != null) {
+        _this._async_environment$_getModule$1(namespace).setVariable$3($name, value, nodeWithSpan);
+        return;
+      }
+      if (global || _this._async_environment$_variables.length === 1) {
+        _this._async_environment$_variableIndices.putIfAbsent$2($name, new Q.AsyncEnvironment_setVariable_closure(_this, $name));
+        t1 = _this._async_environment$_variables;
+        if (!C.JSArray_methods.get$first(t1).containsKey$1($name)) {
+          moduleWithName = _this._async_environment$_fromOneModule$3($name, "variable", new Q.AsyncEnvironment_setVariable_closure0($name));
+          if (moduleWithName != null) {
+            moduleWithName.setVariable$3($name, value, nodeWithSpan);
+            return;
+          }
+        }
+        J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, value);
+        t1 = _this._async_environment$_variableNodes;
+        if (t1 != null)
+          J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, nodeWithSpan);
+        return;
+      }
+      if (_this._async_environment$_nestedForwardedModules != null && !_this._async_environment$_variableIndices.containsKey$1($name) && _this._async_environment$_variableIndex$1($name) == null) {
+        t1 = _this._async_environment$_nestedForwardedModules;
+        t1.toString;
+        t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>"));
+        t1 = new H.ListIterator(t1, t1.get$length(t1));
+        for (; t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          for (t2 = J.get$reversed$ax(cur), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+            cur = t2.__internal$_current;
+            if (cur.get$variables().containsKey$1($name)) {
+              cur.setVariable$3($name, value, nodeWithSpan);
+              return;
+            }
+          }
+        }
+      }
+      index = _this._async_environment$_lastVariableName === $name ? _this._async_environment$_lastVariableIndex : _this._async_environment$_variableIndices.putIfAbsent$2($name, new Q.AsyncEnvironment_setVariable_closure1(_this, $name));
+      if (!_this._async_environment$_inSemiGlobalScope && index === 0) {
+        index = _this._async_environment$_variables.length - 1;
+        _this._async_environment$_variableIndices.$indexSet(0, $name, index);
+      }
+      _this._async_environment$_lastVariableName = $name;
+      _this._async_environment$_lastVariableIndex = index;
+      J.$indexSet$ax(_this._async_environment$_variables[index], $name, value);
+      t1 = _this._async_environment$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(t1[index], $name, nodeWithSpan);
+    },
+    setVariable$4$global: function($name, value, nodeWithSpan, global) {
+      return this.setVariable$5$global$namespace($name, value, nodeWithSpan, global, null);
+    },
+    setLocalVariable$3: function($name, value, nodeWithSpan) {
+      var index, _this = this,
+        t1 = _this._async_environment$_variables,
+        t2 = t1.length;
+      _this._async_environment$_lastVariableName = $name;
+      index = _this._async_environment$_lastVariableIndex = t2 - 1;
+      _this._async_environment$_variableIndices.$indexSet(0, $name, index);
+      J.$indexSet$ax(t1[index], $name, value);
+      t1 = _this._async_environment$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(t1[index], $name, nodeWithSpan);
+    },
+    getFunction$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null) {
+        t1 = _this._async_environment$_getModule$1(namespace);
+        return t1.get$functions(t1).$index(0, $name);
+      }
+      t1 = _this._async_environment$_functionIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        t1 = J.$index$asx(_this._async_environment$_functions[index], $name);
+        return t1 == null ? _this._async_environment$_getFunctionFromGlobalModule$1($name) : t1;
+      }
+      index = _this._async_environment$_functionIndex$1($name);
+      if (index == null)
+        return _this._async_environment$_getFunctionFromGlobalModule$1($name);
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._async_environment$_functions[index], $name);
+      return t1 == null ? _this._async_environment$_getFunctionFromGlobalModule$1($name) : t1;
+    },
+    _async_environment$_getFunctionFromGlobalModule$1: function($name) {
+      return this._async_environment$_fromOneModule$3($name, "function", new Q.AsyncEnvironment__getFunctionFromGlobalModule_closure($name));
+    },
+    _async_environment$_functionIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._async_environment$_functions, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    getMixin$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._async_environment$_getModule$1(namespace).get$mixins().$index(0, $name);
+      t1 = _this._async_environment$_mixinIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        t1 = J.$index$asx(_this._async_environment$_mixins[index], $name);
+        return t1 == null ? _this._async_environment$_getMixinFromGlobalModule$1($name) : t1;
+      }
+      index = _this._async_environment$_mixinIndex$1($name);
+      if (index == null)
+        return _this._async_environment$_getMixinFromGlobalModule$1($name);
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._async_environment$_mixins[index], $name);
+      return t1 == null ? _this._async_environment$_getMixinFromGlobalModule$1($name) : t1;
+    },
+    _async_environment$_getMixinFromGlobalModule$1: function($name) {
+      return this._async_environment$_fromOneModule$3($name, "mixin", new Q.AsyncEnvironment__getMixinFromGlobalModule_closure($name));
+    },
+    _async_environment$_mixinIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._async_environment$_mixins, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    withContent$2: function($content, callback) {
+      return this.withContent$body$AsyncEnvironment($content, callback);
+    },
+    withContent$body$AsyncEnvironment: function($content, callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, oldContent;
+      var $async$withContent$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldContent = $async$self._async_environment$_content;
+              $async$self._async_environment$_content = $content;
+              $async$goto = 2;
+              return P._asyncAwait(callback.call$0(), $async$withContent$2);
+            case 2:
+              // returning from await.
+              $async$self._async_environment$_content = oldContent;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$withContent$2, $async$completer);
+    },
+    asMixin$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, oldInMixin;
+      var $async$asMixin$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldInMixin = $async$self._async_environment$_inMixin;
+              $async$self._async_environment$_inMixin = true;
+              $async$goto = 2;
+              return P._asyncAwait(callback.call$0(), $async$asMixin$1);
+            case 2:
+              // returning from await.
+              $async$self._async_environment$_inMixin = oldInMixin;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$asMixin$1, $async$completer);
+    },
+    scope$1$3$semiGlobal$when: function(callback, semiGlobal, when, $T) {
+      return this.scope$body$AsyncEnvironment(callback, semiGlobal, when, $T, $T._eval$1("0*"));
+    },
+    scope$1$1: function(callback, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, false, true, $T);
+    },
+    scope$1$2$when: function(callback, when, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, false, when, $T);
+    },
+    scope$1$2$semiGlobal: function(callback, semiGlobal, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, semiGlobal, true, $T);
+    },
+    scope$body$AsyncEnvironment: function(callback, semiGlobal, when, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, wasInSemiGlobalScope, wasInSemiGlobalScope0, $name, name0, name1, t1, t2, t3, t4, t5;
+      var $async$scope$1$3$semiGlobal$when = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = !when ? 3 : 4;
+              break;
+            case 3:
+              // then
+              wasInSemiGlobalScope = $async$self._async_environment$_inSemiGlobalScope;
+              $async$self._async_environment$_inSemiGlobalScope = semiGlobal;
+              $async$handler = 5;
+              $async$goto = 8;
+              return P._asyncAwait(callback.call$0(), $async$scope$1$3$semiGlobal$when);
+            case 8:
+              // returning from await.
+              t1 = $async$result;
+              $async$returnValue = t1;
+              $async$next = [1];
+              // goto finally
+              $async$goto = 6;
+              break;
+              $async$next.push(7);
+              // goto finally
+              $async$goto = 6;
+              break;
+            case 5:
+              // uncaught
+              $async$next = [2];
+            case 6:
+              // finally
+              $async$handler = 2;
+              $async$self._async_environment$_inSemiGlobalScope = wasInSemiGlobalScope;
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 7:
+              // after finally
+            case 4:
+              // join
+              semiGlobal = semiGlobal && $async$self._async_environment$_inSemiGlobalScope;
+              wasInSemiGlobalScope0 = $async$self._async_environment$_inSemiGlobalScope;
+              $async$self._async_environment$_inSemiGlobalScope = semiGlobal;
+              t1 = $async$self._async_environment$_variables;
+              t2 = type$.legacy_String;
+              C.JSArray_methods.add$1(t1, P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_Value));
+              t3 = $async$self._async_environment$_variableNodes;
+              if (t3 != null)
+                C.JSArray_methods.add$1(t3, P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_AstNode));
+              t3 = $async$self._async_environment$_functions;
+              t4 = type$.legacy_AsyncCallable;
+              C.JSArray_methods.add$1(t3, P.LinkedHashMap_LinkedHashMap$_empty(t2, t4));
+              t5 = $async$self._async_environment$_mixins;
+              C.JSArray_methods.add$1(t5, P.LinkedHashMap_LinkedHashMap$_empty(t2, t4));
+              t4 = $async$self._async_environment$_nestedForwardedModules;
+              if (t4 != null)
+                C.JSArray_methods.add$1(t4, H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_AsyncCallable));
+              $async$handler = 9;
+              $async$goto = 12;
+              return P._asyncAwait(callback.call$0(), $async$scope$1$3$semiGlobal$when);
+            case 12:
+              // returning from await.
+              t2 = $async$result;
+              $async$returnValue = t2;
+              $async$next = [1];
+              // goto finally
+              $async$goto = 10;
+              break;
+              $async$next.push(11);
+              // goto finally
+              $async$goto = 10;
+              break;
+            case 9:
+              // uncaught
+              $async$next = [2];
+            case 10:
+              // finally
+              $async$handler = 2;
+              $async$self._async_environment$_inSemiGlobalScope = wasInSemiGlobalScope0;
+              $async$self._async_environment$_lastVariableIndex = $async$self._async_environment$_lastVariableName = null;
+              for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t1))), t2 = $async$self._async_environment$_variableIndices; t1.moveNext$0();) {
+                $name = t1.get$current(t1);
+                t2.remove$1(0, $name);
+              }
+              for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t3))), t2 = $async$self._async_environment$_functionIndices; t1.moveNext$0();) {
+                name0 = t1.get$current(t1);
+                t2.remove$1(0, name0);
+              }
+              for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t5))), t2 = $async$self._async_environment$_mixinIndices; t1.moveNext$0();) {
+                name1 = t1.get$current(t1);
+                t2.remove$1(0, name1);
+              }
+              t1 = $async$self._async_environment$_nestedForwardedModules;
+              if (t1 != null)
+                C.JSArray_methods.removeLast$0(t1);
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 11:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$scope$1$3$semiGlobal$when, $async$completer);
+    },
+    toImplicitConfiguration$0: function() {
+      var t2, t3, t4, t5, i, values, nodes, t6, t7,
+        t1 = type$.legacy_String,
+        configuration = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_ConfiguredValue);
+      for (t2 = this._async_environment$_variables, t3 = this._async_environment$_variableNodes, t4 = t3 == null, t5 = type$.legacy_AstNode, i = 0; i < t2.length; ++i) {
+        values = t2[i];
+        nodes = t4 ? P.LinkedHashMap_LinkedHashMap$_empty(t1, t5) : t3[i];
+        for (t6 = J.get$iterator$ax(values.get$keys(values)); t6.moveNext$0();) {
+          t7 = t6.get$current(t6);
+          configuration.$indexSet(0, t7, new Z.ConfiguredValue(values.$index(0, t7), null, nodes.$index(0, t7)));
+        }
+      }
+      return new A.Configuration(configuration, null, true);
+    },
+    _async_environment$_getModule$1: function(namespace) {
+      var module = this._async_environment$_modules.$index(0, namespace);
+      if (module != null)
+        return module;
+      throw H.wrapException(E.SassScriptException$('There is no module with the namespace "' + namespace + '".'));
+    },
+    _async_environment$_fromOneModule$1$3: function($name, type, callback) {
+      var cur, t2, value, identity, t3, valueInModule, identityFromModule, t4, t5,
+        t1 = this._async_environment$_nestedForwardedModules;
+      if (t1 != null)
+        for (t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>")), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          for (t2 = J.get$reversed$ax(cur), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+            cur = t2.__internal$_current;
+            value = callback.call$1(cur);
+            if (value != null)
+              return value;
+          }
+        }
+      for (t1 = this._async_environment$_globalModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications), t2 = type$.legacy_AsyncCallable, value = null, identity = null; t1.moveNext$0();) {
+        t3 = t1._collection$_current;
+        valueInModule = callback.call$1(t3);
+        if (valueInModule == null)
+          continue;
+        identityFromModule = t2._is(valueInModule) ? valueInModule : t3.variableIdentity$1($name);
+        if (identityFromModule.$eq(0, identity))
+          continue;
+        if (value != null) {
+          t1 = "This " + type + string$.x20is_av;
+          t2 = type + " use";
+          t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_FileSpan, type$.legacy_String);
+          for (t4 = this._async_environment$_globalModuleNodes, t4 = t4.get$entries(t4), t4 = t4.get$iterator(t4); t4.moveNext$0();) {
+            t5 = t4.get$current(t4);
+            if (callback.call$1(t5.key) != null)
+              t3.$indexSet(0, t5.value.get$span(), "includes " + type);
+          }
+          throw H.wrapException(E.MultiSpanSassScriptException$(t1, t2, t3));
+        }
+        identity = identityFromModule;
+        value = valueInModule;
+      }
+      return value;
+    },
+    _async_environment$_fromOneModule$3: function($name, type, callback) {
+      return this._async_environment$_fromOneModule$1$3($name, type, callback, type$.dynamic);
+    }
+  };
+  Q.AsyncEnvironment_importForwards_closure.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$variables();
+      return t1.get$keys(t1);
+    },
+    $signature: 88
+  };
+  Q.AsyncEnvironment_importForwards_closure0.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$functions(module);
+      return t1.get$keys(t1);
+    },
+    $signature: 88
+  };
+  Q.AsyncEnvironment_importForwards_closure1.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$mixins();
+      return t1.get$keys(t1);
+    },
+    $signature: 88
+  };
+  Q.AsyncEnvironment_importForwards_closure2.prototype = {
+    call$1: function(_) {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_AsyncCallable);
+    },
+    $signature: 424
+  };
+  Q.AsyncEnvironment__getVariableFromGlobalModule_closure.prototype = {
+    call$1: function(module) {
+      return module.get$variables().$index(0, this.name);
+    },
+    $signature: 423
+  };
+  Q.AsyncEnvironment_setVariable_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._async_environment$_lastVariableName = this.name;
+      return t1._async_environment$_lastVariableIndex = 0;
+    },
+    $signature: 11
+  };
+  Q.AsyncEnvironment_setVariable_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$variables().containsKey$1(this.name) ? module : null;
+    },
+    $signature: 140
+  };
+  Q.AsyncEnvironment_setVariable_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._async_environment$_variableIndex$1(this.name);
+      return t2 == null ? t1._async_environment$_variables.length - 1 : t2;
+    },
+    $signature: 11
+  };
+  Q.AsyncEnvironment__getFunctionFromGlobalModule_closure.prototype = {
+    call$1: function(module) {
+      return module.get$functions(module).$index(0, this.name);
+    },
+    $signature: 145
+  };
+  Q.AsyncEnvironment__getMixinFromGlobalModule_closure.prototype = {
+    call$1: function(module) {
+      return module.get$mixins().$index(0, this.name);
+    },
+    $signature: 145
+  };
+  Q._EnvironmentModule0.prototype = {
+    get$url: function() {
+      return this.css.get$span().file.url;
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      var t1, t2,
+        module = this._async_environment$_modulesByVariable.$index(0, $name);
+      if (module != null) {
+        module.setVariable$3($name, value, nodeWithSpan);
+        return;
+      }
+      t1 = this._async_environment$_environment;
+      t2 = t1._async_environment$_variables;
+      if (!C.JSArray_methods.get$first(t2).containsKey$1($name))
+        throw H.wrapException(E.SassScriptException$("Undefined variable."));
+      J.$indexSet$ax(C.JSArray_methods.get$first(t2), $name, value);
+      t1 = t1._async_environment$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, nodeWithSpan);
+      return;
+    },
+    variableIdentity$1: function($name) {
+      var module = this._async_environment$_modulesByVariable.$index(0, $name);
+      return module == null ? this : module.variableIdentity$1($name);
+    },
+    cloneCss$0: function() {
+      var newCssAndExtender, _this = this,
+        t1 = _this.css;
+      if (J.get$isEmpty$asx(t1.get$children(t1)))
+        return _this;
+      newCssAndExtender = V.cloneCssStylesheet(t1, _this.extender);
+      return Q._EnvironmentModule$_0(_this._async_environment$_environment, newCssAndExtender.item1, newCssAndExtender.item2, _this._async_environment$_modulesByVariable, _this.variables, _this.variableNodes, _this.functions, _this.mixins, _this.transitivelyContainsCss, _this.transitivelyContainsExtensions);
+    },
+    toString$0: function(_) {
+      var t1 = this.css;
+      if (t1.get$span().file.url == null)
+        t1 = "<unknown url>";
+      else {
+        t1 = t1.get$span().file;
+        t1 = $.$get$context().prettyUri$1(t1.url);
+      }
+      return t1;
+    },
+    $isModule: 1,
+    get$upstream: function() {
+      return this.upstream;
+    },
+    get$variables: function() {
+      return this.variables;
+    },
+    get$variableNodes: function() {
+      return this.variableNodes;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    },
+    get$extender: function() {
+      return this.extender;
+    },
+    get$css: function(receiver) {
+      return this.css;
+    },
+    get$transitivelyContainsCss: function() {
+      return this.transitivelyContainsCss;
+    },
+    get$transitivelyContainsExtensions: function() {
+      return this.transitivelyContainsExtensions;
+    }
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure5.prototype = {
+    call$1: function(module) {
+      return module.get$variables();
+    },
+    $signature: 418
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure6.prototype = {
+    call$1: function(module) {
+      return module.get$variableNodes();
+    },
+    $signature: 410
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure7.prototype = {
+    call$1: function(module) {
+      return module.get$functions(module);
+    },
+    $signature: 159
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure8.prototype = {
+    call$1: function(module) {
+      return module.get$mixins();
+    },
+    $signature: 159
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure9.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsCss();
+    },
+    $signature: 94
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure10.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsExtensions();
+    },
+    $signature: 94
+  };
+  O.AsyncImportCache.prototype = {
+    canonicalize$4$baseImporter$baseUrl$forImport: function(url, baseImporter, baseUrl, forImport) {
+      return this.canonicalize$body$AsyncImportCache(url, baseImporter, baseUrl, forImport);
+    },
+    canonicalize$body$AsyncImportCache: function(url, baseImporter, baseUrl, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri_2),
+        $async$returnValue, $async$self = this, resolvedUrl, canonicalUrl;
+      var $async$canonicalize$4$baseImporter$baseUrl$forImport = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = baseImporter != null ? 3 : 4;
+              break;
+            case 3:
+              // then
+              resolvedUrl = baseUrl != null ? baseUrl.resolveUri$1(url) : url;
+              $async$goto = 5;
+              return P._asyncAwait($async$self._async_import_cache$_canonicalize$3(baseImporter, resolvedUrl, forImport), $async$canonicalize$4$baseImporter$baseUrl$forImport);
+            case 5:
+              // returning from await.
+              canonicalUrl = $async$result;
+              if (canonicalUrl != null) {
+                $async$returnValue = new S.Tuple3(baseImporter, canonicalUrl, resolvedUrl, type$.Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // join
+              $async$goto = 6;
+              return P._asyncAwait(B.putIfAbsentAsync($async$self._async_import_cache$_canonicalizeCache, new S.Tuple2(url, forImport, type$.Tuple2_of_legacy_Uri_and_legacy_bool), new O.AsyncImportCache_canonicalize_closure($async$self, url, forImport), type$.legacy_Tuple2_of_legacy_Uri_and_legacy_bool, type$.legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri_2), $async$canonicalize$4$baseImporter$baseUrl$forImport);
+            case 6:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$canonicalize$4$baseImporter$baseUrl$forImport, $async$completer);
+    },
+    _async_import_cache$_canonicalize$3: function(importer, url, forImport) {
+      return this._canonicalize$body$AsyncImportCache(importer, url, forImport);
+    },
+    _canonicalize$body$AsyncImportCache: function(importer, url, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Uri),
+        $async$returnValue, $async$self = this, result;
+      var $async$_async_import_cache$_canonicalize$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(forImport ? B.inImportRule(new O.AsyncImportCache__canonicalize_closure(importer, url)) : importer.canonicalize$1(url), $async$_async_import_cache$_canonicalize$3);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              if ((result == null ? null : result.get$scheme()) === "")
+                $async$self._async_import_cache$_logger.warn$2$deprecation(0, "Importer " + H.S(importer) + " canonicalized " + url.toString$0(0) + " to " + H.S(result) + string$.x2e_Rela, true);
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_import_cache$_canonicalize$3, $async$completer);
+    },
+    import$4$baseImporter$baseUrl$forImport: function(url, baseImporter, baseUrl, forImport) {
+      return this.import$body$AsyncImportCache(url, baseImporter, baseUrl, forImport);
+    },
+    import$body$AsyncImportCache: function(url, baseImporter, baseUrl, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet),
+        $async$returnValue, $async$self = this, t1, stylesheet, tuple;
+      var $async$import$4$baseImporter$baseUrl$forImport = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self.canonicalize$4$baseImporter$baseUrl$forImport(url, baseImporter, baseUrl, forImport), $async$import$4$baseImporter$baseUrl$forImport);
+            case 3:
+              // returning from await.
+              tuple = $async$result;
+              if (tuple == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = tuple.item1;
+              $async$goto = 4;
+              return P._asyncAwait($async$self.importCanonical$3(t1, tuple.item2, tuple.item3), $async$import$4$baseImporter$baseUrl$forImport);
+            case 4:
+              // returning from await.
+              stylesheet = $async$result;
+              if (stylesheet == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$returnValue = new S.Tuple2(t1, stylesheet, type$.Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$import$4$baseImporter$baseUrl$forImport, $async$completer);
+    },
+    importCanonical$3: function(importer, canonicalUrl, originalUrl) {
+      return this.importCanonical$body$AsyncImportCache(importer, canonicalUrl, originalUrl);
+    },
+    importCanonical$body$AsyncImportCache: function(importer, canonicalUrl, originalUrl) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Stylesheet_2),
+        $async$returnValue, $async$self = this;
+      var $async$importCanonical$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(B.putIfAbsentAsync($async$self._async_import_cache$_importCache, canonicalUrl, new O.AsyncImportCache_importCanonical_closure($async$self, importer, canonicalUrl, originalUrl), type$.legacy_Uri, type$.legacy_Stylesheet_2), $async$importCanonical$3);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$importCanonical$3, $async$completer);
+    },
+    humanize$1: function(canonicalUrl) {
+      var t2, url,
+        t1 = this._async_import_cache$_canonicalizeCache;
+      t1 = t1.get$values(t1);
+      t2 = H._instanceType(t1);
+      url = Y.minBy(new H.MappedIterable(new H.WhereIterable(t1, new O.AsyncImportCache_humanize_closure(canonicalUrl), t2._eval$1("WhereIterable<Iterable.E>")), new O.AsyncImportCache_humanize_closure0(), t2._eval$1("MappedIterable<Iterable.E,Uri*>")), new O.AsyncImportCache_humanize_closure1(), type$.legacy_Uri, type$.dynamic);
+      if (url == null)
+        return canonicalUrl;
+      t1 = $.$get$url();
+      return url.resolve$1(X.ParsedPath_ParsedPath$parse(canonicalUrl.get$path(canonicalUrl), t1.style).get$basename());
+    }
+  };
+  O.AsyncImportCache_canonicalize_closure.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri_2),
+        $async$returnValue, $async$self = this, t1, t2, t3, t4, t5, _i, importer, canonicalUrl;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this, t2 = t1._async_import_cache$_importers, t3 = t2.length, t4 = $async$self.url, t5 = $async$self.forImport, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2.length)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              importer = t2[_i];
+              $async$goto = 6;
+              return P._asyncAwait(t1._async_import_cache$_canonicalize$3(importer, t4, t5), $async$call$0);
+            case 6:
+              // returning from await.
+              canonicalUrl = $async$result;
+              if (canonicalUrl != null) {
+                $async$returnValue = new S.Tuple3(importer, canonicalUrl, t4, type$.Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 404
+  };
+  O.AsyncImportCache__canonicalize_closure.prototype = {
+    call$0: function() {
+      return this.importer.canonicalize$1(this.url);
+    },
+    $signature: 175
+  };
+  O.AsyncImportCache_importCanonical_closure.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Stylesheet_2),
+        $async$returnValue, $async$self = this, t2, t3, t4, t5, t1, result;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.canonicalUrl;
+              $async$goto = 3;
+              return P._asyncAwait($async$self.importer.load$1(0, t1), $async$call$0);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              if (result == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t2 = $async$self.$this;
+              t2._async_import_cache$_resultsCache.$indexSet(0, t1, result);
+              t3 = result.contents;
+              t4 = result.syntax;
+              t5 = $async$self.originalUrl;
+              t1 = t5 == null ? t1 : t5.resolveUri$1(t1);
+              $async$returnValue = V.Stylesheet_Stylesheet$parse(t3, t4, t2._async_import_cache$_logger, t1);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 402
+  };
+  O.AsyncImportCache_humanize_closure.prototype = {
+    call$1: function(tuple) {
+      var t1 = tuple == null ? null : tuple.item2;
+      return J.$eq$(t1, this.canonicalUrl);
+    },
+    $signature: 390
+  };
+  O.AsyncImportCache_humanize_closure0.prototype = {
+    call$1: function(tuple) {
+      return tuple.item3;
+    },
+    $signature: 387
+  };
+  O.AsyncImportCache_humanize_closure1.prototype = {
+    call$1: function(url) {
+      return J.get$length$asx(J.get$path$x(url));
+    },
+    $signature: 43
+  };
+  S.AsyncBuiltInCallable.prototype = {
+    callbackFor$2: function(positional, names) {
+      return new S.Tuple2(this._async_built_in$_arguments, this._async_built_in$_callback, type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_FutureOr_legacy_Value_Function_legacy_List_legacy_Value);
+    },
+    $isAsyncCallable: 1,
+    get$name: function(receiver) {
+      return this.name;
+    }
+  };
+  S.AsyncBuiltInCallable$mixin_closure.prototype = {
+    call$1: function($arguments) {
+      return this.$call$body$AsyncBuiltInCallable$mixin_closure($arguments);
+    },
+    $call$body$AsyncBuiltInCallable$mixin_closure: function($arguments) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self.callback.call$1($arguments), $async$call$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 126
+  };
+  Q.BuiltInCallable.prototype = {
+    callbackFor$2: function(positional, names) {
+      var t1, t2, fuzzyMatch, minMismatchDistance, _i, overload, t3, mismatchDistance, t4;
+      for (t1 = this._overloads, t2 = t1.length, fuzzyMatch = null, minMismatchDistance = null, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        overload = t1[_i];
+        t3 = overload.item1;
+        if (t3.matches$2(positional, names))
+          return overload;
+        mismatchDistance = t3.$arguments.length - positional;
+        if (minMismatchDistance != null) {
+          t3 = Math.abs(mismatchDistance);
+          t4 = Math.abs(minMismatchDistance);
+          if (t3 > t4)
+            continue;
+          if (t3 === t4 && mismatchDistance < 0)
+            continue;
+        }
+        minMismatchDistance = mismatchDistance;
+        fuzzyMatch = overload;
+      }
+      return fuzzyMatch;
+    },
+    withName$1: function($name) {
+      return new Q.BuiltInCallable($name, this._overloads);
+    },
+    $isCallable: 1,
+    $isAsyncCallable: 1,
+    $isAsyncBuiltInCallable: 1,
+    get$name: function(receiver) {
+      return this.name;
+    }
+  };
+  Q.BuiltInCallable$mixin_closure.prototype = {
+    call$1: function($arguments) {
+      this.callback.call$1($arguments);
+      return null;
+    },
+    $signature: 103
+  };
+  L.PlainCssCallable.prototype = {
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof L.PlainCssCallable && this.name == other.name;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.name);
+    },
+    $isCallable: 1,
+    $isAsyncCallable: 1,
+    get$name: function(receiver) {
+      return this.name;
+    }
+  };
+  E.UserDefinedCallable.prototype = {
+    get$name: function(_) {
+      return this.declaration.name;
+    },
+    $isCallable: 1,
+    $isAsyncCallable: 1
+  };
+  U._compileStylesheet_closure.prototype = {
+    call$1: function(url) {
+      var t1, t2, _null = null;
+      if (url === "")
+        t1 = P.Uri_Uri$dataFromString(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(this.stylesheet.span.file._decodedChars, 0, _null), 0, _null), C.C_Utf8Codec, _null).get$_text();
+      else {
+        t1 = P.Uri_parse(url);
+        t2 = this.importCache._resultsCache.$index(0, t1);
+        t2 = t2 == null ? _null : t2.get$sourceMapUrl();
+        t1 = (t2 == null ? t1 : t2).toString$0(0);
+      }
+      return t1;
+    },
+    $signature: 4
+  };
+  A.Configuration.prototype = {
+    throughForward$1: function($forward) {
+      var t1, t2,
+        newValues = this._values;
+      if (newValues.get$isEmpty(newValues))
+        return C.Configuration_Map_empty_null_true;
+      t1 = $forward.prefix;
+      if (t1 != null)
+        newValues = new R.UnprefixedMapView(newValues, t1, type$.UnprefixedMapView_legacy_ConfiguredValue);
+      t1 = $forward.shownVariables;
+      if (t1 != null)
+        newValues = new K.LimitedMapView(newValues, t1._base.intersection$1(new M.MapKeySet(newValues, type$.MapKeySet_legacy_Object)), type$.LimitedMapView_of_legacy_String_and_legacy_ConfiguredValue);
+      else {
+        t1 = $forward.hiddenVariables;
+        if (t1 == null)
+          t2 = null;
+        else {
+          t2 = t1._base;
+          t2 = t2.get$isNotEmpty(t2);
+        }
+        if (t2 === true)
+          newValues = K.LimitedMapView$blocklist(newValues, t1, type$.legacy_String, type$.legacy_ConfiguredValue);
+      }
+      return this.isImplicit ? new A.Configuration(newValues, null, true) : new A.Configuration(newValues, this.nodeWithSpan, false);
+    }
+  };
+  Z.ConfiguredValue.prototype = {};
+  O.Environment.prototype = {
+    closure$0: function() {
+      var t5, t6, t7, _this = this,
+        t1 = _this._forwardedModules,
+        t2 = _this._forwardedModuleNodes,
+        t3 = _this._nestedForwardedModules,
+        t4 = _this._variables;
+      t4 = H.setRuntimeTypeInfo(t4.slice(0), H._arrayInstanceType(t4));
+      t5 = _this._variableNodes;
+      if (t5 == null)
+        t5 = null;
+      else
+        t5 = H.setRuntimeTypeInfo(t5.slice(0), H._arrayInstanceType(t5));
+      t6 = _this._functions;
+      t6 = H.setRuntimeTypeInfo(t6.slice(0), H._arrayInstanceType(t6));
+      t7 = _this._mixins;
+      t7 = H.setRuntimeTypeInfo(t7.slice(0), H._arrayInstanceType(t7));
+      return O.Environment$_(_this._environment$_modules, _this._namespaceNodes, _this._globalModules, _this._globalModuleNodes, t1, t2, t3, _this._allModules, t4, t5, t6, t7, _this._content);
+    },
+    addModule$3$namespace: function(module, nodeWithSpan, namespace) {
+      var t1, t2, _this = this;
+      if (namespace == null) {
+        _this._globalModules.add$1(0, module);
+        _this._globalModuleNodes.$indexSet(0, module, nodeWithSpan);
+        _this._allModules.push(module);
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.get$first(_this._variables))); t1.moveNext$0();) {
+          t2 = t1.get$current(t1);
+          if (module.get$variables().containsKey$1(t2))
+            throw H.wrapException(E.SassScriptException$(string$.This_ma + H.S(t2) + '".'));
+        }
+      } else {
+        t1 = _this._environment$_modules;
+        if (t1.containsKey$1(namespace))
+          throw H.wrapException(E.MultiSpanSassScriptException$(string$.There_ + namespace + '".', "new @use", P.LinkedHashMap_LinkedHashMap$_literal([_this._namespaceNodes.$index(0, namespace).get$span(), "original @use"], type$.legacy_FileSpan, type$.legacy_String)));
+        t1.$indexSet(0, namespace, module);
+        _this._namespaceNodes.$indexSet(0, namespace, nodeWithSpan);
+        _this._allModules.push(module);
+      }
+    },
+    forwardModule$2: function(module, rule) {
+      var view, t1, t2, _this = this;
+      if (_this._forwardedModules == null)
+        _this._forwardedModules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_Module_legacy_Callable);
+      if (_this._forwardedModuleNodes == null)
+        _this._forwardedModuleNodes = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Module_legacy_Callable, type$.legacy_AstNode);
+      view = R.ForwardedModuleView_ifNecessary(module, rule, type$.legacy_Callable);
+      for (t1 = _this._forwardedModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();) {
+        t2 = t1._collection$_current;
+        _this._assertNoConflicts$6(view.get$variables(), t2.get$variables(), view, t2, "variable", rule);
+        _this._assertNoConflicts$6(view.get$functions(view), t2.get$functions(t2), view, t2, "function", rule);
+        _this._assertNoConflicts$6(view.get$mixins(), t2.get$mixins(), view, t2, "mixin", rule);
+      }
+      _this._allModules.push(module);
+      _this._forwardedModules.add$1(0, view);
+      _this._forwardedModuleNodes.$indexSet(0, view, rule);
+    },
+    _assertNoConflicts$6: function(newMembers, oldMembers, newModule, oldModule, type, newModuleNodeWithSpan) {
+      var larger, smaller, t1, t2, $name;
+      if (newMembers.get$length(newMembers) < oldMembers.get$length(oldMembers)) {
+        larger = oldMembers;
+        smaller = newMembers;
+      } else {
+        larger = newMembers;
+        smaller = oldMembers;
+      }
+      for (t1 = J.get$iterator$ax(smaller.get$keys(smaller)), t2 = type === "variable"; t1.moveNext$0();) {
+        $name = t1.get$current(t1);
+        if (!larger.containsKey$1($name))
+          continue;
+        if (t2 ? newModule.variableIdentity$1($name) === oldModule.variableIdentity$1($name) : J.$eq$(larger.$index(0, $name), smaller.$index(0, $name)))
+          continue;
+        if (t2)
+          $name = "$" + H.S($name);
+        throw H.wrapException(E.MultiSpanSassScriptException$("Two forwarded modules both define a " + type + " named " + H.S($name) + ".", "new @forward", P.LinkedHashMap_LinkedHashMap$_literal([this._forwardedModuleNodes.$index(0, oldModule).get$span(), "original @forward"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+    },
+    importForwards$1: function(module) {
+      var t2, t3, t4, t5, forwardedVariableNames, forwardedFunctionNames, forwardedMixinNames, t6, t7, _i, shadowed, t8, _this = this,
+        t1 = module._environment,
+        forwarded = t1._forwardedModules;
+      if (forwarded == null)
+        return;
+      if (_this._forwardedModules != null) {
+        t2 = P.LinkedHashSet_LinkedHashSet(type$.legacy_Module_legacy_Callable);
+        for (t3 = P._LinkedHashSetIterator$(forwarded, forwarded._collection$_modifications), t4 = _this._globalModules; t3.moveNext$0();) {
+          t5 = t3._collection$_current;
+          if (!_this._forwardedModules.contains$1(0, t5) || !t4.contains$1(0, t5))
+            t2.add$1(0, t5);
+        }
+        forwarded = t2;
+      }
+      if (_this._forwardedModules == null)
+        _this._forwardedModules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_Module_legacy_Callable);
+      if (_this._forwardedModuleNodes == null)
+        _this._forwardedModuleNodes = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Module_legacy_Callable, type$.legacy_AstNode);
+      t2 = H._instanceType(forwarded)._eval$1("ExpandIterable<1,String*>");
+      t3 = t2._eval$1("Iterable.E");
+      forwardedVariableNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new O.Environment_importForwards_closure(), t2), t3);
+      forwardedFunctionNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new O.Environment_importForwards_closure0(), t2), t3);
+      forwardedMixinNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new O.Environment_importForwards_closure1(), t2), t3);
+      t2 = _this._variables;
+      t3 = t2.length;
+      if (t3 === 1) {
+        for (t3 = _this._globalModules, t4 = P.List_List$from(t3, true, H._instanceType(t3)._precomputed1), t5 = t4.length, t6 = type$.legacy_Callable, t7 = _this._globalModuleNodes, _i = 0; _i < t4.length; t4.length === t5 || (0, H.throwConcurrentModificationError)(t4), ++_i) {
+          module = t4[_i];
+          shadowed = B.ShadowedModuleView_ifNecessary(module, forwardedFunctionNames, forwardedMixinNames, forwardedVariableNames, t6);
+          if (shadowed != null) {
+            t3.remove$1(0, module);
+            t8 = shadowed.variables;
+            if (t8.get$isEmpty(t8)) {
+              t8 = shadowed.functions;
+              if (t8.get$isEmpty(t8)) {
+                t8 = shadowed.mixins;
+                if (t8.get$isEmpty(t8)) {
+                  t8 = shadowed._shadowed_view$_inner;
+                  t8 = t8.get$css(t8);
+                  t8 = J.get$isEmpty$asx(t8.get$children(t8));
+                } else
+                  t8 = false;
+              } else
+                t8 = false;
+            } else
+              t8 = false;
+            if (!t8) {
+              t3.add$1(0, shadowed);
+              t7.$indexSet(0, shadowed, t7.remove$1(0, module));
+            }
+          }
+        }
+        t4 = _this._forwardedModules;
+        t4.toString;
+        t4 = P.List_List$from(t4, true, H._instanceType(t4)._precomputed1);
+        t5 = t4.length;
+        _i = 0;
+        for (; _i < t4.length; t4.length === t5 || (0, H.throwConcurrentModificationError)(t4), ++_i) {
+          module = t4[_i];
+          shadowed = B.ShadowedModuleView_ifNecessary(module, forwardedFunctionNames, forwardedMixinNames, forwardedVariableNames, t6);
+          if (shadowed != null) {
+            _this._forwardedModules.remove$1(0, module);
+            t8 = shadowed.variables;
+            if (t8.get$isEmpty(t8)) {
+              t8 = shadowed.functions;
+              if (t8.get$isEmpty(t8)) {
+                t8 = shadowed.mixins;
+                if (t8.get$isEmpty(t8)) {
+                  t8 = shadowed._shadowed_view$_inner;
+                  t8 = t8.get$css(t8);
+                  t8 = J.get$isEmpty$asx(t8.get$children(t8));
+                } else
+                  t8 = false;
+              } else
+                t8 = false;
+            } else
+              t8 = false;
+            if (!t8) {
+              _this._forwardedModules.add$1(0, shadowed);
+              t8 = _this._forwardedModuleNodes;
+              t8.$indexSet(0, shadowed, t8.remove$1(0, module));
+            }
+          }
+        }
+        t3.addAll$1(0, forwarded);
+        t7.addAll$1(0, t1._forwardedModuleNodes);
+        _this._forwardedModules.addAll$1(0, forwarded);
+        _this._forwardedModuleNodes.addAll$1(0, t1._forwardedModuleNodes);
+      } else {
+        t1 = _this._nestedForwardedModules;
+        J.addAll$1$ax(C.JSArray_methods.get$last(t1 == null ? _this._nestedForwardedModules = P.List_List$generate(t3 - 1, new O.Environment_importForwards_closure2(), true, type$.legacy_List_legacy_Module_legacy_Callable) : t1), forwarded);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedVariableNames, forwardedVariableNames._collection$_modifications), t3 = _this._variableNodes, t4 = t3 != null, t5 = _this._variableIndices; t1.moveNext$0();) {
+        t6 = t1._collection$_current;
+        t5.remove$1(0, t6);
+        J.remove$1$ax(C.JSArray_methods.get$last(t2), t6);
+        if (t4)
+          J.remove$1$ax(C.JSArray_methods.get$last(t3), t6);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedFunctionNames, forwardedFunctionNames._collection$_modifications), t2 = _this._functionIndices, t3 = _this._functions; t1.moveNext$0();) {
+        t4 = t1._collection$_current;
+        t2.remove$1(0, t4);
+        J.remove$1$ax(C.JSArray_methods.get$last(t3), t4);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedMixinNames, forwardedMixinNames._collection$_modifications), t2 = _this._mixinIndices, t3 = _this._mixins; t1.moveNext$0();) {
+        t4 = t1._collection$_current;
+        t2.remove$1(0, t4);
+        J.remove$1$ax(C.JSArray_methods.get$last(t3), t4);
+      }
+    },
+    getVariable$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._getModule$1(namespace).get$variables().$index(0, $name);
+      if (_this._lastVariableName === $name) {
+        t1 = J.$index$asx(_this._variables[_this._lastVariableIndex], $name);
+        return t1 == null ? _this._getVariableFromGlobalModule$1($name) : t1;
+      }
+      t1 = _this._variableIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        _this._lastVariableName = $name;
+        _this._lastVariableIndex = index;
+        t1 = J.$index$asx(_this._variables[index], $name);
+        return t1 == null ? _this._getVariableFromGlobalModule$1($name) : t1;
+      }
+      index = _this._variableIndex$1($name);
+      if (index == null)
+        return _this._getVariableFromGlobalModule$1($name);
+      _this._lastVariableName = $name;
+      _this._lastVariableIndex = index;
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._variables[index], $name);
+      return t1 == null ? _this._getVariableFromGlobalModule$1($name) : t1;
+    },
+    getVariable$1: function($name) {
+      return this.getVariable$2$namespace($name, null);
+    },
+    _getVariableFromGlobalModule$1: function($name) {
+      return this._fromOneModule$3($name, "variable", new O.Environment__getVariableFromGlobalModule_closure($name));
+    },
+    getVariableNode$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._getModule$1(namespace).get$variableNodes().$index(0, $name);
+      if (_this._lastVariableName === $name) {
+        t1 = J.$index$asx(_this._variableNodes[_this._lastVariableIndex], $name);
+        return t1 == null ? _this._getVariableNodeFromGlobalModule$1($name) : t1;
+      }
+      t1 = _this._variableIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        _this._lastVariableName = $name;
+        _this._lastVariableIndex = index;
+        t1 = J.$index$asx(_this._variableNodes[index], $name);
+        return t1 == null ? _this._getVariableNodeFromGlobalModule$1($name) : t1;
+      }
+      index = _this._variableIndex$1($name);
+      if (index == null)
+        return _this._getVariableNodeFromGlobalModule$1($name);
+      _this._lastVariableName = $name;
+      _this._lastVariableIndex = index;
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._variableNodes[index], $name);
+      return t1 == null ? _this._getVariableNodeFromGlobalModule$1($name) : t1;
+    },
+    _getVariableNodeFromGlobalModule$1: function($name) {
+      var t1, value;
+      for (t1 = this._globalModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();) {
+        value = t1._collection$_current.get$variableNodes().$index(0, $name);
+        if (value != null)
+          return value;
+      }
+      return null;
+    },
+    globalVariableExists$2$namespace: function($name, namespace) {
+      if (namespace != null)
+        return this._getModule$1(namespace).get$variables().containsKey$1($name);
+      if (C.JSArray_methods.get$first(this._variables).containsKey$1($name))
+        return true;
+      return this._getVariableFromGlobalModule$1($name) != null;
+    },
+    globalVariableExists$1: function($name) {
+      return this.globalVariableExists$2$namespace($name, null);
+    },
+    _variableIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._variables, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    setVariable$5$global$namespace: function($name, value, nodeWithSpan, global, namespace) {
+      var t1, moduleWithName, cur, t2, index, _this = this;
+      if (namespace != null) {
+        _this._getModule$1(namespace).setVariable$3($name, value, nodeWithSpan);
+        return;
+      }
+      if (global || _this._variables.length === 1) {
+        _this._variableIndices.putIfAbsent$2($name, new O.Environment_setVariable_closure(_this, $name));
+        t1 = _this._variables;
+        if (!C.JSArray_methods.get$first(t1).containsKey$1($name)) {
+          moduleWithName = _this._fromOneModule$3($name, "variable", new O.Environment_setVariable_closure0($name));
+          if (moduleWithName != null) {
+            moduleWithName.setVariable$3($name, value, nodeWithSpan);
+            return;
+          }
+        }
+        J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, value);
+        t1 = _this._variableNodes;
+        if (t1 != null)
+          J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, nodeWithSpan);
+        return;
+      }
+      if (_this._nestedForwardedModules != null && !_this._variableIndices.containsKey$1($name) && _this._variableIndex$1($name) == null) {
+        t1 = _this._nestedForwardedModules;
+        t1.toString;
+        t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>"));
+        t1 = new H.ListIterator(t1, t1.get$length(t1));
+        for (; t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          for (t2 = J.get$reversed$ax(cur), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+            cur = t2.__internal$_current;
+            if (cur.get$variables().containsKey$1($name)) {
+              cur.setVariable$3($name, value, nodeWithSpan);
+              return;
+            }
+          }
+        }
+      }
+      index = _this._lastVariableName === $name ? _this._lastVariableIndex : _this._variableIndices.putIfAbsent$2($name, new O.Environment_setVariable_closure1(_this, $name));
+      if (!_this._inSemiGlobalScope && index === 0) {
+        index = _this._variables.length - 1;
+        _this._variableIndices.$indexSet(0, $name, index);
+      }
+      _this._lastVariableName = $name;
+      _this._lastVariableIndex = index;
+      J.$indexSet$ax(_this._variables[index], $name, value);
+      t1 = _this._variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(t1[index], $name, nodeWithSpan);
+    },
+    setVariable$4$global: function($name, value, nodeWithSpan, global) {
+      return this.setVariable$5$global$namespace($name, value, nodeWithSpan, global, null);
+    },
+    setLocalVariable$3: function($name, value, nodeWithSpan) {
+      var index, _this = this,
+        t1 = _this._variables,
+        t2 = t1.length;
+      _this._lastVariableName = $name;
+      index = _this._lastVariableIndex = t2 - 1;
+      _this._variableIndices.$indexSet(0, $name, index);
+      J.$indexSet$ax(t1[index], $name, value);
+      t1 = _this._variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(t1[index], $name, nodeWithSpan);
+    },
+    getFunction$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null) {
+        t1 = _this._getModule$1(namespace);
+        return t1.get$functions(t1).$index(0, $name);
+      }
+      t1 = _this._functionIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        t1 = J.$index$asx(_this._functions[index], $name);
+        return t1 == null ? _this._getFunctionFromGlobalModule$1($name) : t1;
+      }
+      index = _this._functionIndex$1($name);
+      if (index == null)
+        return _this._getFunctionFromGlobalModule$1($name);
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._functions[index], $name);
+      return t1 == null ? _this._getFunctionFromGlobalModule$1($name) : t1;
+    },
+    _getFunctionFromGlobalModule$1: function($name) {
+      return this._fromOneModule$3($name, "function", new O.Environment__getFunctionFromGlobalModule_closure($name));
+    },
+    _functionIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._functions, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    getMixin$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._getModule$1(namespace).get$mixins().$index(0, $name);
+      t1 = _this._mixinIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        t1 = J.$index$asx(_this._mixins[index], $name);
+        return t1 == null ? _this._getMixinFromGlobalModule$1($name) : t1;
+      }
+      index = _this._mixinIndex$1($name);
+      if (index == null)
+        return _this._getMixinFromGlobalModule$1($name);
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._mixins[index], $name);
+      return t1 == null ? _this._getMixinFromGlobalModule$1($name) : t1;
+    },
+    _getMixinFromGlobalModule$1: function($name) {
+      return this._fromOneModule$3($name, "mixin", new O.Environment__getMixinFromGlobalModule_closure($name));
+    },
+    _mixinIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._mixins, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    scope$1$3$semiGlobal$when: function(callback, semiGlobal, when) {
+      var wasInSemiGlobalScope, wasInSemiGlobalScope0, $name, name0, name1, t1, t2, t3, t4, t5, _this = this;
+      if (!when) {
+        wasInSemiGlobalScope = _this._inSemiGlobalScope;
+        _this._inSemiGlobalScope = semiGlobal;
+        try {
+          t1 = callback.call$0();
+          return t1;
+        } finally {
+          _this._inSemiGlobalScope = wasInSemiGlobalScope;
+        }
+      }
+      semiGlobal = semiGlobal && _this._inSemiGlobalScope;
+      wasInSemiGlobalScope0 = _this._inSemiGlobalScope;
+      _this._inSemiGlobalScope = semiGlobal;
+      t1 = _this._variables;
+      t2 = type$.legacy_String;
+      C.JSArray_methods.add$1(t1, P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_Value));
+      t3 = _this._variableNodes;
+      if (t3 != null)
+        C.JSArray_methods.add$1(t3, P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_AstNode));
+      t3 = _this._functions;
+      t4 = type$.legacy_Callable;
+      C.JSArray_methods.add$1(t3, P.LinkedHashMap_LinkedHashMap$_empty(t2, t4));
+      t5 = _this._mixins;
+      C.JSArray_methods.add$1(t5, P.LinkedHashMap_LinkedHashMap$_empty(t2, t4));
+      t4 = _this._nestedForwardedModules;
+      if (t4 != null)
+        C.JSArray_methods.add$1(t4, H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_Callable));
+      try {
+        t2 = callback.call$0();
+        return t2;
+      } finally {
+        _this._inSemiGlobalScope = wasInSemiGlobalScope0;
+        _this._lastVariableIndex = _this._lastVariableName = null;
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t1))), t2 = _this._variableIndices; t1.moveNext$0();) {
+          $name = t1.get$current(t1);
+          t2.remove$1(0, $name);
+        }
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t3))), t2 = _this._functionIndices; t1.moveNext$0();) {
+          name0 = t1.get$current(t1);
+          t2.remove$1(0, name0);
+        }
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t5))), t2 = _this._mixinIndices; t1.moveNext$0();) {
+          name1 = t1.get$current(t1);
+          t2.remove$1(0, name1);
+        }
+        t1 = _this._nestedForwardedModules;
+        if (t1 != null)
+          C.JSArray_methods.removeLast$0(t1);
+      }
+    },
+    scope$1$1: function(callback, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, false, true, $T);
+    },
+    scope$1$2$when: function(callback, when, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, false, when, $T);
+    },
+    scope$1$2$semiGlobal: function(callback, semiGlobal, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, semiGlobal, true, $T);
+    },
+    toImplicitConfiguration$0: function() {
+      var t2, t3, t4, t5, i, values, nodes, t6, t7,
+        t1 = type$.legacy_String,
+        configuration = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_ConfiguredValue);
+      for (t2 = this._variables, t3 = this._variableNodes, t4 = t3 == null, t5 = type$.legacy_AstNode, i = 0; i < t2.length; ++i) {
+        values = t2[i];
+        nodes = t4 ? P.LinkedHashMap_LinkedHashMap$_empty(t1, t5) : t3[i];
+        for (t6 = J.get$iterator$ax(values.get$keys(values)); t6.moveNext$0();) {
+          t7 = t6.get$current(t6);
+          configuration.$indexSet(0, t7, new Z.ConfiguredValue(values.$index(0, t7), null, nodes.$index(0, t7)));
+        }
+      }
+      return new A.Configuration(configuration, null, true);
+    },
+    _getModule$1: function(namespace) {
+      var module = this._environment$_modules.$index(0, namespace);
+      if (module != null)
+        return module;
+      throw H.wrapException(E.SassScriptException$('There is no module with the namespace "' + namespace + '".'));
+    },
+    _fromOneModule$1$3: function($name, type, callback) {
+      var cur, t2, value, identity, t3, valueInModule, identityFromModule, t4, t5,
+        t1 = this._nestedForwardedModules;
+      if (t1 != null)
+        for (t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>")), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          for (t2 = J.get$reversed$ax(cur), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+            cur = t2.__internal$_current;
+            value = callback.call$1(cur);
+            if (value != null)
+              return value;
+          }
+        }
+      for (t1 = this._globalModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications), t2 = type$.legacy_Callable, value = null, identity = null; t1.moveNext$0();) {
+        t3 = t1._collection$_current;
+        valueInModule = callback.call$1(t3);
+        if (valueInModule == null)
+          continue;
+        identityFromModule = t2._is(valueInModule) ? valueInModule : t3.variableIdentity$1($name);
+        if (identityFromModule.$eq(0, identity))
+          continue;
+        if (value != null) {
+          t1 = "This " + type + string$.x20is_av;
+          t2 = type + " use";
+          t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_FileSpan, type$.legacy_String);
+          for (t4 = this._globalModuleNodes, t4 = t4.get$entries(t4), t4 = t4.get$iterator(t4); t4.moveNext$0();) {
+            t5 = t4.get$current(t4);
+            if (callback.call$1(t5.key) != null)
+              t3.$indexSet(0, t5.value.get$span(), "includes " + type);
+          }
+          throw H.wrapException(E.MultiSpanSassScriptException$(t1, t2, t3));
+        }
+        identity = identityFromModule;
+        value = valueInModule;
+      }
+      return value;
+    },
+    _fromOneModule$3: function($name, type, callback) {
+      return this._fromOneModule$1$3($name, type, callback, type$.dynamic);
+    }
+  };
+  O.Environment_importForwards_closure.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$variables();
+      return t1.get$keys(t1);
+    },
+    $signature: 119
+  };
+  O.Environment_importForwards_closure0.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$functions(module);
+      return t1.get$keys(t1);
+    },
+    $signature: 119
+  };
+  O.Environment_importForwards_closure1.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$mixins();
+      return t1.get$keys(t1);
+    },
+    $signature: 119
+  };
+  O.Environment_importForwards_closure2.prototype = {
+    call$1: function(_) {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_Callable);
+    },
+    $signature: 386
+  };
+  O.Environment__getVariableFromGlobalModule_closure.prototype = {
+    call$1: function(module) {
+      return module.get$variables().$index(0, this.name);
+    },
+    $signature: 377
+  };
+  O.Environment_setVariable_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._lastVariableName = this.name;
+      return t1._lastVariableIndex = 0;
+    },
+    $signature: 11
+  };
+  O.Environment_setVariable_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$variables().containsKey$1(this.name) ? module : null;
+    },
+    $signature: 127
+  };
+  O.Environment_setVariable_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._variableIndex$1(this.name);
+      return t2 == null ? t1._variables.length - 1 : t2;
+    },
+    $signature: 11
+  };
+  O.Environment__getFunctionFromGlobalModule_closure.prototype = {
+    call$1: function(module) {
+      return module.get$functions(module).$index(0, this.name);
+    },
+    $signature: 128
+  };
+  O.Environment__getMixinFromGlobalModule_closure.prototype = {
+    call$1: function(module) {
+      return module.get$mixins().$index(0, this.name);
+    },
+    $signature: 128
+  };
+  O._EnvironmentModule.prototype = {
+    get$url: function() {
+      return this.css.get$span().file.url;
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      var t1, t2,
+        module = this._modulesByVariable.$index(0, $name);
+      if (module != null) {
+        module.setVariable$3($name, value, nodeWithSpan);
+        return;
+      }
+      t1 = this._environment;
+      t2 = t1._variables;
+      if (!C.JSArray_methods.get$first(t2).containsKey$1($name))
+        throw H.wrapException(E.SassScriptException$("Undefined variable."));
+      J.$indexSet$ax(C.JSArray_methods.get$first(t2), $name, value);
+      t1 = t1._variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, nodeWithSpan);
+      return;
+    },
+    variableIdentity$1: function($name) {
+      var module = this._modulesByVariable.$index(0, $name);
+      return module == null ? this : module.variableIdentity$1($name);
+    },
+    cloneCss$0: function() {
+      var newCssAndExtender, _this = this,
+        t1 = _this.css;
+      if (J.get$isEmpty$asx(t1.get$children(t1)))
+        return _this;
+      newCssAndExtender = V.cloneCssStylesheet(t1, _this.extender);
+      return O._EnvironmentModule$_(_this._environment, newCssAndExtender.item1, newCssAndExtender.item2, _this._modulesByVariable, _this.variables, _this.variableNodes, _this.functions, _this.mixins, _this.transitivelyContainsCss, _this.transitivelyContainsExtensions);
+    },
+    toString$0: function(_) {
+      var t1 = this.css;
+      if (t1.get$span().file.url == null)
+        t1 = "<unknown url>";
+      else {
+        t1 = t1.get$span().file;
+        t1 = $.$get$context().prettyUri$1(t1.url);
+      }
+      return t1;
+    },
+    $isModule: 1,
+    get$upstream: function() {
+      return this.upstream;
+    },
+    get$variables: function() {
+      return this.variables;
+    },
+    get$variableNodes: function() {
+      return this.variableNodes;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    },
+    get$extender: function() {
+      return this.extender;
+    },
+    get$css: function(receiver) {
+      return this.css;
+    },
+    get$transitivelyContainsCss: function() {
+      return this.transitivelyContainsCss;
+    },
+    get$transitivelyContainsExtensions: function() {
+      return this.transitivelyContainsExtensions;
+    }
+  };
+  O._EnvironmentModule__EnvironmentModule_closure.prototype = {
+    call$1: function(module) {
+      return module.get$variables();
+    },
+    $signature: 375
+  };
+  O._EnvironmentModule__EnvironmentModule_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$variableNodes();
+    },
+    $signature: 374
+  };
+  O._EnvironmentModule__EnvironmentModule_closure1.prototype = {
+    call$1: function(module) {
+      return module.get$functions(module);
+    },
+    $signature: 137
+  };
+  O._EnvironmentModule__EnvironmentModule_closure2.prototype = {
+    call$1: function(module) {
+      return module.get$mixins();
+    },
+    $signature: 137
+  };
+  O._EnvironmentModule__EnvironmentModule_closure3.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsCss();
+    },
+    $signature: 122
+  };
+  O._EnvironmentModule__EnvironmentModule_closure4.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsExtensions();
+    },
+    $signature: 122
+  };
+  E.SassException.prototype = {
+    get$trace: function(_) {
+      return new Y.Trace(P.List_List$unmodifiable(H.setRuntimeTypeInfo([B.frameForSpan(G.SourceSpanException.prototype.get$span.call(this), "root stylesheet", null)], type$.JSArray_legacy_Frame), type$.legacy_Frame), new P._StringStackTrace(null));
+    },
+    get$span: function() {
+      return G.SourceSpanException.prototype.get$span.call(this);
+    },
+    toString$1$color: function(_, color) {
+      var t2, _i, frame, t3, _this = this,
+        buffer = new P.StringBuffer(""),
+        t1 = "Error: " + H.S(_this._span_exception$_message) + "\n";
+      buffer._contents = t1;
+      buffer._contents = t1 + G.SourceSpanException.prototype.get$span.call(_this).highlight$1$color(color);
+      for (t1 = _this.get$trace(_this).toString$0(0).split("\n"), t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        frame = t1[_i];
+        frame.toString;
+        if (J.get$length$asx(frame) === 0)
+          continue;
+        t3 = buffer._contents += "\n";
+        buffer._contents = t3 + ("  " + H.S(frame));
+      }
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    toString$0: function($receiver) {
+      return this.toString$1$color($receiver, null);
+    },
+    toCssString$0: function() {
+      var stringMessage, rune,
+        t1 = $._glyphs,
+        t2 = $._glyphs = C.C_AsciiGlyphSet,
+        t3 = this.toString$1$color(0, false),
+        commentMessage = H.stringReplaceAllUnchecked(t3, "*/", "*\u2215");
+      $._glyphs = t1 === C.C_AsciiGlyphSet ? t2 : C.C_UnicodeGlyphSet;
+      stringMessage = new P.StringBuffer("");
+      for (t1 = P.RuneIterator$(N.serializeValue0(new D.SassString(this.toString$1$color(0, false), true), true, true)); t1.moveNext$0();) {
+        rune = t1._currentCodePoint;
+        if (rune > 255) {
+          stringMessage._contents += H.Primitives_stringFromCharCode(92);
+          stringMessage._contents += C.JSInt_methods.toRadixString$1(rune, 16);
+          t2 = stringMessage._contents += H.Primitives_stringFromCharCode(32);
+        } else
+          t2 = stringMessage._contents += H.Primitives_stringFromCharCode(rune);
+      }
+      return "/* " + C.JSArray_methods.join$1(H.setRuntimeTypeInfo(commentMessage.split("\n"), type$.JSArray_String), "\n * ") + ' */\n\nbody::before {\n  font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",\n      "Droid Sans Mono", monospace, monospace;\n  white-space: pre;\n  display: block;\n  padding: 1em;\n  margin-bottom: 1em;\n  border-bottom: 2px solid black;\n  content: ' + stringMessage.toString$0(0) + ";\n}";
+    }
+  };
+  E.MultiSpanSassException.prototype = {
+    toString$1$color: function(_, color) {
+      var t2, _i, frame, t3, _this = this,
+        useColor = color === true && true,
+        buffer = new P.StringBuffer(""),
+        t1 = "Error: " + H.S(_this._span_exception$_message) + "\n";
+      buffer._contents = t1;
+      buffer._contents = t1 + U.Highlighter$multiple(G.SourceSpanException.prototype.get$span.call(_this), _this.primaryLabel, _this.secondarySpans, useColor, null, null).highlight$0();
+      for (t1 = _this.get$trace(_this).toString$0(0).split("\n"), t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        frame = t1[_i];
+        frame.toString;
+        if (J.get$length$asx(frame) === 0)
+          continue;
+        t3 = buffer._contents += "\n";
+        buffer._contents = t3 + ("  " + H.S(frame));
+      }
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    toString$0: function($receiver) {
+      return this.toString$1$color($receiver, null);
+    }
+  };
+  E.SassRuntimeException.prototype = {
+    get$trace: function(receiver) {
+      return this.trace;
+    }
+  };
+  E.MultiSpanSassRuntimeException.prototype = {$isSassRuntimeException: 1,
+    get$trace: function(receiver) {
+      return this.trace;
+    }
+  };
+  E.SassFormatException.prototype = {
+    get$source: function() {
+      return P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(G.SourceSpanException.prototype.get$span.call(this).file._decodedChars, 0, null), 0, null);
+    },
+    $isFormatException: 1,
+    $isSourceSpanFormatException: 1
+  };
+  E.SassScriptException.prototype = {
+    toString$0: function(_) {
+      return this.message + string$.x0a_BUG_;
+    },
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  E.MultiSpanSassScriptException.prototype = {};
+  D._writeSourceMap_closure.prototype = {
+    call$1: function(url) {
+      return this.options.sourceMapUrl$2(P.Uri_parse(url), this.destination).toString$0(0);
+    },
+    $signature: 4
+  };
+  B.ExecutableOptions.prototype = {
+    get$interactive: function() {
+      var t2, invalidOptions, _i, option,
+        t1 = this._interactive;
+      if (t1 != null)
+        return t1;
+      t1 = this._options;
+      t2 = H._asBoolS(t1.$index(0, "interactive"));
+      this._interactive = t2;
+      if (!t2)
+        return false;
+      invalidOptions = ["stdin", "indented", "style", "source-map", "source-map-urls", "embed-sources", "embed-source-map", "update", "watch"];
+      for (t2 = t1._parser.options._collection$_map, _i = 0; _i < 9; ++_i) {
+        option = invalidOptions[_i];
+        if (t2.$index(0, option) == null)
+          H.throwExpression(P.ArgumentError$('Could not find an option named "' + option + '".'));
+        if (t1._parsed.containsKey$1(option))
+          throw H.wrapException(B.UsageException$("--" + option + " isn't allowed with --interactive."));
+      }
+      return true;
+    },
+    get$color: function() {
+      var t1 = this._options;
+      return t1.wasParsed$1("color") ? H._asBoolS(t1.$index(0, "color")) : B.hasTerminal();
+    },
+    get$emitErrorCss: function() {
+      var t1 = H._asBoolS(this._options.$index(0, "error-css"));
+      if (t1 == null) {
+        this._ensureSources$0();
+        t1 = this._sourcesToDestinations;
+        t1 = t1.get$values(t1).any$1(0, new B.ExecutableOptions_emitErrorCss_closure());
+      }
+      return t1;
+    },
+    _ensureSources$0: function() {
+      var t1, stdin, t2, t3, $directories, t4, colonArgs, positionalArgs, cur, t5, t6, message, target, source, destination, seen, i, t7, _this = this, _null = null,
+        _s18_ = 'Duplicate source "';
+      if (_this._sourcesToDestinations != null)
+        return;
+      t1 = _this._options;
+      stdin = H._asBoolS(t1.$index(0, "stdin"));
+      t2 = t1.rest;
+      if (t2.get$length(t2) === 0 && !stdin)
+        B.ExecutableOptions__fail("Compile Sass to CSS.");
+      t3 = type$.legacy_String;
+      $directories = P.LinkedHashSet_LinkedHashSet$_empty(t3);
+      for (t4 = new H.ListIterator(t2, t2.get$length(t2)), colonArgs = false, positionalArgs = false; t4.moveNext$0();) {
+        cur = t4.__internal$_current;
+        t5 = cur.length;
+        if (t5 === 0)
+          B.ExecutableOptions__fail('Invalid argument "".');
+        if (H.stringContainsUnchecked(cur, ":", 0)) {
+          if (t5 > 2) {
+            t6 = C.JSString_methods._codeUnitAt$1(cur, 0);
+            if (!(t6 >= 97 && t6 <= 122))
+              t6 = t6 >= 65 && t6 <= 90;
+            else
+              t6 = true;
+            t6 = t6 && C.JSString_methods._codeUnitAt$1(cur, 1) === 58;
+          } else
+            t6 = false;
+          if (t6) {
+            if (2 > t5)
+              H.throwExpression(P.RangeError$range(2, 0, t5, _null, _null));
+            t5 = H.stringContainsUnchecked(cur, ":", 2);
+          } else
+            t5 = true;
+        } else
+          t5 = false;
+        if (t5)
+          colonArgs = true;
+        else if (B.dirExists(cur))
+          $directories.add$1(0, cur);
+        else
+          positionalArgs = true;
+      }
+      if (positionalArgs || t2.get$length(t2) === 0) {
+        if (colonArgs)
+          B.ExecutableOptions__fail('Positional and ":" arguments may not both be used.');
+        else if (stdin) {
+          if (J.get$length$asx(t2._collection$_source) > 1)
+            B.ExecutableOptions__fail("Only one argument is allowed with --stdin.");
+          else if (H._asBoolS(t1.$index(0, "update")))
+            B.ExecutableOptions__fail("--update is not allowed with --stdin.");
+          else if (H._asBoolS(t1.$index(0, "watch")))
+            B.ExecutableOptions__fail("--watch is not allowed with --stdin.");
+          t1 = t2.get$length(t2) === 0 ? _null : t2.get$first(t2);
+          t2 = type$.dynamic;
+          _this._sourcesToDestinations = H.ConstantMap_ConstantMap$from(P.LinkedHashMap_LinkedHashMap$_literal([null, t1], t2, t2), t3, t3);
+        } else {
+          t4 = t2._collection$_source;
+          t5 = J.getInterceptor$asx(t4);
+          if (t5.get$length(t4) > 2)
+            B.ExecutableOptions__fail("Only two positional args may be passed.");
+          else if ($directories._collection$_length !== 0) {
+            message = 'Directory "' + H.S($directories.get$first($directories)) + '" may not be a positional arg.';
+            target = t2.get$last(t2);
+            B.ExecutableOptions__fail(J.$eq$($directories.get$first($directories), t2.get$first(t2)) && !B.fileExists(target) ? message + ('\nTo compile all CSS in "' + H.S($directories.get$first($directories)) + '" to "' + H.S(target) + '", use `sass ' + H.S($directories.get$first($directories)) + ":" + H.S(target) + "`.") : message);
+          } else {
+            source = J.$eq$(t2.get$first(t2), "-") ? _null : t2.get$first(t2);
+            destination = t5.get$length(t4) === 1 ? _null : t2.get$last(t2);
+            if (destination == null)
+              if (H._asBoolS(t1.$index(0, "update")))
+                B.ExecutableOptions__fail("--update is not allowed when printing to stdout.");
+              else if (H._asBoolS(t1.$index(0, "watch")))
+                B.ExecutableOptions__fail("--watch is not allowed when printing to stdout.");
+            t1 = P.LinkedHashMap_LinkedHashMap$_literal([source, destination], t3, t3);
+            t3 = K.PathMap__create(_null, t3);
+            t3.addAll$1(0, t1);
+            _this._sourcesToDestinations = new P.UnmodifiableMapView(new K.PathMap(t3, type$.PathMap_legacy_String), type$.UnmodifiableMapView_of_legacy_String_and_legacy_String);
+          }
+        }
+        _this._sourceDirectoriesToDestinations = C.Map_empty5;
+        return;
+      }
+      if (stdin)
+        B.ExecutableOptions__fail('--stdin may not be used with ":" arguments.');
+      seen = P.LinkedHashSet_LinkedHashSet$_empty(t3);
+      t1 = K.PathMap__create(_null, t3);
+      t4 = type$.PathMap_legacy_String;
+      t3 = K.PathMap__create(_null, t3);
+      for (t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        if ($directories.contains$1(0, cur)) {
+          if (!seen.add$1(0, cur))
+            B.ExecutableOptions__fail(_s18_ + H.S(cur) + '".');
+          t3.$indexSet(0, cur, cur);
+          t1.addAll$1(0, _this._listSourceDirectory$2(cur, cur));
+          continue;
+        }
+        for (t5 = cur.length, destination = _null, source = destination, i = 0; i < t5; ++i) {
+          if (i === 1) {
+            t6 = i - 1;
+            if (t5 > t6 + 2) {
+              t7 = C.JSString_methods.codeUnitAt$1(cur, t6);
+              if (!(t7 >= 97 && t7 <= 122))
+                t7 = t7 >= 65 && t7 <= 90;
+              else
+                t7 = true;
+              t6 = t7 && C.JSString_methods.codeUnitAt$1(cur, t6 + 1) === 58;
+            } else
+              t6 = false;
+          } else
+            t6 = false;
+          if (t6)
+            continue;
+          if (C.JSString_methods._codeUnitAt$1(cur, i) === 58)
+            if (source == null) {
+              source = C.JSString_methods.substring$2(cur, 0, i);
+              destination = C.JSString_methods.substring$1(cur, i + 1);
+            } else {
+              if (i === source.length + 2) {
+                t6 = i - 1;
+                if (t5 > t6 + 2) {
+                  t7 = C.JSString_methods.codeUnitAt$1(cur, t6);
+                  if (!(t7 >= 97 && t7 <= 122))
+                    t7 = t7 >= 65 && t7 <= 90;
+                  else
+                    t7 = true;
+                  t6 = t7 && C.JSString_methods.codeUnitAt$1(cur, t6 + 1) === 58;
+                } else
+                  t6 = false;
+                t6 = !t6;
+              } else
+                t6 = true;
+              if (t6)
+                B.ExecutableOptions__fail('"' + cur + '" may only contain one ":".');
+            }
+        }
+        if (!seen.add$1(0, source))
+          B.ExecutableOptions__fail(_s18_ + H.S(source) + '".');
+        if (source === "-")
+          t1.$indexSet(0, _null, destination);
+        else if (B.dirExists(source)) {
+          t3.$indexSet(0, source, destination);
+          t1.addAll$1(0, _this._listSourceDirectory$2(source, destination));
+        } else
+          t1.$indexSet(0, source, destination);
+      }
+      t2 = type$.UnmodifiableMapView_of_legacy_String_and_legacy_String;
+      _this._sourcesToDestinations = new P.UnmodifiableMapView(new K.PathMap(t1, t4), t2);
+      _this._sourceDirectoriesToDestinations = new P.UnmodifiableMapView(new K.PathMap(t3, t4), t2);
+    },
+    _listSourceDirectory$2: function(source, destination) {
+      var t2, t3, t4, t5, _null = null,
+        t1 = type$.legacy_String;
+      t1 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t2 = J.get$iterator$ax(B.listDir(source, true)), t3 = source == destination; t2.moveNext$0();) {
+        t4 = t2.get$current(t2);
+        if (this._isEntrypoint$1(t4))
+          t5 = !(t3 && X.ParsedPath_ParsedPath$parse(t4, $.$get$context().style)._splitExtension$1(1)[1] === ".css");
+        else
+          t5 = false;
+        if (t5) {
+          t5 = $.$get$context();
+          t1.$indexSet(0, t4, t5.join$8(0, destination, t5.withoutExtension$1(t5.relative$2$from(t4, source)) + ".css", _null, _null, _null, _null, _null, _null));
+        }
+      }
+      return t1;
+    },
+    _isEntrypoint$1: function(path) {
+      var extension,
+        t1 = $.$get$context().style;
+      if (J.startsWith$1$s(X.ParsedPath_ParsedPath$parse(path, t1).get$basename(), "_"))
+        return false;
+      extension = X.ParsedPath_ParsedPath$parse(path, t1)._splitExtension$1(1)[1];
+      return extension === ".scss" || extension === ".sass" || extension === ".css";
+    },
+    get$_writeToStdout: function() {
+      var t1, _this = this;
+      _this._ensureSources$0();
+      t1 = _this._sourcesToDestinations;
+      if (t1.get$length(t1) === 1) {
+        _this._ensureSources$0();
+        t1 = _this._sourcesToDestinations;
+        t1 = t1.get$values(t1);
+        t1 = t1.get$single(t1) == null;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$emitSourceMap: function() {
+      var _this = this,
+        _s10_ = "source-map",
+        _s15_ = "source-map-urls",
+        _s13_ = "embed-sources",
+        _s16_ = "embed-source-map",
+        t1 = _this._options;
+      if (!H._asBoolS(t1.$index(0, _s10_)))
+        if (t1.wasParsed$1(_s15_))
+          B.ExecutableOptions__fail("--source-map-urls isn't allowed with --no-source-map.");
+        else if (t1.wasParsed$1(_s13_))
+          B.ExecutableOptions__fail("--embed-sources isn't allowed with --no-source-map.");
+        else if (t1.wasParsed$1(_s16_))
+          B.ExecutableOptions__fail("--embed-source-map isn't allowed with --no-source-map.");
+      if (!_this.get$_writeToStdout())
+        return H._asBoolS(t1.$index(0, _s10_));
+      if (J.$eq$(_this._ifParsed$1(_s15_), "relative"))
+        B.ExecutableOptions__fail("--source-map-urls=relative isn't allowed when printing to stdout.");
+      if (H._asBoolS(t1.$index(0, _s16_)))
+        return H._asBoolS(t1.$index(0, _s10_));
+      else if (J.$eq$(_this._ifParsed$1(_s10_), true))
+        B.ExecutableOptions__fail("When printing to stdout, --source-map requires --embed-source-map.");
+      else if (t1.wasParsed$1(_s15_))
+        B.ExecutableOptions__fail("When printing to stdout, --source-map-urls requires --embed-source-map.");
+      else if (H._asBoolS(t1.$index(0, _s13_)))
+        B.ExecutableOptions__fail("When printing to stdout, --embed-sources requires --embed-source-map.");
+      else
+        return false;
+    },
+    sourceMapUrl$2: function(url, destination) {
+      var t1, path;
+      if (url.get$scheme().length !== 0 && url.get$scheme() !== "file")
+        return url;
+      t1 = $.$get$context();
+      path = t1.style.pathFromUri$1(M._parseUri(url));
+      return t1.toUri$1(J.$eq$(this._options.$index(0, "source-map-urls"), "relative") && !this.get$_writeToStdout() ? t1.relative$2$from(path, t1.dirname$1(destination)) : D.absolute(path));
+    },
+    _ifParsed$1: function($name) {
+      var t1 = this._options;
+      return t1.wasParsed$1($name) ? t1.$index(0, $name) : null;
+    }
+  };
+  B.ExecutableOptions_closure.prototype = {
+    call$0: function() {
+      var t1 = type$.legacy_String,
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Option),
+        t3 = [],
+        parser = new N.ArgParser(t2, new P.UnmodifiableMapView(t2, type$.UnmodifiableMapView_of_legacy_String_and_legacy_Option), new P.UnmodifiableMapView(P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_ArgParser), type$.UnmodifiableMapView_of_legacy_String_and_legacy_ArgParser), t3, true, null);
+      parser.addOption$2$hide("precision", true);
+      parser.addFlag$2$hide("async", true);
+      t3.push(B.ExecutableOptions__separator("Input and Output"));
+      parser.addFlag$2$help("stdin", "Read the stylesheet from stdin.");
+      parser.addFlag$2$help("indented", "Use the indented syntax for input from stdin.");
+      parser.addMultiOption$5$abbr$help$splitCommas$valueHelp("load-path", "I", "A path to use when resolving imports.\nMay be passed multiple times.", false, "PATH");
+      t1 = type$.JSArray_legacy_String;
+      parser.addOption$6$abbr$allowed$defaultsTo$help$valueHelp("style", "s", H.setRuntimeTypeInfo(["expanded", "compressed"], t1), "expanded", "Output style.", "NAME");
+      parser.addFlag$3$defaultsTo$help("charset", true, "Emit a @charset or BOM for CSS with non-ASCII characters.");
+      parser.addFlag$3$defaultsTo$help("error-css", null, "When an error occurs, emit a stylesheet describing it.\nDefaults to true when compiling to a file.");
+      parser.addFlag$3$help$negatable("update", "Only compile out-of-date stylesheets.", false);
+      t3.push(B.ExecutableOptions__separator("Source Maps"));
+      parser.addFlag$3$defaultsTo$help("source-map", true, "Whether to generate source maps.");
+      parser.addOption$4$allowed$defaultsTo$help("source-map-urls", H.setRuntimeTypeInfo(["relative", "absolute"], t1), "relative", "How to link from source maps to source files.");
+      parser.addFlag$3$defaultsTo$help("embed-sources", false, "Embed source file contents in source maps.");
+      parser.addFlag$3$defaultsTo$help("embed-source-map", false, "Embed source map contents in CSS.");
+      t3.push(B.ExecutableOptions__separator("Other"));
+      parser.addFlag$3$help$negatable("watch", "Watch stylesheets and recompile when they change.", false);
+      parser.addFlag$2$help("poll", "Manually check for changes rather than using a native watcher.\nOnly valid with --watch.");
+      parser.addFlag$2$help("stop-on-error", "Don't compile more files once an error is encountered.");
+      parser.addFlag$4$abbr$help$negatable("interactive", "i", "Run an interactive SassScript shell.", false);
+      parser.addFlag$3$abbr$help("color", "c", "Whether to use terminal colors for messages.");
+      parser.addFlag$2$help("unicode", "Whether to use Unicode characters for messages.");
+      parser.addFlag$3$abbr$help("quiet", "q", "Don't print warnings.");
+      parser.addFlag$2$help("trace", "Print full Dart stack traces for exceptions.");
+      parser.addFlag$4$abbr$help$negatable("help", "h", "Print this usage information.", false);
+      parser.addFlag$3$help$negatable("version", "Print the version of Dart Sass.", false);
+      return parser;
+    },
+    $signature: 368
+  };
+  B.ExecutableOptions_emitErrorCss_closure.prototype = {
+    call$1: function(destination) {
+      return destination != null;
+    },
+    $signature: 6
+  };
+  B.UsageException.prototype = {$isException: 1,
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  A.watch_closure.prototype = {
+    call$1: function(dir) {
+      for (; !B.dirExists(dir);)
+        dir = $.$get$context().dirname$1(dir);
+      return this.dirWatcher.watch$1(0, dir);
+    },
+    $signature: 365
+  };
+  A._Watcher.prototype = {
+    compile$3$ifModified: function(source, destination, ifModified) {
+      return this.compile$body$_Watcher(source, destination, ifModified);
+    },
+    compile$2: function(source, destination) {
+      return this.compile$3$ifModified(source, destination, false);
+    },
+    compile$body$_Watcher: function(source, destination, ifModified) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, error, stackTrace, error0, stackTrace0, exception, t1, $async$exception;
+      var $async$compile$3$ifModified = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$handler = 4;
+              $async$goto = 7;
+              return P._asyncAwait(D.compileStylesheet($async$self._watch$_options, $async$self._graph, source, destination, ifModified), $async$compile$3$ifModified);
+            case 7:
+              // returning from await.
+              $async$returnValue = true;
+              // goto return
+              $async$goto = 1;
+              break;
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (t1 instanceof E.SassException) {
+                error = t1;
+                stackTrace = H.getTraceFromException($async$exception);
+                t1 = $async$self._watch$_options;
+                if (!t1.get$emitErrorCss())
+                  $async$self._delete$1(destination);
+                $async$self._printError$2(J.toString$1$color$(error, t1.get$color()), stackTrace);
+                J.set$exitCode$x(self.process, 65);
+                $async$returnValue = false;
+                // goto return
+                $async$goto = 1;
+                break;
+              } else if (t1 instanceof B.FileSystemException) {
+                error0 = t1;
+                stackTrace0 = H.getTraceFromException($async$exception);
+                t1 = error0.path;
+                $async$self._printError$2("Error reading " + H.S($.$get$context().relative$2$from(t1, null)) + ": " + error0.message + ".", stackTrace0);
+                J.set$exitCode$x(self.process, 66);
+                $async$returnValue = false;
+                // goto return
+                $async$goto = 1;
+                break;
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 3:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 6:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$compile$3$ifModified, $async$completer);
+    },
+    _delete$1: function(path) {
+      var buffer, t1, exception;
+      try {
+        B.deleteFile(path);
+        buffer = new P.StringBuffer("");
+        t1 = this._watch$_options;
+        if (t1.get$color())
+          buffer._contents += "\x1b[33m";
+        buffer._contents += "Deleted " + H.S(path) + ".";
+        if (t1.get$color())
+          buffer._contents += "\x1b[0m";
+        P.print(buffer);
+      } catch (exception) {
+        if (!(H.unwrapException(exception) instanceof B.FileSystemException))
+          throw exception;
+      }
+    },
+    _printError$2: function(message, stackTrace) {
+      var t2,
+        t1 = $.$get$stderr();
+      t1.writeln$1(message);
+      t2 = this._watch$_options._options;
+      if (H._asBoolS(t2.$index(0, "trace"))) {
+        t1.writeln$0();
+        t1.writeln$1(C.JSString_methods.trimRight$0(Y.Trace_Trace$from(stackTrace).get$terse().toString$0(0)));
+      }
+      if (!H._asBoolS(t2.$index(0, "stop-on-error")))
+        t1.writeln$0();
+    },
+    watch$1: function(_, watcher) {
+      return this.watch$body$_Watcher(_, watcher);
+    },
+    watch$body$_Watcher: function(_, watcher) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, $event, extension, success, success0, success1, t2, t1;
+      var $async$watch$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = watcher._group._controller;
+              t1.toString;
+              t1 = $async$self._debounceEvents$1(new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")));
+              t2 = new P._StreamIterator(t1);
+              P.ArgumentError_checkNotNull(t1, "stream");
+              $async$handler = 3;
+              t1 = $async$self._watch$_options._options;
+            case 6:
+              // for condition
+              $async$goto = 8;
+              return P._asyncAwait(t2.moveNext$0(), $async$watch$1);
+            case 8:
+              // returning from await.
+              if (!$async$result) {
+                // goto after for
+                $async$goto = 7;
+                break;
+              }
+              $event = t2.get$current(t2);
+              extension = X.ParsedPath_ParsedPath$parse($event.path, $.$get$context().style)._splitExtension$1(1)[1];
+              if (!J.$eq$(extension, ".sass") && !J.$eq$(extension, ".scss") && !J.$eq$(extension, ".css")) {
+                // goto for condition
+                $async$goto = 6;
+                break;
+              }
+            case 9:
+              // switch
+              switch ($event.type) {
+                case C.ChangeType_modify:
+                  // goto case
+                  $async$goto = 11;
+                  break;
+                case C.ChangeType_add:
+                  // goto case
+                  $async$goto = 12;
+                  break;
+                case C.ChangeType_remove:
+                  // goto case
+                  $async$goto = 13;
+                  break;
+                default:
+                  // goto after switch
+                  $async$goto = 10;
+                  break;
+              }
+              break;
+            case 11:
+              // case
+              $async$goto = 14;
+              return P._asyncAwait($async$self._handleModify$1($event.path), $async$watch$1);
+            case 14:
+              // returning from await.
+              success = $async$result;
+              if (!success && H._asBoolS(t1.$index(0, "stop-on-error"))) {
+                $async$next = [1];
+                // goto finally
+                $async$goto = 4;
+                break;
+              }
+              // goto after switch
+              $async$goto = 10;
+              break;
+            case 12:
+              // case
+              $async$goto = 15;
+              return P._asyncAwait($async$self._handleAdd$1($event.path), $async$watch$1);
+            case 15:
+              // returning from await.
+              success0 = $async$result;
+              if (!success0 && H._asBoolS(t1.$index(0, "stop-on-error"))) {
+                $async$next = [1];
+                // goto finally
+                $async$goto = 4;
+                break;
+              }
+              // goto after switch
+              $async$goto = 10;
+              break;
+            case 13:
+              // case
+              $async$goto = 16;
+              return P._asyncAwait($async$self._handleRemove$1($event.path), $async$watch$1);
+            case 16:
+              // returning from await.
+              success1 = $async$result;
+              if (!success1 && H._asBoolS(t1.$index(0, "stop-on-error"))) {
+                $async$next = [1];
+                // goto finally
+                $async$goto = 4;
+                break;
+              }
+              // goto after switch
+              $async$goto = 10;
+              break;
+            case 10:
+              // after switch
+              // goto for condition
+              $async$goto = 6;
+              break;
+            case 7:
+              // after for
+              $async$next.push(5);
+              // goto finally
+              $async$goto = 4;
+              break;
+            case 3:
+              // uncaught
+              $async$next = [2];
+            case 4:
+              // finally
+              $async$handler = 2;
+              $async$goto = 17;
+              return P._asyncAwait(t2.cancel$0(), $async$watch$1);
+            case 17:
+              // returning from await.
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 5:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$watch$1, $async$completer);
+    },
+    _handleModify$1: function(path) {
+      return this._handleModify$body$_Watcher(path);
+    },
+    _handleModify$body$_Watcher: function(path) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
+        $async$returnValue, $async$self = this, t1, t2, t0, url, node;
+      var $async$_handleModify$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin")) {
+                t1 = $.$get$context();
+                t2 = F._realCasePath(D.absolute(t1.normalize$1(path)));
+                t0 = t2;
+                t2 = t1;
+                t1 = t0;
+              } else {
+                t1 = $.$get$context();
+                t2 = t1.canonicalize$1(path);
+                t0 = t2;
+                t2 = t1;
+                t1 = t0;
+              }
+              url = t2.toUri$1(t1);
+              t1 = $async$self._graph;
+              t2 = t1._nodes;
+              if (!t2.containsKey$1(url)) {
+                $async$returnValue = $async$self._handleAdd$1(path);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              node = t2.$index(0, url);
+              t1.reload$1(url);
+              $async$goto = 3;
+              return P._asyncAwait($async$self._recompileDownstream$1(H.setRuntimeTypeInfo([node], type$.JSArray_legacy_StylesheetNode)), $async$_handleModify$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_handleModify$1, $async$completer);
+    },
+    _handleAdd$1: function(path) {
+      return this._handleAdd$body$_Watcher(path);
+    },
+    _handleAdd$body$_Watcher: function(path) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
+        $async$returnValue, $async$self = this, t2, t3, t0, destination, success, t1, $async$temp1;
+      var $async$_handleAdd$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              destination = $async$self._destinationFor$1(path);
+              $async$temp1 = destination == null;
+              if ($async$temp1)
+                $async$result = $async$temp1;
+              else {
+                // goto then
+                $async$goto = 3;
+                break;
+              }
+              // goto join
+              $async$goto = 4;
+              break;
+            case 3:
+              // then
+              $async$goto = 5;
+              return P._asyncAwait($async$self.compile$2(path, destination), $async$_handleAdd$1);
+            case 5:
+              // returning from await.
+            case 4:
+              // join
+              success = $async$result;
+              t1 = D.absolute(".");
+              if (J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin")) {
+                t2 = $.$get$context();
+                t3 = F._realCasePath(D.absolute(t2.normalize$1(path)));
+                t0 = t3;
+                t3 = t2;
+                t2 = t0;
+              } else {
+                t2 = $.$get$context();
+                t3 = t2.canonicalize$1(path);
+                t0 = t3;
+                t3 = t2;
+                t2 = t0;
+              }
+              $async$goto = 6;
+              return P._asyncAwait($async$self._recompileDownstream$1($async$self._graph.addCanonical$3(new F.FilesystemImporter(t1), t3.toUri$1(t2), t3.toUri$1(path))), $async$_handleAdd$1);
+            case 6:
+              // returning from await.
+              $async$returnValue = $async$result && success;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_handleAdd$1, $async$completer);
+    },
+    _handleRemove$1: function(path) {
+      return this._handleRemove$body$_Watcher(path);
+    },
+    _handleRemove$body$_Watcher: function(path) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
+        $async$returnValue, $async$self = this, t1, t2, t0, url, destination, t3, node, toRecompile;
+      var $async$_handleRemove$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin")) {
+                t1 = $.$get$context();
+                t2 = F._realCasePath(D.absolute(t1.normalize$1(path)));
+                t0 = t2;
+                t2 = t1;
+                t1 = t0;
+              } else {
+                t1 = $.$get$context();
+                t2 = t1.canonicalize$1(path);
+                t0 = t2;
+                t2 = t1;
+                t1 = t0;
+              }
+              url = t2.toUri$1(t1);
+              t1 = $async$self._graph;
+              t2 = t1._nodes;
+              if (t2.containsKey$1(url)) {
+                destination = $async$self._destinationFor$1(path);
+                if (destination != null)
+                  $async$self._delete$1(destination);
+              }
+              t3 = D.absolute(".");
+              node = t2.remove$1(0, url);
+              t2 = node != null;
+              if (t2) {
+                t1._transitiveModificationTimes.clear$0(0);
+                t1.importCache.clearImport$1(url);
+                node._stylesheet_graph$_remove$0();
+              }
+              toRecompile = t1._recanonicalizeImports$2(new F.FilesystemImporter(t3), url);
+              if (t2)
+                toRecompile.addAll$1(0, node._downstream);
+              $async$goto = 3;
+              return P._asyncAwait($async$self._recompileDownstream$1(toRecompile), $async$_handleRemove$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_handleRemove$1, $async$completer);
+    },
+    _debounceEvents$1: function(events) {
+      var t1 = type$.legacy_WatchEvent;
+      t1 = R._debounceAggregate(P.Duration$(25), H.instantiate1(R.rate_limit___collectToList$closure(), t1), false, true, t1, type$.legacy_List_legacy_WatchEvent).bind$1(events);
+      return new P._ExpandStream(new A._Watcher__debounceEvents_closure(), t1, H._instanceType(t1)._eval$1("_ExpandStream<Stream.T,WatchEvent*>"));
+    },
+    _recompileDownstream$1: function(nodes) {
+      return this._recompileDownstream$body$_Watcher(nodes);
+    },
+    _recompileDownstream$body$_Watcher: function(nodes) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
+        $async$returnValue, $async$self = this, t2, allSucceeded, node, success, t1, seen, toRecompile;
+      var $async$_recompileDownstream$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = type$.legacy_StylesheetNode;
+              seen = P.LinkedHashSet_LinkedHashSet$_empty(t1);
+              toRecompile = P.ListQueue_ListQueue$of(nodes, t1);
+              t1 = type$.UnmodifiableSetView_legacy_StylesheetNode, t2 = $async$self._watch$_options._options, allSucceeded = true;
+            case 3:
+              // for condition
+              if (!!toRecompile.get$isEmpty(toRecompile)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              node = toRecompile.removeFirst$0();
+              if (!seen.add$1(0, node)) {
+                // goto for condition
+                $async$goto = 3;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait($async$self._compileIfEntrypoint$1(node.canonicalUrl), $async$_recompileDownstream$1);
+            case 5:
+              // returning from await.
+              success = $async$result;
+              allSucceeded = allSucceeded && success;
+              if (!success && H._asBoolS(t2.$index(0, "stop-on-error"))) {
+                $async$returnValue = false;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              toRecompile.addAll$1(0, new L.UnmodifiableSetView(node._downstream, t1));
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 4:
+              // after for
+              $async$returnValue = allSucceeded;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_recompileDownstream$1, $async$completer);
+    },
+    _compileIfEntrypoint$1: function(url) {
+      return this._compileIfEntrypoint$body$_Watcher(url);
+    },
+    _compileIfEntrypoint$body$_Watcher: function(url) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
+        $async$returnValue, $async$self = this, source, destination;
+      var $async$_compileIfEntrypoint$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (url.get$scheme() !== "file") {
+                $async$returnValue = true;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              source = $.$get$context().style.pathFromUri$1(M._parseUri(url));
+              destination = $async$self._destinationFor$1(source);
+              if (destination == null) {
+                $async$returnValue = true;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 3;
+              return P._asyncAwait($async$self.compile$2(source, destination), $async$_compileIfEntrypoint$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_compileIfEntrypoint$1, $async$completer);
+    },
+    _destinationFor$1: function(source) {
+      var destination, t2, t3, t4, _null = null,
+        t1 = this._watch$_options;
+      t1._ensureSources$0();
+      destination = t1._sourcesToDestinations.$index(0, source);
+      if (destination != null)
+        return destination;
+      t2 = $.$get$context();
+      if (J.startsWith$1$s(X.ParsedPath_ParsedPath$parse(source, t2.style).get$basename(), "_"))
+        return _null;
+      for (t1._ensureSources$0(), t3 = t1._sourceDirectoriesToDestinations, t3 = J.get$iterator$ax(t3.get$keys(t3)); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        if (t2._isWithinOrEquals$2(t4, source) !== C._PathRelation_within)
+          continue;
+        t1._ensureSources$0();
+        destination = t2.join$8(0, t1._sourceDirectoriesToDestinations.$index(0, t4), t2.withoutExtension$1(t2.relative$2$from(source, t4)) + ".css", _null, _null, _null, _null, _null, _null);
+        if (t2._isWithinOrEquals$2(destination, source) !== C._PathRelation_equal)
+          return destination;
+      }
+      return _null;
+    }
+  };
+  A._Watcher__debounceEvents_closure.prototype = {
+    call$1: function(buffer) {
+      var t2, t3, t4, oldType,
+        t1 = K.PathMap__create(null, type$.legacy_ChangeType);
+      for (t2 = J.get$iterator$ax(buffer); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t4 = t3.path;
+        oldType = t1.$index(0, t4);
+        if (oldType == null)
+          t1.$indexSet(0, t4, t3.type);
+        else if (t3.type === C.ChangeType_remove)
+          t1.$indexSet(0, t4, C.ChangeType_remove);
+        else if (oldType !== C.ChangeType_add)
+          t1.$indexSet(0, t4, C.ChangeType_modify);
+      }
+      return t1.get$keys(t1).map$1$1(0, new A._Watcher__debounceEvents__closure(new K.PathMap(t1, type$.PathMap_legacy_ChangeType)), type$.legacy_WatchEvent);
+    },
+    $signature: 354
+  };
+  A._Watcher__debounceEvents__closure.prototype = {
+    call$1: function(path) {
+      return new E.WatchEvent(this.typeForPath._collection$_map.$index(0, path), path);
+    },
+    $signature: 350
+  };
+  T.EmptyExtender.prototype = {
+    get$isEmpty: function(_) {
+      return true;
+    },
+    get$simpleSelectors: function() {
+      return C.C_EmptyUnmodifiableSet;
+    },
+    extensionsWhereTarget$1: function(callback) {
+      return C.List_empty2;
+    },
+    addExtensions$1: function(extenders) {
+      throw H.wrapException(P.UnsupportedError$(string$.addExt));
+    },
+    clone$0: function() {
+      return C.Tuple2_EmptyExtender_Map_empty;
+    },
+    $isExtender: 1
+  };
+  F.Extender.prototype = {
+    get$isEmpty: function(_) {
+      var t1 = this._extensions;
+      return t1.get$isEmpty(t1);
+    },
+    get$simpleSelectors: function() {
+      return new M.MapKeySet(this._selectors, type$.MapKeySet_legacy_SimpleSelector);
+    },
+    extensionsWhereTarget$1: function($async$callback) {
+      var $async$self = this;
+      return P._makeSyncStarIterable(function() {
+        var callback = $async$callback;
+        var $async$goto = 0, $async$handler = 1, $async$currentError, t1, t2, t3, t4;
+        return function $async$extensionsWhereTarget$1($async$errorCode, $async$result) {
+          if ($async$errorCode === 1) {
+            $async$currentError = $async$result;
+            $async$goto = $async$handler;
+          }
+          while (true)
+            switch ($async$goto) {
+              case 0:
+                // Function start
+                t1 = $async$self._extensions, t2 = t1.get$keys(t1), t2 = t2.get$iterator(t2);
+              case 2:
+                // for condition
+                if (!t2.moveNext$0()) {
+                  // goto after for
+                  $async$goto = 3;
+                  break;
+                }
+                t3 = t2.get$current(t2);
+                if (!callback.call$1(t3)) {
+                  // goto for condition
+                  $async$goto = 2;
+                  break;
+                }
+                t3 = J.get$values$z(t1.$index(0, t3)), t3 = t3.get$iterator(t3);
+              case 4:
+                // for condition
+                if (!t3.moveNext$0()) {
+                  // goto after for
+                  $async$goto = 5;
+                  break;
+                }
+                t4 = t3.get$current(t3);
+                $async$goto = t4 instanceof A.MergedExtension ? 6 : 8;
+                break;
+              case 6:
+                // then
+                t4 = t4.unmerge$0();
+                $async$goto = 9;
+                return P._IterationMarker_yieldStar(new H.WhereIterable(t4, new F.Extender_extensionsWhereTarget_closure(), t4.$ti._eval$1("WhereIterable<Iterable.E>")));
+              case 9:
+                // after yield
+                // goto join
+                $async$goto = 7;
+                break;
+              case 8:
+                // else
+                $async$goto = !t4.isOptional ? 10 : 11;
+                break;
+              case 10:
+                // then
+                $async$goto = 12;
+                return t4;
+              case 12:
+                // after yield
+              case 11:
+                // join
+              case 7:
+                // join
+                // goto for condition
+                $async$goto = 4;
+                break;
+              case 5:
+                // after for
+                // goto for condition
+                $async$goto = 2;
+                break;
+              case 3:
+                // after for
+                // implicit return
+                return P._IterationMarker_endOfIteration();
+              case 1:
+                // rethrow
+                return P._IterationMarker_uncaughtError($async$currentError);
+            }
+        };
+      }, type$.legacy_Extension);
+    },
+    addSelector$3: function(selector, span, mediaContext) {
+      var originalSelector, error, t1, t2, t3, _i, exception, modifiableSelector, _this = this;
+      selector = selector;
+      originalSelector = selector;
+      if (!originalSelector.get$isInvisible())
+        for (t1 = originalSelector.components, t2 = t1.length, t3 = _this._originals, _i = 0; _i < t2; ++_i)
+          t3.add$1(0, t1[_i]);
+      t1 = _this._extensions;
+      if (t1.get$isNotEmpty(t1))
+        try {
+          selector = _this._extendList$3(originalSelector, t1, mediaContext);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (t1 instanceof E.SassException) {
+            error = t1;
+            throw H.wrapException(E.SassException$("From " + error.get$span().message$1(0, "") + "\n" + H.S(error._span_exception$_message), span));
+          } else
+            throw exception;
+        }
+      modifiableSelector = new F.ModifiableCssValue(selector, span, type$.ModifiableCssValue_legacy_SelectorList);
+      if (mediaContext != null)
+        _this._mediaContexts.$indexSet(0, modifiableSelector, mediaContext);
+      _this._registerSelector$2(selector, modifiableSelector);
+      return modifiableSelector;
+    },
+    _registerSelector$2: function(list, selector) {
+      var t1, t2, t3, _i, t4, t5, _i0, component, t6, t7, _i1, simple;
+      for (t1 = list.components, t2 = t1.length, t3 = this._selectors, _i = 0; _i < t2; ++_i)
+        for (t4 = t1[_i].components, t5 = t4.length, _i0 = 0; _i0 < t5; ++_i0) {
+          component = t4[_i0];
+          if (component instanceof X.CompoundSelector)
+            for (t6 = component.components, t7 = t6.length, _i1 = 0; _i1 < t7; ++_i1) {
+              simple = t6[_i1];
+              J.add$1$ax(t3.putIfAbsent$2(simple, new F.Extender__registerSelector_closure()), selector);
+              if (simple instanceof D.PseudoSelector && simple.selector != null)
+                this._registerSelector$2(simple.selector, selector);
+            }
+        }
+    },
+    addExtension$4: function(extender, target, extend, mediaContext) {
+      var t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, newExtensions, _i, complex, t12, state, existingState, t13, _i0, component, t14, t15, _i1, simple, newExtensionsByTarget, additionalExtensions, _this = this,
+        selectors = _this._selectors.$index(0, target),
+        t1 = _this._extensionsByExtender,
+        existingExtensions = t1.$index(0, target),
+        sources = _this._extensions.putIfAbsent$2(target, new F.Extender_addExtension_closure());
+      for (t2 = extender.value.components, t3 = t2.length, t4 = selectors == null, t5 = _this._sourceSpecificity, t6 = extender.span, t7 = extend.span, t8 = extend.isOptional, t9 = existingExtensions != null, t10 = type$.legacy_ComplexSelector, t11 = type$.legacy_Extension, newExtensions = null, _i = 0; _i < t3; ++_i) {
+        complex = t2[_i];
+        if (complex._maxSpecificity == null)
+          complex._computeSpecificity$0();
+        t12 = complex._maxSpecificity;
+        state = new S.Extension(complex, target, t12, t8, false, mediaContext, t6, t7);
+        existingState = sources.$index(0, complex);
+        if (existingState != null) {
+          sources.$indexSet(0, complex, A.MergedExtension_merge(existingState, state));
+          continue;
+        }
+        sources.$indexSet(0, complex, state);
+        for (t12 = complex.components, t13 = t12.length, _i0 = 0; _i0 < t13; ++_i0) {
+          component = t12[_i0];
+          if (component instanceof X.CompoundSelector)
+            for (t14 = component.components, t15 = t14.length, _i1 = 0; _i1 < t15; ++_i1) {
+              simple = t14[_i1];
+              J.add$1$ax(t1.putIfAbsent$2(simple, new F.Extender_addExtension_closure0()), state);
+              t5.putIfAbsent$2(simple, new F.Extender_addExtension_closure1(complex));
+            }
+        }
+        if (!t4 || t9) {
+          if (newExtensions == null)
+            newExtensions = P.LinkedHashMap_LinkedHashMap$_empty(t10, t11);
+          newExtensions.$indexSet(0, complex, state);
+        }
+      }
+      if (newExtensions == null)
+        return;
+      t1 = type$.legacy_SimpleSelector;
+      newExtensionsByTarget = P.LinkedHashMap_LinkedHashMap$_literal([target, newExtensions], t1, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension);
+      if (t9) {
+        additionalExtensions = _this._extendExistingExtensions$2(existingExtensions, newExtensionsByTarget);
+        if (additionalExtensions != null)
+          B.mapAddAll2(newExtensionsByTarget, additionalExtensions, t1, t10, t11);
+      }
+      if (!t4)
+        _this._extendExistingSelectors$2(selectors, newExtensionsByTarget);
+    },
+    _extendExistingExtensions$2: function(extensions, newExtensions) {
+      var extension, selectors, error, t1, t2, t3, t4, t5, t6, additionalExtensions, _i, sources, exception, containsExtension, t7, t8, first, _i0, complex, t9, t10, t11, t12, t13, t14, withExtender, existingExtension, _i1, component, _i2;
+      for (t1 = J.toList$0$ax(extensions), t2 = t1.length, t3 = this._extensionsByExtender, t4 = type$.legacy_SimpleSelector, t5 = type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension, t6 = this._extensions, additionalExtensions = null, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        extension = t1[_i];
+        sources = t6.$index(0, extension.target);
+        selectors = null;
+        try {
+          selectors = this._extendComplex$3(extension.extender, newExtensions, extension.mediaContext);
+          if (selectors == null)
+            continue;
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (t1 instanceof E.SassException) {
+            error = t1;
+            throw H.wrapException(E.SassException$("From " + extension.extenderSpan.message$1(0, "") + "\n" + H.S(error._span_exception$_message), error.get$span()));
+          } else
+            throw exception;
+        }
+        containsExtension = J.$eq$(J.get$first$ax(selectors), extension.extender);
+        for (t7 = selectors, t8 = t7.length, first = false, _i0 = 0; _i0 < t7.length; t7.length === t8 || (0, H.throwConcurrentModificationError)(t7), ++_i0) {
+          complex = t7[_i0];
+          if (containsExtension && first) {
+            first = false;
+            continue;
+          }
+          t9 = extension;
+          t10 = t9.target;
+          t11 = t9.extenderSpan;
+          t12 = t9.span;
+          t13 = t9.mediaContext;
+          t14 = t9.specificity;
+          t9 = t9.isOptional;
+          if (t14 == null) {
+            if (complex._maxSpecificity == null)
+              complex._computeSpecificity$0();
+            t14 = complex._maxSpecificity;
+          }
+          withExtender = new S.Extension(complex, t10, t14, t9, false, t13, t11, t12);
+          existingExtension = sources.$index(0, complex);
+          if (existingExtension != null)
+            sources.$indexSet(0, complex, A.MergedExtension_merge(existingExtension, withExtender));
+          else {
+            sources.$indexSet(0, complex, withExtender);
+            for (t9 = complex.components, t10 = t9.length, _i1 = 0; _i1 < t10; ++_i1) {
+              component = t9[_i1];
+              if (component instanceof X.CompoundSelector)
+                for (t11 = component.components, t12 = t11.length, _i2 = 0; _i2 < t12; ++_i2)
+                  J.add$1$ax(t3.putIfAbsent$2(t11[_i2], new F.Extender__extendExistingExtensions_closure()), withExtender);
+            }
+            if (newExtensions.containsKey$1(extension.target)) {
+              if (additionalExtensions == null)
+                additionalExtensions = P.LinkedHashMap_LinkedHashMap$_empty(t4, t5);
+              additionalExtensions.putIfAbsent$2(extension.target, new F.Extender__extendExistingExtensions_closure0()).$indexSet(0, complex, withExtender);
+            }
+          }
+        }
+        if (!containsExtension)
+          sources.remove$1(0, extension.extender);
+      }
+      return additionalExtensions;
+    },
+    _extendExistingSelectors$2: function(selectors, newExtensions) {
+      var selector, error, t1, t2, oldValue, exception;
+      for (t1 = selectors.get$iterator(selectors), t2 = this._mediaContexts; t1.moveNext$0();) {
+        selector = t1.get$current(t1);
+        oldValue = selector.value;
+        try {
+          selector.value = this._extendList$3(selector.value, newExtensions, t2.$index(0, selector));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (t1 instanceof E.SassException) {
+            error = t1;
+            throw H.wrapException(E.SassException$("From " + selector.span.message$1(0, "") + "\n" + H.S(error._span_exception$_message), error.get$span()));
+          } else
+            throw exception;
+        }
+        if (oldValue == selector.value)
+          continue;
+        this._registerSelector$2(selector.value, selector);
+      }
+    },
+    addExtensions$1: function(extenders) {
+      var t1, t2, t3, _this = this, _box_0 = {};
+      _box_0.newExtensions = _box_0.selectorsToExtend = _box_0.extensionsToExtend = null;
+      for (t1 = J.get$iterator$ax(extenders), t2 = _this._sourceSpecificity; t1.moveNext$0();) {
+        t3 = t1.get$current(t1);
+        if (t3.get$isEmpty(t3))
+          continue;
+        t2.addAll$1(0, t3.get$_sourceSpecificity());
+        t3.get$_extensions().forEach$1(0, new F.Extender_addExtensions_closure(_box_0, _this, t3));
+      }
+      t1 = _box_0.newExtensions;
+      if (t1 == null)
+        return;
+      t2 = _box_0.extensionsToExtend;
+      if (t2 != null)
+        _this._extendExistingExtensions$2(t2, t1);
+      t1 = _box_0.selectorsToExtend;
+      if (t1 != null)
+        _this._extendExistingSelectors$2(t1, _box_0.newExtensions);
+    },
+    _extendList$3: function(list, extensions, mediaQueryContext) {
+      var t1, t2, t3, extended, i, complex, result, t4;
+      for (t1 = list.components, t2 = t1.length, t3 = type$.JSArray_legacy_ComplexSelector, extended = null, i = 0; i < t2; ++i) {
+        complex = t1[i];
+        result = this._extendComplex$3(complex, extensions, mediaQueryContext);
+        if (result == null) {
+          if (extended != null)
+            extended.push(complex);
+        } else {
+          if (extended == null)
+            if (i === 0)
+              extended = H.setRuntimeTypeInfo([], t3);
+            else {
+              t4 = C.JSArray_methods.sublist$2(t1, 0, i);
+              extended = H.setRuntimeTypeInfo(t4.slice(0), H._arrayInstanceType(t4)._eval$1("JSArray<1>"));
+            }
+          C.JSArray_methods.addAll$1(extended, result);
+        }
+      }
+      if (extended == null)
+        return list;
+      t1 = this._originals;
+      return D.SelectorList$(J.where$1$ax(this._trim$2(extended, t1.get$contains(t1)), new F.Extender__extendList_closure()));
+    },
+    _extendComplex$3: function(complex, extensions, mediaQueryContext) {
+      var t1, t2, t3, t4, t5, t6, t7, t8, t9, extendedNotExpanded, i, component, extended, result, t10,
+        _s28_ = "components may not be empty.",
+        _box_0 = {},
+        isOriginal = this._originals.contains$1(0, complex);
+      for (t1 = complex.components, t2 = t1.length, t3 = type$.JSArray_legacy_ComplexSelector, t4 = type$.JSArray_legacy_ComplexSelectorComponent, t5 = type$.legacy_ComplexSelectorComponent, t6 = H._arrayInstanceType(t1), t7 = t6._precomputed1, t6 = t6._eval$1("SubListIterable<1>"), t8 = t6._eval$1("MappedListIterable<ListIterable.E,List<ComplexSelector*>*>"), t9 = t8._eval$1("ListIterable.E"), extendedNotExpanded = null, i = 0; i < t2; ++i) {
+        component = t1[i];
+        if (component instanceof X.CompoundSelector) {
+          extended = this._extendCompound$4$inOriginal(component, extensions, mediaQueryContext, isOriginal);
+          if (extended == null) {
+            if (extendedNotExpanded != null) {
+              result = P.List_List$from(H.setRuntimeTypeInfo([component], t4), false, t5);
+              result.fixed$length = Array;
+              result.immutable$list = Array;
+              t10 = result;
+              if (t10.length === 0)
+                H.throwExpression(P.ArgumentError$(_s28_));
+              C.JSArray_methods.add$1(extendedNotExpanded, H.setRuntimeTypeInfo([new S.ComplexSelector(t10, false)], t3));
+            }
+          } else {
+            if (extendedNotExpanded == null) {
+              t10 = new H.SubListIterable(t1, 0, i, t6);
+              t10.SubListIterable$3(t1, 0, i, t7);
+              extendedNotExpanded = P.List_List$from(new H.MappedListIterable(t10, new F.Extender__extendComplex_closure(complex), t8), true, t9);
+            }
+            C.JSArray_methods.add$1(extendedNotExpanded, extended);
+          }
+        } else if (extendedNotExpanded != null) {
+          result = P.List_List$from(H.setRuntimeTypeInfo([component], t4), false, t5);
+          result.fixed$length = Array;
+          result.immutable$list = Array;
+          t10 = result;
+          if (t10.length === 0)
+            H.throwExpression(P.ArgumentError$(_s28_));
+          C.JSArray_methods.add$1(extendedNotExpanded, H.setRuntimeTypeInfo([new S.ComplexSelector(t10, false)], t3));
+        }
+      }
+      if (extendedNotExpanded == null)
+        return null;
+      _box_0.first = true;
+      t1 = type$.legacy_ComplexSelector;
+      t1 = J.expand$1$1$ax(Y.paths(extendedNotExpanded, t1), new F.Extender__extendComplex_closure0(_box_0, this, complex), t1);
+      return P.List_List$from(t1, true, t1.$ti._eval$1("Iterable.E"));
+    },
+    _extendCompound$4$inOriginal: function(compound, extensions, mediaQueryContext, inOriginal) {
+      var t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, options, i, simple, extended, result, t13, t14, unifiedPaths, isOriginal, _this = this, _null = null,
+        _s28_ = "components may not be empty.",
+        _box_1 = {},
+        t1 = _this._mode,
+        targetsUsed = t1 === C.ExtendMode_normal || extensions.get$length(extensions) < 2 ? _null : P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_SimpleSelector);
+      for (t2 = compound.components, t3 = t2.length, t4 = type$.JSArray_legacy_List_legacy_Extension, t5 = type$.JSArray_legacy_Extension, t6 = type$.JSArray_legacy_ComplexSelectorComponent, t7 = type$.legacy_ComplexSelectorComponent, t8 = H._arrayInstanceType(t2), t9 = t8._precomputed1, t8 = t8._eval$1("SubListIterable<1>"), t10 = type$.legacy_SimpleSelector, t11 = _this._sourceSpecificity, t12 = type$.JSArray_legacy_SimpleSelector, options = _null, i = 0; i < t3; ++i) {
+        simple = t2[i];
+        extended = _this._extendSimple$4(simple, extensions, mediaQueryContext, targetsUsed);
+        if (extended == null) {
+          if (options != null) {
+            result = P.List_List$from(H.setRuntimeTypeInfo([simple], t12), false, t10);
+            result.fixed$length = Array;
+            result.immutable$list = Array;
+            t13 = result;
+            if (t13.length === 0)
+              H.throwExpression(P.ArgumentError$(_s28_));
+            result = P.List_List$from(H.setRuntimeTypeInfo([new X.CompoundSelector(t13)], t6), false, t7);
+            result.fixed$length = Array;
+            result.immutable$list = Array;
+            t13 = result;
+            if (t13.length === 0)
+              H.throwExpression(P.ArgumentError$(_s28_));
+            t14 = t11.$index(0, simple);
+            if (t14 == null)
+              t14 = 0;
+            options.push(H.setRuntimeTypeInfo([new S.Extension(new S.ComplexSelector(t13, false), _null, t14, true, true, _null, _null, _null)], t5));
+          }
+        } else {
+          if (options == null) {
+            options = H.setRuntimeTypeInfo([], t4);
+            if (i !== 0) {
+              t13 = new H.SubListIterable(t2, 0, i, t8);
+              t13.SubListIterable$3(t2, 0, i, t9);
+              result = P.List_List$from(t13, false, t10);
+              result.fixed$length = Array;
+              result.immutable$list = Array;
+              t13 = result;
+              compound = new X.CompoundSelector(t13);
+              if (t13.length === 0)
+                H.throwExpression(P.ArgumentError$(_s28_));
+              result = P.List_List$from(H.setRuntimeTypeInfo([compound], t6), false, t7);
+              result.fixed$length = Array;
+              result.immutable$list = Array;
+              t13 = result;
+              if (t13.length === 0)
+                H.throwExpression(P.ArgumentError$(_s28_));
+              t14 = _this._sourceSpecificityFor$1(compound);
+              options.push(H.setRuntimeTypeInfo([new S.Extension(new S.ComplexSelector(t13, false), _null, t14, true, true, _null, _null, _null)], t5));
+            }
+          }
+          C.JSArray_methods.addAll$1(options, extended);
+        }
+      }
+      if (options == null)
+        return _null;
+      if (targetsUsed != null && targetsUsed._collection$_length !== extensions.get$length(extensions))
+        return _null;
+      if (options.length === 1)
+        return J.map$1$1$ax(C.JSArray_methods.get$first(options), new F.Extender__extendCompound_closure(mediaQueryContext), type$.legacy_ComplexSelector).toList$0(0);
+      t1 = _box_1.first = t1 !== C.ExtendMode_replace;
+      unifiedPaths = J.map$1$1$ax(Y.paths(options, type$.legacy_Extension), new F.Extender__extendCompound_closure0(_box_1, mediaQueryContext), type$.legacy_List_legacy_ComplexSelector);
+      isOriginal = new F.Extender__extendCompound_closure1();
+      if (inOriginal && t1)
+        isOriginal = new F.Extender__extendCompound_closure2(J.get$first$ax(unifiedPaths.get$first(unifiedPaths)));
+      t1 = unifiedPaths.where$1(0, new F.Extender__extendCompound_closure3());
+      t2 = t1.$ti._eval$1("ExpandIterable<Iterable.E,ComplexSelector*>");
+      return _this._trim$2(P.List_List$from(new H.ExpandIterable(t1, new F.Extender__extendCompound_closure4(), t2), true, t2._eval$1("Iterable.E")), isOriginal);
+    },
+    _extendSimple$4: function(simple, extensions, mediaQueryContext, targetsUsed) {
+      var extended, result,
+        t1 = new F.Extender__extendSimple_withoutPseudo(this, extensions, targetsUsed);
+      if (simple instanceof D.PseudoSelector && simple.selector != null) {
+        extended = this._extendPseudo$3(simple, extensions, mediaQueryContext);
+        if (extended != null)
+          return new H.MappedListIterable(extended, new F.Extender__extendSimple_closure(this, t1), H._arrayInstanceType(extended)._eval$1("MappedListIterable<1,List<Extension*>*>"));
+      }
+      result = t1.call$1(simple);
+      return result == null ? null : H.setRuntimeTypeInfo([result], type$.JSArray_legacy_List_legacy_Extension);
+    },
+    _extensionForSimple$1: function(simple) {
+      var t1 = S.ComplexSelector$(H.setRuntimeTypeInfo([X.CompoundSelector$(H.setRuntimeTypeInfo([simple], type$.JSArray_legacy_SimpleSelector))], type$.JSArray_legacy_ComplexSelectorComponent), false),
+        t2 = this._sourceSpecificity.$index(0, simple);
+      return S.Extension$oneOff(t1, true, t2 == null ? 0 : t2);
+    },
+    _extendPseudo$3: function(pseudo, extensions, mediaQueryContext) {
+      var complexes, t2, result,
+        t1 = pseudo.selector,
+        extended = this._extendList$3(t1, extensions, mediaQueryContext);
+      if (extended == t1)
+        return null;
+      complexes = extended.components;
+      t2 = pseudo.normalizedName === "not";
+      if (t2 && !C.JSArray_methods.any$1(t1.components, new F.Extender__extendPseudo_closure()) && C.JSArray_methods.any$1(complexes, new F.Extender__extendPseudo_closure0()))
+        complexes = new H.WhereIterable(complexes, new F.Extender__extendPseudo_closure1(), H._arrayInstanceType(complexes)._eval$1("WhereIterable<1>"));
+      complexes = J.expand$1$1$ax(complexes, new F.Extender__extendPseudo_closure2(pseudo), type$.legacy_ComplexSelector);
+      if (t2 && t1.components.length === 1) {
+        t1 = H.MappedIterable_MappedIterable(complexes, new F.Extender__extendPseudo_closure3(pseudo), complexes.$ti._eval$1("Iterable.E"), type$.legacy_PseudoSelector);
+        result = P.List_List$from(t1, true, H._instanceType(t1)._eval$1("Iterable.E"));
+        return result.length === 0 ? null : result;
+      } else
+        return H.setRuntimeTypeInfo([D.PseudoSelector$(pseudo.name, pseudo.argument, !pseudo.isClass, D.SelectorList$(complexes))], type$.JSArray_legacy_PseudoSelector);
+    },
+    _trim$2: function(selectors, isOriginal) {
+      var result, i, t1, t2, numOriginals, _box_0, complex1, j, t3, t4, _i, component;
+      if (selectors.length > 100)
+        return selectors;
+      result = Q.QueueList$(null, type$.legacy_ComplexSelector);
+      $label0$0:
+        for (i = selectors.length - 1, t1 = H._arrayInstanceType(selectors), t2 = t1._precomputed1, t1 = t1._eval$1("SubListIterable<1>"), numOriginals = 0; i >= 0; --i) {
+          _box_0 = {};
+          complex1 = selectors[i];
+          if (isOriginal.call$1(complex1)) {
+            for (j = 0; j < numOriginals; ++j)
+              if (J.$eq$(result.$index(0, j), complex1)) {
+                B.rotateSlice(result, 0, j + 1);
+                continue $label0$0;
+              }
+            ++numOriginals;
+            result.addFirst$1(complex1);
+            continue $label0$0;
+          }
+          _box_0.maxSpecificity = 0;
+          for (t3 = complex1.components, t4 = t3.length, _i = 0; _i < t4; ++_i) {
+            component = t3[_i];
+            if (component instanceof X.CompoundSelector)
+              _box_0.maxSpecificity = Math.max(_box_0.maxSpecificity, this._sourceSpecificityFor$1(component));
+          }
+          if (result.any$1(result, new F.Extender__trim_closure(_box_0, complex1)))
+            continue $label0$0;
+          t3 = new H.SubListIterable(selectors, 0, i, t1);
+          t3.SubListIterable$3(selectors, 0, i, t2);
+          if (t3.any$1(0, new F.Extender__trim_closure0(_box_0, complex1)))
+            continue $label0$0;
+          result.addFirst$1(complex1);
+        }
+      return result;
+    },
+    _sourceSpecificityFor$1: function(compound) {
+      var t1, t2, t3, specificity, _i, t4;
+      for (t1 = compound.components, t2 = t1.length, t3 = this._sourceSpecificity, specificity = 0, _i = 0; _i < t2; ++_i) {
+        t4 = t3.$index(0, t1[_i]);
+        specificity = Math.max(specificity, H.checkNum(t4 == null ? 0 : t4));
+      }
+      return specificity;
+    },
+    clone$0: function() {
+      var t3, t4, _this = this,
+        t1 = type$.legacy_SimpleSelector,
+        newSelectors = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Set_legacy_ModifiableCssValue_legacy_SelectorList),
+        t2 = type$.legacy_ModifiableCssValue_legacy_SelectorList,
+        newMediaContexts = P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_List_legacy_CssMediaQuery),
+        oldToNewSelectors = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_CssValue_legacy_SelectorList, t2);
+      _this._selectors.forEach$1(0, new F.Extender_clone_closure(_this, newSelectors, oldToNewSelectors, newMediaContexts));
+      t2 = type$.legacy_Extension;
+      t3 = B.copyMapOfMap(_this._extensions, t1, type$.legacy_ComplexSelector, t2);
+      t2 = B.copyMapOfList(_this._extensionsByExtender, t1, t2);
+      t1 = P._LinkedIdentityHashMap__LinkedIdentityHashMap$es6(t1, type$.legacy_int);
+      t1.addAll$1(0, _this._sourceSpecificity);
+      t4 = new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_ComplexSelector);
+      t4.addAll$1(0, _this._originals);
+      return new S.Tuple2(new F.Extender(newSelectors, t3, t2, newMediaContexts, t1, t4, C.ExtendMode_normal), oldToNewSelectors, type$.Tuple2_of_legacy_Extender_and_legacy_Map_of_legacy_CssValue_legacy_SelectorList_and_legacy_ModifiableCssValue_legacy_SelectorList);
+    },
+    get$_extensions: function() {
+      return this._extensions;
+    },
+    get$_sourceSpecificity: function() {
+      return this._sourceSpecificity;
+    }
+  };
+  F.Extender_extensionsWhereTarget_closure.prototype = {
+    call$1: function(extension) {
+      return !extension.isOptional;
+    },
+    $signature: 346
+  };
+  F.Extender__registerSelector_closure.prototype = {
+    call$0: function() {
+      return P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList);
+    },
+    $signature: 345
+  };
+  F.Extender_addExtension_closure.prototype = {
+    call$0: function() {
+      return P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ComplexSelector, type$.legacy_Extension);
+    },
+    $signature: 86
+  };
+  F.Extender_addExtension_closure0.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extension);
+    },
+    $signature: 163
+  };
+  F.Extender_addExtension_closure1.prototype = {
+    call$0: function() {
+      return this.complex.get$maxSpecificity();
+    },
+    $signature: 11
+  };
+  F.Extender__extendExistingExtensions_closure.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extension);
+    },
+    $signature: 163
+  };
+  F.Extender__extendExistingExtensions_closure0.prototype = {
+    call$0: function() {
+      return P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ComplexSelector, type$.legacy_Extension);
+    },
+    $signature: 86
+  };
+  F.Extender_addExtensions_closure.prototype = {
+    call$2: function(target, newSources) {
+      var t1, extensionsForTarget, t2, t3, t4, selectorsForTarget, t5, existingSources, _this = this;
+      if (target instanceof N.PlaceholderSelector && T.isPrivate(target.name))
+        return;
+      t1 = _this.$this;
+      extensionsForTarget = t1._extensionsByExtender.$index(0, target);
+      t2 = extensionsForTarget == null;
+      if (!t2) {
+        t3 = _this._box_0;
+        t4 = t3.extensionsToExtend;
+        C.JSArray_methods.addAll$1(t4 == null ? t3.extensionsToExtend = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extension) : t4, extensionsForTarget);
+      }
+      selectorsForTarget = t1._selectors.$index(0, target);
+      t3 = selectorsForTarget != null;
+      if (t3) {
+        t4 = _this._box_0;
+        t5 = t4.selectorsToExtend;
+        (t5 == null ? t4.selectorsToExtend = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList) : t5).addAll$1(0, selectorsForTarget);
+      }
+      t1 = t1._extensions;
+      existingSources = t1.$index(0, target);
+      if (existingSources == null) {
+        t4 = _this.extender;
+        t1.$indexSet(0, target, t4.get$_extensions().$index(0, target));
+        if (!t2 || t3) {
+          t1 = _this._box_0;
+          t2 = t1.newExtensions;
+          t1 = t2 == null ? t1.newExtensions = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_SimpleSelector, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension) : t2;
+          t1.$indexSet(0, target, t4.get$_extensions().$index(0, target));
+        }
+      } else
+        newSources.forEach$1(0, new F.Extender_addExtensions__closure(_this._box_0, existingSources, extensionsForTarget, selectorsForTarget, target));
+    },
+    $signature: 341
+  };
+  F.Extender_addExtensions__closure.prototype = {
+    call$2: function(extender, extension) {
+      var t2, _this = this,
+        t1 = _this.existingSources;
+      if (t1.containsKey$1(extender))
+        return;
+      t1.$indexSet(0, extender, extension);
+      if (_this.extensionsForTarget != null || _this.selectorsForTarget != null) {
+        t1 = _this._box_0;
+        t2 = t1.newExtensions;
+        t1 = t2 == null ? t1.newExtensions = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_SimpleSelector, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension) : t2;
+        t1.putIfAbsent$2(_this.target, new F.Extender_addExtensions___closure()).putIfAbsent$2(extender, new F.Extender_addExtensions___closure0(extension));
+      }
+    },
+    $signature: 340
+  };
+  F.Extender_addExtensions___closure.prototype = {
+    call$0: function() {
+      return P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ComplexSelector, type$.legacy_Extension);
+    },
+    $signature: 86
+  };
+  F.Extender_addExtensions___closure0.prototype = {
+    call$0: function() {
+      return this.extension;
+    },
+    $signature: 339
+  };
+  F.Extender__extendList_closure.prototype = {
+    call$1: function(complex) {
+      return complex != null;
+    },
+    $signature: 15
+  };
+  F.Extender__extendComplex_closure.prototype = {
+    call$1: function(component) {
+      return H.setRuntimeTypeInfo([S.ComplexSelector$(H.setRuntimeTypeInfo([component], type$.JSArray_legacy_ComplexSelectorComponent), this.complex.lineBreak)], type$.JSArray_legacy_ComplexSelector);
+    },
+    $signature: 338
+  };
+  F.Extender__extendComplex_closure0.prototype = {
+    call$1: function(path) {
+      var t1 = Y.weave(J.map$1$1$ax(path, new F.Extender__extendComplex__closure(), type$.legacy_List_legacy_ComplexSelectorComponent).toList$0(0));
+      return new H.MappedListIterable(t1, new F.Extender__extendComplex__closure0(this._box_0, this.$this, this.complex, path), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,ComplexSelector*>"));
+    },
+    $signature: 336
+  };
+  F.Extender__extendComplex__closure.prototype = {
+    call$1: function(complex) {
+      return complex.components;
+    },
+    $signature: 335
+  };
+  F.Extender__extendComplex__closure0.prototype = {
+    call$1: function(components) {
+      var _this = this,
+        t1 = _this.complex,
+        outputComplex = S.ComplexSelector$(components, t1.lineBreak || J.any$1$ax(_this.path, new F.Extender__extendComplex___closure())),
+        t2 = _this._box_0;
+      if (t2.first && _this.$this._originals.contains$1(0, t1))
+        _this.$this._originals.add$1(0, outputComplex);
+      t2.first = false;
+      return outputComplex;
+    },
+    $signature: 62
+  };
+  F.Extender__extendComplex___closure.prototype = {
+    call$1: function(inputComplex) {
+      return inputComplex.lineBreak;
+    },
+    $signature: 15
+  };
+  F.Extender__extendCompound_closure.prototype = {
+    call$1: function(state) {
+      state.assertCompatibleMediaContext$1(this.mediaQueryContext);
+      return state.extender;
+    },
+    $signature: 334
+  };
+  F.Extender__extendCompound_closure0.prototype = {
+    call$1: function(path) {
+      var complexes, toUnify, t2, t3, originals, t4, _box_0 = {},
+        t1 = this._box_1;
+      if (t1.first) {
+        t1.first = false;
+        complexes = H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([X.CompoundSelector$(J.expand$1$1$ax(path, new F.Extender__extendCompound__closure(), type$.legacy_SimpleSelector))], type$.JSArray_legacy_ComplexSelectorComponent)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent);
+      } else {
+        toUnify = Q.QueueList$(null, type$.legacy_List_legacy_ComplexSelectorComponent);
+        for (t1 = J.get$iterator$ax(path), t2 = type$.legacy_CompoundSelector, t3 = type$.JSArray_legacy_SimpleSelector, originals = null; t1.moveNext$0();) {
+          t4 = t1.get$current(t1);
+          if (t4.isOriginal) {
+            if (originals == null)
+              originals = H.setRuntimeTypeInfo([], t3);
+            C.JSArray_methods.addAll$1(originals, t2._as(C.JSArray_methods.get$last(t4.extender.components)).components);
+          } else
+            toUnify._queue_list$_add$1(t4.extender.components);
+        }
+        if (originals != null)
+          toUnify.addFirst$1(H.setRuntimeTypeInfo([X.CompoundSelector$(originals)], type$.JSArray_legacy_ComplexSelectorComponent));
+        complexes = Y.unifyComplex(toUnify);
+        if (complexes == null)
+          return null;
+      }
+      _box_0.lineBreak = false;
+      for (t1 = J.get$iterator$ax(path), t2 = this.mediaQueryContext; t1.moveNext$0();) {
+        t3 = t1.get$current(t1);
+        t3.assertCompatibleMediaContext$1(t2);
+        _box_0.lineBreak = _box_0.lineBreak || t3.extender.lineBreak;
+      }
+      t1 = J.map$1$1$ax(complexes, new F.Extender__extendCompound__closure0(_box_0), type$.legacy_ComplexSelector);
+      return P.List_List$from(t1, true, t1.$ti._eval$1("ListIterable.E"));
+    },
+    $signature: 333
+  };
+  F.Extender__extendCompound__closure.prototype = {
+    call$1: function(state) {
+      return type$.legacy_CompoundSelector._as(C.JSArray_methods.get$last(state.extender.components)).components;
+    },
+    $signature: 330
+  };
+  F.Extender__extendCompound__closure0.prototype = {
+    call$1: function(components) {
+      return S.ComplexSelector$(components, this._box_0.lineBreak);
+    },
+    $signature: 62
+  };
+  F.Extender__extendCompound_closure1.prototype = {
+    call$1: function(_) {
+      return false;
+    },
+    $signature: 15
+  };
+  F.Extender__extendCompound_closure2.prototype = {
+    call$1: function(complex) {
+      return J.$eq$(complex, this.original);
+    },
+    $signature: 15
+  };
+  F.Extender__extendCompound_closure3.prototype = {
+    call$1: function(complexes) {
+      return complexes != null;
+    },
+    $signature: 329
+  };
+  F.Extender__extendCompound_closure4.prototype = {
+    call$1: function(l) {
+      return l;
+    },
+    $signature: 326
+  };
+  F.Extender__extendSimple_withoutPseudo.prototype = {
+    call$1: function(simple) {
+      var t1, t2,
+        extenders = this.extensions.$index(0, simple);
+      if (extenders == null)
+        return null;
+      t1 = this.targetsUsed;
+      if (t1 != null)
+        t1.add$1(0, simple);
+      t1 = this.$this;
+      if (t1._mode === C.ExtendMode_replace) {
+        t1 = extenders.get$values(extenders);
+        return P.List_List$from(t1, true, H._instanceType(t1)._eval$1("Iterable.E"));
+      }
+      t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extension);
+      t2.push(t1._extensionForSimple$1(simple));
+      for (t1 = extenders.get$values(extenders), t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        t2.push(t1.get$current(t1));
+      return t2;
+    },
+    $signature: 324
+  };
+  F.Extender__extendSimple_closure.prototype = {
+    call$1: function(pseudo) {
+      var t1 = this.withoutPseudo.call$1(pseudo);
+      return t1 == null ? H.setRuntimeTypeInfo([this.$this._extensionForSimple$1(pseudo)], type$.JSArray_legacy_Extension) : t1;
+    },
+    $signature: 322
+  };
+  F.Extender__extendPseudo_closure.prototype = {
+    call$1: function(complex) {
+      return complex.components.length > 1;
+    },
+    $signature: 15
+  };
+  F.Extender__extendPseudo_closure0.prototype = {
+    call$1: function(complex) {
+      return complex.components.length === 1;
+    },
+    $signature: 15
+  };
+  F.Extender__extendPseudo_closure1.prototype = {
+    call$1: function(complex) {
+      return complex.components.length <= 1;
+    },
+    $signature: 15
+  };
+  F.Extender__extendPseudo_closure2.prototype = {
+    call$1: function(complex) {
+      var innerPseudo, t2,
+        t1 = complex.components;
+      if (t1.length !== 1)
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector);
+      if (!(C.JSArray_methods.get$first(t1) instanceof X.CompoundSelector))
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector);
+      t1 = type$.legacy_CompoundSelector._as(C.JSArray_methods.get$first(t1)).components;
+      if (t1.length !== 1)
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector);
+      if (!(C.JSArray_methods.get$first(t1) instanceof D.PseudoSelector))
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector);
+      innerPseudo = type$.legacy_PseudoSelector._as(C.JSArray_methods.get$first(t1));
+      t1 = innerPseudo.selector;
+      if (t1 == null)
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector);
+      t2 = this.pseudo;
+      switch (t2.normalizedName) {
+        case "not":
+          if (innerPseudo.normalizedName !== "matches")
+            return H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelector);
+          return t1.components;
+        case "matches":
+        case "any":
+        case "current":
+        case "nth-child":
+        case "nth-last-child":
+          if (innerPseudo.name !== t2.name)
+            return H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelector);
+          if (innerPseudo.argument != t2.argument)
+            return H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelector);
+          return t1.components;
+        case "has":
+        case "host":
+        case "host-context":
+        case "slotted":
+          return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector);
+        default:
+          return H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelector);
+      }
+    },
+    $signature: 320
+  };
+  F.Extender__extendPseudo_closure3.prototype = {
+    call$1: function(complex) {
+      var t1 = this.pseudo;
+      return D.PseudoSelector$(t1.name, t1.argument, !t1.isClass, D.SelectorList$(H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector)));
+    },
+    $signature: 317
+  };
+  F.Extender__trim_closure.prototype = {
+    call$1: function(complex2) {
+      return complex2.get$minSpecificity() >= this._box_0.maxSpecificity && Y.complexIsSuperselector(complex2.components, this.complex1.components);
+    },
+    $signature: 15
+  };
+  F.Extender__trim_closure0.prototype = {
+    call$1: function(complex2) {
+      return complex2.get$minSpecificity() >= this._box_0.maxSpecificity && Y.complexIsSuperselector(complex2.components, this.complex1.components);
+    },
+    $signature: 15
+  };
+  F.Extender_clone_closure.prototype = {
+    call$2: function(simple, selectors) {
+      var t1, t2, t3, t4, t5, t6, newSelector, mediaContext, _this = this,
+        newSelectorSet = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList);
+      _this.newSelectors.$indexSet(0, simple, newSelectorSet);
+      for (t1 = selectors.get$iterator(selectors), t2 = type$.ModifiableCssValue_legacy_SelectorList, t3 = _this.oldToNewSelectors, t4 = _this.$this._mediaContexts, t5 = _this.newMediaContexts; t1.moveNext$0();) {
+        t6 = t1.get$current(t1);
+        newSelector = new F.ModifiableCssValue(t6.value, t6.span, t2);
+        newSelectorSet.add$1(0, newSelector);
+        t3.$indexSet(0, t6, newSelector);
+        mediaContext = t4.$index(0, t6);
+        if (mediaContext != null)
+          t5.$indexSet(0, newSelector, mediaContext);
+      }
+    },
+    $signature: 314
+  };
+  S.Extension.prototype = {
+    assertCompatibleMediaContext$1: function(mediaContext) {
+      var t1 = this.mediaContext;
+      if (t1 == null)
+        return;
+      if (mediaContext != null && C.C_ListEquality.equals$2(0, t1, mediaContext))
+        return;
+      throw H.wrapException(E.SassException$(string$.You_ma, this.span));
+    },
+    toString$0: function(_) {
+      var t1 = H.S(this.extender) + " {@extend " + H.S(this.target);
+      return t1 + (this.isOptional ? " !optional" : "") + "}";
+    },
+    get$target: function() {
+      return this.target;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Y.unifyComplex_closure.prototype = {
+    call$1: function(complex) {
+      var t1 = J.getInterceptor$asx(complex);
+      return t1.sublist$2(complex, 0, t1.get$length(complex) - 1);
+    },
+    $signature: 97
+  };
+  Y._weaveParents_closure.prototype = {
+    call$2: function(group1, group2) {
+      var unified, t1, _null = null;
+      if (C.C_ListEquality.equals$2(0, group1, group2))
+        return group1;
+      if (!(J.get$first$ax(group1) instanceof X.CompoundSelector) || !(J.get$first$ax(group2) instanceof X.CompoundSelector))
+        return _null;
+      if (Y.complexIsParentSuperselector(group1, group2))
+        return group2;
+      if (Y.complexIsParentSuperselector(group2, group1))
+        return group1;
+      if (!Y._mustUnify(group1, group2))
+        return _null;
+      unified = Y.unifyComplex(H.setRuntimeTypeInfo([group1, group2], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent));
+      if (unified == null)
+        return _null;
+      t1 = J.getInterceptor$asx(unified);
+      if (t1.get$length(unified) > 1)
+        return _null;
+      return t1.get$first(unified);
+    },
+    $signature: 312
+  };
+  Y._weaveParents_closure0.prototype = {
+    call$1: function(sequence) {
+      return Y.complexIsParentSuperselector(sequence.get$first(sequence), this.group);
+    },
+    $signature: 311
+  };
+  Y._weaveParents_closure1.prototype = {
+    call$1: function(chunk) {
+      return J.expand$1$1$ax(chunk, new Y._weaveParents__closure1(), type$.legacy_ComplexSelectorComponent);
+    },
+    $signature: 130
+  };
+  Y._weaveParents__closure1.prototype = {
+    call$1: function(group) {
+      return group;
+    },
+    $signature: 97
+  };
+  Y._weaveParents_closure2.prototype = {
+    call$1: function(sequence) {
+      return sequence.get$length(sequence) === 0;
+    },
+    $signature: 131
+  };
+  Y._weaveParents_closure3.prototype = {
+    call$1: function(chunk) {
+      return J.expand$1$1$ax(chunk, new Y._weaveParents__closure0(), type$.legacy_ComplexSelectorComponent);
+    },
+    $signature: 130
+  };
+  Y._weaveParents__closure0.prototype = {
+    call$1: function(group) {
+      return group;
+    },
+    $signature: 97
+  };
+  Y._weaveParents_closure4.prototype = {
+    call$1: function(choice) {
+      return J.get$isNotEmpty$asx(choice);
+    },
+    $signature: 306
+  };
+  Y._weaveParents_closure5.prototype = {
+    call$1: function(path) {
+      var t1 = J.expand$1$1$ax(path, new Y._weaveParents__closure(), type$.legacy_ComplexSelectorComponent);
+      return P.List_List$from(t1, true, t1.$ti._eval$1("Iterable.E"));
+    },
+    $signature: 305
+  };
+  Y._weaveParents__closure.prototype = {
+    call$1: function(group) {
+      return group;
+    },
+    $signature: 304
+  };
+  Y._mustUnify_closure.prototype = {
+    call$1: function(component) {
+      return component instanceof X.CompoundSelector && C.JSArray_methods.any$1(component.components, new Y._mustUnify__closure(this.uniqueSelectors));
+    },
+    $signature: 91
+  };
+  Y._mustUnify__closure.prototype = {
+    call$1: function(simple) {
+      var t1;
+      if (!(simple instanceof N.IDSelector))
+        t1 = simple instanceof D.PseudoSelector && !simple.isClass;
+      else
+        t1 = true;
+      return t1 && this.uniqueSelectors.contains$1(0, simple);
+    },
+    $signature: 18
+  };
+  Y.paths_closure.prototype = {
+    call$2: function(paths, choice) {
+      var t1 = this.T;
+      t1 = J.expand$1$1$ax(choice, new Y.paths__closure(paths, t1), t1._eval$1("List<0*>*"));
+      return P.List_List$from(t1, true, t1.$ti._eval$1("Iterable.E"));
+    },
+    $signature: function() {
+      return this.T._eval$1("List<List<0*>*>*(List<List<0*>*>*,List<0*>*)");
+    }
+  };
+  Y.paths__closure.prototype = {
+    call$1: function(option) {
+      var t1 = this.T;
+      return J.map$1$1$ax(this.paths, new Y.paths___closure(option, t1), t1._eval$1("List<0*>*"));
+    },
+    $signature: function() {
+      return this.T._eval$1("Iterable<List<0*>*>*(0*)");
+    }
+  };
+  Y.paths___closure.prototype = {
+    call$1: function(path) {
+      var t2,
+        t1 = H.setRuntimeTypeInfo([], this.T._eval$1("JSArray<0*>"));
+      for (t2 = J.get$iterator$ax(path); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      t1.push(this.option);
+      return t1;
+    },
+    $signature: function() {
+      return this.T._eval$1("List<0*>*(List<0*>*)");
+    }
+  };
+  Y._hasRoot_closure.prototype = {
+    call$1: function(simple) {
+      return simple instanceof D.PseudoSelector && simple.isClass && simple.normalizedName === "root";
+    },
+    $signature: 18
+  };
+  Y.listIsSuperselector_closure.prototype = {
+    call$1: function(complex1) {
+      return C.JSArray_methods.any$1(this.list1, new Y.listIsSuperselector__closure(complex1));
+    },
+    $signature: 15
+  };
+  Y.listIsSuperselector__closure.prototype = {
+    call$1: function(complex2) {
+      return Y.complexIsSuperselector(complex2.components, this.complex1.components);
+    },
+    $signature: 15
+  };
+  Y._simpleIsSuperselectorOfCompound_closure.prototype = {
+    call$1: function(theirSimple) {
+      var t1 = this.simple;
+      if (J.$eq$(t1, theirSimple))
+        return true;
+      if (theirSimple instanceof D.PseudoSelector && theirSimple.selector != null && $._subselectorPseudos.contains$1(0, theirSimple.normalizedName))
+        return C.JSArray_methods.every$1(theirSimple.selector.components, new Y._simpleIsSuperselectorOfCompound__closure(t1));
+      else
+        return false;
+    },
+    $signature: 18
+  };
+  Y._simpleIsSuperselectorOfCompound__closure.prototype = {
+    call$1: function(complex) {
+      var t1 = complex.components;
+      if (t1.length !== 1)
+        return false;
+      return C.JSArray_methods.contains$1(type$.legacy_CompoundSelector._as(C.JSArray_methods.get$single(t1)).components, this.simple);
+    },
+    $signature: 15
+  };
+  Y._selectorPseudoIsSuperselector_closure.prototype = {
+    call$1: function(pseudo2) {
+      var t1 = pseudo2.selector;
+      return Y.listIsSuperselector(this.pseudo1.selector.components, t1.components);
+    },
+    $signature: 51
+  };
+  Y._selectorPseudoIsSuperselector_closure0.prototype = {
+    call$1: function(complex1) {
+      var t1 = complex1.components,
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent),
+        t3 = this.parents;
+      if (t3 != null)
+        for (t3 = t3.get$iterator(t3); t3.moveNext$0();)
+          t2.push(t3.get$current(t3));
+      t2.push(this.compound2);
+      return Y.complexIsSuperselector(t1, t2);
+    },
+    $signature: 15
+  };
+  Y._selectorPseudoIsSuperselector_closure1.prototype = {
+    call$1: function(pseudo2) {
+      var t1 = pseudo2.selector;
+      return Y.listIsSuperselector(this.pseudo1.selector.components, t1.components);
+    },
+    $signature: 51
+  };
+  Y._selectorPseudoIsSuperselector_closure2.prototype = {
+    call$1: function(pseudo2) {
+      var t1 = pseudo2.selector;
+      return Y.listIsSuperselector(this.pseudo1.selector.components, t1.components);
+    },
+    $signature: 51
+  };
+  Y._selectorPseudoIsSuperselector_closure3.prototype = {
+    call$1: function(complex) {
+      return C.JSArray_methods.any$1(this.compound2.components, new Y._selectorPseudoIsSuperselector__closure(complex, this.pseudo1));
+    },
+    $signature: 15
+  };
+  Y._selectorPseudoIsSuperselector__closure.prototype = {
+    call$1: function(simple2) {
+      var compound1, _this = this;
+      if (simple2 instanceof F.TypeSelector) {
+        compound1 = C.JSArray_methods.get$last(_this.complex.components);
+        return compound1 instanceof X.CompoundSelector && C.JSArray_methods.any$1(compound1.components, new Y._selectorPseudoIsSuperselector___closure(simple2));
+      } else if (simple2 instanceof N.IDSelector) {
+        compound1 = C.JSArray_methods.get$last(_this.complex.components);
+        return compound1 instanceof X.CompoundSelector && C.JSArray_methods.any$1(compound1.components, new Y._selectorPseudoIsSuperselector___closure0(simple2));
+      } else if (simple2 instanceof D.PseudoSelector && simple2.name === _this.pseudo1.name && simple2.selector != null)
+        return Y.listIsSuperselector(simple2.selector.components, H.setRuntimeTypeInfo([_this.complex], type$.JSArray_legacy_ComplexSelector));
+      else
+        return false;
+    },
+    $signature: 18
+  };
+  Y._selectorPseudoIsSuperselector___closure.prototype = {
+    call$1: function(simple1) {
+      var t1;
+      if (simple1 instanceof F.TypeSelector) {
+        t1 = this.simple2.name.$eq(0, simple1.name);
+        t1 = !t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 18
+  };
+  Y._selectorPseudoIsSuperselector___closure0.prototype = {
+    call$1: function(simple1) {
+      var t1;
+      if (simple1 instanceof N.IDSelector) {
+        t1 = simple1.name;
+        t1 = this.simple2.name !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 18
+  };
+  Y._selectorPseudoIsSuperselector_closure4.prototype = {
+    call$1: function(pseudo2) {
+      return J.$eq$(this.pseudo1.selector, pseudo2.selector);
+    },
+    $signature: 51
+  };
+  Y._selectorPseudoIsSuperselector_closure5.prototype = {
+    call$1: function(pseudo2) {
+      var t1, t2;
+      if (pseudo2 instanceof D.PseudoSelector) {
+        t1 = this.pseudo1;
+        if (pseudo2.name === t1.name)
+          if (pseudo2.argument == t1.argument) {
+            t2 = pseudo2.selector;
+            t2 = Y.listIsSuperselector(t1.selector.components, t2.components);
+            t1 = t2;
+          } else
+            t1 = false;
+        else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 18
+  };
+  Y._selectorPseudosNamed_closure.prototype = {
+    call$1: function(pseudo) {
+      return pseudo.isClass === this.isClass && pseudo.selector != null && pseudo.name === this.name;
+    },
+    $signature: 51
+  };
+  A.MergedExtension.prototype = {
+    unmerge$0: function() {
+      var $async$self = this;
+      return P._makeSyncStarIterable(function() {
+        var $async$goto = 0, $async$handler = 1, $async$currentError, t1;
+        return function $async$unmerge$0($async$errorCode, $async$result) {
+          if ($async$errorCode === 1) {
+            $async$currentError = $async$result;
+            $async$goto = $async$handler;
+          }
+          while (true)
+            switch ($async$goto) {
+              case 0:
+                // Function start
+                t1 = $async$self.left;
+                $async$goto = t1 instanceof A.MergedExtension ? 2 : 4;
+                break;
+              case 2:
+                // then
+                $async$goto = 5;
+                return P._IterationMarker_yieldStar(t1.unmerge$0());
+              case 5:
+                // after yield
+                // goto join
+                $async$goto = 3;
+                break;
+              case 4:
+                // else
+                $async$goto = 6;
+                return t1;
+              case 6:
+                // after yield
+              case 3:
+                // join
+                $async$goto = 7;
+                return $async$self.right;
+              case 7:
+                // after yield
+                // implicit return
+                return P._IterationMarker_endOfIteration();
+              case 1:
+                // rethrow
+                return P._IterationMarker_uncaughtError($async$currentError);
+            }
+        };
+      }, type$.legacy_Extension);
+    }
+  };
+  L.ExtendMode.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  Y.closure.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return t1.$index($arguments, 0).get$isTruthy() ? t1.$index($arguments, 1) : t1.$index($arguments, 2);
+    },
+    $signature: 5
+  };
+  K.closure44.prototype = {
+    call$1: function($arguments) {
+      return K._rgb("rgb", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure45.prototype = {
+    call$1: function($arguments) {
+      return K._rgb("rgb", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure46.prototype = {
+    call$1: function($arguments) {
+      return K._rgbTwoArg("rgb", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure47.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels("rgb", H.setRuntimeTypeInfo(["$red", "$green", "$blue"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      return parsed instanceof D.SassString ? parsed : K._rgb("rgb", type$.legacy_List_legacy_Value._as(parsed));
+    },
+    $signature: 5
+  };
+  K.closure48.prototype = {
+    call$1: function($arguments) {
+      return K._rgb("rgba", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure49.prototype = {
+    call$1: function($arguments) {
+      return K._rgb("rgba", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure50.prototype = {
+    call$1: function($arguments) {
+      return K._rgbTwoArg("rgba", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure51.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels("rgba", H.setRuntimeTypeInfo(["$red", "$green", "$blue"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      return parsed instanceof D.SassString ? parsed : K._rgb("rgba", type$.legacy_List_legacy_Value._as(parsed));
+    },
+    $signature: 5
+  };
+  K.closure52.prototype = {
+    call$1: function($arguments) {
+      var color, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        weight = t1.$index($arguments, 1).assertNumber$1("weight");
+      if (t1.$index($arguments, 0) instanceof T.SassNumber) {
+        if (weight.value !== 100 || !weight.hasUnit$1("%"))
+          throw H.wrapException(string$.Only_oa);
+        return K._functionString("invert", t1.take$1($arguments, 1));
+      }
+      color = t1.$index($arguments, 0).assertColor$1("color");
+      t1 = color.get$red();
+      t2 = color.get$green();
+      return K._mixColors(color.changeRgb$3$blue$green$red(255 - color.get$blue(), 255 - t2, 255 - t1), color, weight);
+    },
+    $signature: 5
+  };
+  K.closure53.prototype = {
+    call$1: function($arguments) {
+      return K._hsl("hsl", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure54.prototype = {
+    call$1: function($arguments) {
+      return K._hsl("hsl", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure55.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0).get$isVar() || t1.$index($arguments, 1).get$isVar())
+        return K._functionString("hsl", $arguments);
+      else
+        throw H.wrapException(E.SassScriptException$("Missing argument $lightness."));
+    },
+    $signature: 16
+  };
+  K.closure56.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels("hsl", H.setRuntimeTypeInfo(["$hue", "$saturation", "$lightness"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      return parsed instanceof D.SassString ? parsed : K._hsl("hsl", type$.legacy_List_legacy_Value._as(parsed));
+    },
+    $signature: 5
+  };
+  K.closure57.prototype = {
+    call$1: function($arguments) {
+      return K._hsl("hsla", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure58.prototype = {
+    call$1: function($arguments) {
+      return K._hsl("hsla", $arguments);
+    },
+    $signature: 5
+  };
+  K.closure59.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0).get$isVar() || t1.$index($arguments, 1).get$isVar())
+        return K._functionString("hsla", $arguments);
+      else
+        throw H.wrapException(E.SassScriptException$("Missing argument $lightness."));
+    },
+    $signature: 16
+  };
+  K.closure60.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels("hsla", H.setRuntimeTypeInfo(["$hue", "$saturation", "$lightness"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      return parsed instanceof D.SassString ? parsed : K._hsl("hsla", type$.legacy_List_legacy_Value._as(parsed));
+    },
+    $signature: 5
+  };
+  K.closure61.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0) instanceof T.SassNumber)
+        return K._functionString("grayscale", $arguments);
+      return t1.$index($arguments, 0).assertColor$1("color").changeHsl$1$saturation(0);
+    },
+    $signature: 5
+  };
+  K.closure62.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        degrees = t1.$index($arguments, 1).assertNumber$1("degrees");
+      K._checkAngle(degrees, null);
+      return color.changeHsl$1$hue(color.get$hue() + degrees.value);
+    },
+    $signature: 25
+  };
+  K.closure63.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        amount = t1.$index($arguments, 1).assertNumber$1("amount");
+      return color.changeHsl$1$lightness(C.JSNumber_methods.clamp$2(color.get$lightness() + amount.valueInRange$3(0, 100, "amount"), 0, 100));
+    },
+    $signature: 25
+  };
+  K.closure64.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        amount = t1.$index($arguments, 1).assertNumber$1("amount");
+      return color.changeHsl$1$lightness(C.JSNumber_methods.clamp$2(color.get$lightness() - amount.valueInRange$3(0, 100, "amount"), 0, 100));
+    },
+    $signature: 25
+  };
+  K.closure65.prototype = {
+    call$1: function($arguments) {
+      return new D.SassString("saturate(" + N.serializeValue0(J.$index$asx($arguments, 0).assertNumber$1("amount"), false, true) + ")", false);
+    },
+    $signature: 16
+  };
+  K.closure66.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        amount = t1.$index($arguments, 1).assertNumber$1("amount");
+      return color.changeHsl$1$saturation(C.JSNumber_methods.clamp$2(color.get$saturation() + amount.valueInRange$3(0, 100, "amount"), 0, 100));
+    },
+    $signature: 25
+  };
+  K.closure67.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        amount = t1.$index($arguments, 1).assertNumber$1("amount");
+      return color.changeHsl$1$saturation(C.JSNumber_methods.clamp$2(color.get$saturation() - amount.valueInRange$3(0, 100, "amount"), 0, 100));
+    },
+    $signature: 25
+  };
+  K.closure68.prototype = {
+    call$1: function($arguments) {
+      var color,
+        argument = J.$index$asx($arguments, 0);
+      if (argument instanceof D.SassString && !argument.hasQuotes && J.contains$1$asx(argument.text, $.$get$_microsoftFilterStart()))
+        return K._functionString("alpha", $arguments);
+      color = argument.assertColor$1("color");
+      return new N.UnitlessSassNumber(color.alpha, null);
+    },
+    $signature: 5
+  };
+  K.closure69.prototype = {
+    call$1: function($arguments) {
+      var t1,
+        argList = J.$index$asx($arguments, 0).get$asList();
+      if (argList.length !== 0 && C.JSArray_methods.every$1(argList, new K._closure8()))
+        return K._functionString("alpha", $arguments);
+      t1 = argList.length;
+      if (t1 === 0)
+        throw H.wrapException(E.SassScriptException$("Missing argument $color."));
+      else
+        throw H.wrapException(E.SassScriptException$("Only 1 argument allowed, but " + t1 + " were passed."));
+    },
+    $signature: 16
+  };
+  K._closure8.prototype = {
+    call$1: function(argument) {
+      return argument instanceof D.SassString && !argument.hasQuotes && J.contains$1$asx(argument.text, $.$get$_microsoftFilterStart());
+    },
+    $signature: 53
+  };
+  K.closure70.prototype = {
+    call$1: function($arguments) {
+      var color,
+        t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0) instanceof T.SassNumber)
+        return K._functionString("opacity", $arguments);
+      color = t1.$index($arguments, 0).assertColor$1("color");
+      return new N.UnitlessSassNumber(color.alpha, null);
+    },
+    $signature: 5
+  };
+  K.closure99.prototype = {
+    call$1: function($arguments) {
+      var result, color, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        weight = t1.$index($arguments, 1).assertNumber$1("weight");
+      if (t1.$index($arguments, 0) instanceof T.SassNumber) {
+        if (weight.value !== 100 || !weight.hasUnit$1("%"))
+          throw H.wrapException(string$.Only_oa);
+        result = K._functionString("invert", t1.take$1($arguments, 1));
+        N.warn("Passing a number (" + H.S(t1.$index($arguments, 0)) + string$.x29x20to_ci + result.toString$0(0), true);
+        return result;
+      }
+      color = t1.$index($arguments, 0).assertColor$1("color");
+      t1 = color.get$red();
+      t2 = color.get$green();
+      return K._mixColors(color.changeRgb$3$blue$green$red(255 - color.get$blue(), 255 - t2, 255 - t1), color, weight);
+    },
+    $signature: 5
+  };
+  K.closure100.prototype = {
+    call$1: function($arguments) {
+      var result,
+        t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0) instanceof T.SassNumber) {
+        result = K._functionString("grayscale", t1.take$1($arguments, 1));
+        N.warn("Passing a number (" + H.S(t1.$index($arguments, 0)) + string$.x29x20to_cg + result.toString$0(0), true);
+        return result;
+      }
+      return t1.$index($arguments, 0).assertColor$1("color").changeHsl$1$saturation(0);
+    },
+    $signature: 5
+  };
+  K.closure101.prototype = {
+    call$1: function($arguments) {
+      return K._hwb($arguments);
+    },
+    $signature: 5
+  };
+  K.closure102.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels("hwb", H.setRuntimeTypeInfo(["$hue", "$whiteness", "$blackness"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      if (parsed instanceof D.SassString)
+        throw H.wrapException(E.SassScriptException$('Expected numeric channels, got "' + parsed.toString$0(0) + '".'));
+      else
+        return K._hwb(type$.legacy_List_legacy_Value._as(parsed));
+    },
+    $signature: 5
+  };
+  K.closure103.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$whiteness();
+      return new L.SingleUnitSassNumber("%", t1, null);
+    },
+    $signature: 9
+  };
+  K.closure104.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$blackness();
+      return new L.SingleUnitSassNumber("%", t1, null);
+    },
+    $signature: 9
+  };
+  K.closure105.prototype = {
+    call$1: function($arguments) {
+      var result, color,
+        argument = J.$index$asx($arguments, 0);
+      if (argument instanceof D.SassString && !argument.hasQuotes && J.contains$1$asx(argument.text, $.$get$_microsoftFilterStart())) {
+        result = K._functionString("alpha", $arguments);
+        N.warn(string$.Using_ + result.toString$0(0), true);
+        return result;
+      }
+      color = argument.assertColor$1("color");
+      return new N.UnitlessSassNumber(color.alpha, null);
+    },
+    $signature: 5
+  };
+  K.closure106.prototype = {
+    call$1: function($arguments) {
+      var result,
+        t1 = J.getInterceptor$asx($arguments);
+      if (C.JSArray_methods.every$1(t1.$index($arguments, 0).get$asList(), new K._closure13())) {
+        result = K._functionString("alpha", $arguments);
+        N.warn(string$.Using_ + result.toString$0(0), true);
+        return result;
+      }
+      throw H.wrapException(E.SassScriptException$("Only 1 argument allowed, but " + t1.get$length($arguments) + " were passed."));
+    },
+    $signature: 16
+  };
+  K._closure13.prototype = {
+    call$1: function(argument) {
+      return argument instanceof D.SassString && !argument.hasQuotes && J.contains$1$asx(argument.text, $.$get$_microsoftFilterStart());
+    },
+    $signature: 53
+  };
+  K.closure107.prototype = {
+    call$1: function($arguments) {
+      var result, color,
+        t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0) instanceof T.SassNumber) {
+        result = K._functionString("opacity", $arguments);
+        N.warn("Passing a number (" + H.S(t1.$index($arguments, 0)) + string$.x20to_co + result.toString$0(0), true);
+        return result;
+      }
+      color = t1.$index($arguments, 0).assertColor$1("color");
+      return new N.UnitlessSassNumber(color.alpha, null);
+    },
+    $signature: 5
+  };
+  K.closure82.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$red();
+      return new N.UnitlessSassNumber(t1, null);
+    },
+    $signature: 9
+  };
+  K.closure81.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$green();
+      return new N.UnitlessSassNumber(t1, null);
+    },
+    $signature: 9
+  };
+  K.closure80.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$blue();
+      return new N.UnitlessSassNumber(t1, null);
+    },
+    $signature: 9
+  };
+  K.closure79.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return K._mixColors(t1.$index($arguments, 0).assertColor$1("color1"), t1.$index($arguments, 1).assertColor$1("color2"), t1.$index($arguments, 2).assertNumber$1("weight"));
+    },
+    $signature: 25
+  };
+  K.closure78.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$hue();
+      return new L.SingleUnitSassNumber("deg", t1, null);
+    },
+    $signature: 9
+  };
+  K.closure77.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$saturation();
+      return new L.SingleUnitSassNumber("%", t1, null);
+    },
+    $signature: 9
+  };
+  K.closure76.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$lightness();
+      return new L.SingleUnitSassNumber("%", t1, null);
+    },
+    $signature: 9
+  };
+  K.closure75.prototype = {
+    call$1: function($arguments) {
+      var color = J.$index$asx($arguments, 0).assertColor$1("color");
+      return color.changeHsl$1$hue(color.get$hue() + 180);
+    },
+    $signature: 25
+  };
+  K.closure73.prototype = {
+    call$1: function($arguments) {
+      return K._updateComponents($arguments, true, false, false);
+    },
+    $signature: 25
+  };
+  K.closure72.prototype = {
+    call$1: function($arguments) {
+      return K._updateComponents($arguments, false, false, true);
+    },
+    $signature: 25
+  };
+  K.closure71.prototype = {
+    call$1: function($arguments) {
+      return K._updateComponents($arguments, false, true, false);
+    },
+    $signature: 25
+  };
+  K.closure74.prototype = {
+    call$1: function($arguments) {
+      var color = J.$index$asx($arguments, 0).assertColor$1("color"),
+        t1 = new K.closure_hexString();
+      return new D.SassString("#" + H.S(t1.call$1(T.fuzzyRound(color.alpha * 255))) + H.S(t1.call$1(color.get$red())) + H.S(t1.call$1(color.get$green())) + H.S(t1.call$1(color.get$blue())), false);
+    },
+    $signature: 16
+  };
+  K.closure_hexString.prototype = {
+    call$1: function(component) {
+      return C.JSString_methods.padLeft$2(J.toRadixString$1$n(component, 16), 2, "0").toUpperCase();
+    },
+    $signature: 84
+  };
+  K._updateComponents_getParam.prototype = {
+    call$4$assertPercent$checkPercent: function($name, max, assertPercent, checkPercent) {
+      var t2,
+        t1 = this.keywords.remove$1(0, $name),
+        number = t1 == null ? null : t1.assertNumber$1($name);
+      if (number == null)
+        return null;
+      t1 = this.scale;
+      t2 = !t1;
+      if (t2 && checkPercent)
+        K._checkPercent(number, $name);
+      if (!t2 || assertPercent)
+        number.assertUnit$2("%", $name);
+      if (t1)
+        max = 100;
+      return number.valueInRange$3(this.change ? 0 : -max, max, $name);
+    },
+    call$2: function($name, max) {
+      return this.call$4$assertPercent$checkPercent($name, max, false, false);
+    },
+    call$3$checkPercent: function($name, max, checkPercent) {
+      return this.call$4$assertPercent$checkPercent($name, max, false, checkPercent);
+    },
+    call$3$assertPercent: function($name, max, assertPercent) {
+      return this.call$4$assertPercent$checkPercent($name, max, assertPercent, false);
+    },
+    $signature: 141
+  };
+  K._updateComponents_closure.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  K._updateComponents_updateValue.prototype = {
+    call$3: function(current, param, max) {
+      var t1;
+      if (param == null)
+        return current;
+      if (this.change)
+        return param;
+      if (this.adjust)
+        return C.JSNumber_methods.clamp$2(current + param, 0, max);
+      t1 = param > 0 ? max - current : current;
+      return current + t1 * (param / 100);
+    },
+    $signature: 142
+  };
+  K._updateComponents_updateRgb.prototype = {
+    call$2: function(current, param) {
+      return T.fuzzyRound(this.updateValue.call$3(current, param, 255));
+    },
+    $signature: 143
+  };
+  K._functionString_closure.prototype = {
+    call$1: function(argument) {
+      argument.toString;
+      return N.serializeValue0(argument, false, true);
+    },
+    $signature: 292
+  };
+  K._removedColorFunction_closure.prototype = {
+    call$1: function($arguments) {
+      var t1 = this.name,
+        t2 = J.getInterceptor$asx($arguments),
+        t3 = "The function " + t1 + string$.x28__isn + H.S(t2.$index($arguments, 0)) + ", $" + this.argument + ": ";
+      throw H.wrapException(E.SassScriptException$(t3 + (this.negative ? "-" : "") + H.S(t2.$index($arguments, 1)) + string$.x29x0a_Mor + t1));
+    },
+    $signature: 103
+  };
+  K._removeUnits_closure.prototype = {
+    call$1: function(unit) {
+      return " * 1" + H.S(unit);
+    },
+    $signature: 4
+  };
+  K._removeUnits_closure0.prototype = {
+    call$1: function(unit) {
+      return " / 1" + H.S(unit);
+    },
+    $signature: 4
+  };
+  K._parseChannels_closure.prototype = {
+    call$1: function(value) {
+      return value.get$isVar();
+    },
+    $signature: 53
+  };
+  D.closure43.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).get$asList().length;
+      return new N.UnitlessSassNumber(t1, null);
+    },
+    $signature: 9
+  };
+  D.closure42.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        list = t1.$index($arguments, 0),
+        index = t1.$index($arguments, 1);
+      return list.get$asList()[list.sassIndexToListIndex$2(index, "n")];
+    },
+    $signature: 5
+  };
+  D.closure41.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        list = t1.$index($arguments, 0),
+        index = t1.$index($arguments, 1),
+        value = t1.$index($arguments, 2),
+        t2 = list.get$asList(),
+        newList = H.setRuntimeTypeInfo(t2.slice(0), H._arrayInstanceType(t2));
+      newList[list.sassIndexToListIndex$2(index, "n")] = value;
+      return t1.$index($arguments, 0).changeListContents$1(newList);
+    },
+    $signature: 28
+  };
+  D.closure40.prototype = {
+    call$1: function($arguments) {
+      var separator, bracketed, t2, t3, _i,
+        t1 = J.getInterceptor$asx($arguments),
+        list1 = t1.$index($arguments, 0),
+        list2 = t1.$index($arguments, 1),
+        separatorParam = t1.$index($arguments, 2).assertString$1("separator"),
+        bracketedParam = t1.$index($arguments, 3);
+      t1 = separatorParam.text;
+      if (t1 === "auto")
+        if (list1.get$separator() !== C.ListSeparator_undecided)
+          separator = list1.get$separator();
+        else
+          separator = list2.get$separator() !== C.ListSeparator_undecided ? list2.get$separator() : C.ListSeparator_space;
+      else if (t1 === "space")
+        separator = C.ListSeparator_space;
+      else {
+        if (t1 !== "comma")
+          throw H.wrapException(E.SassScriptException$(string$.x24separ));
+        separator = C.ListSeparator_comma;
+      }
+      bracketed = bracketedParam instanceof D.SassString && bracketedParam.text === "auto" ? list1.get$hasBrackets() : bracketedParam.get$isTruthy();
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+      for (t2 = list1.get$asList(), t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        t1.push(t2[_i]);
+      for (t2 = list2.get$asList(), t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        t1.push(t2[_i]);
+      return D.SassList$(t1, separator, bracketed);
+    },
+    $signature: 28
+  };
+  D.closure39.prototype = {
+    call$1: function($arguments) {
+      var separator, t2, t3, _i,
+        t1 = J.getInterceptor$asx($arguments),
+        list = t1.$index($arguments, 0),
+        value = t1.$index($arguments, 1);
+      t1 = t1.$index($arguments, 2).assertString$1("separator").text;
+      if (t1 === "auto")
+        separator = list.get$separator() === C.ListSeparator_undecided ? C.ListSeparator_space : list.get$separator();
+      else if (t1 === "space")
+        separator = C.ListSeparator_space;
+      else {
+        if (t1 !== "comma")
+          throw H.wrapException(E.SassScriptException$(string$.x24separ));
+        separator = C.ListSeparator_comma;
+      }
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+      for (t2 = list.get$asList(), t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        t1.push(t2[_i]);
+      t1.push(value);
+      return list.changeListContents$2$separator(t1, separator);
+    },
+    $signature: 28
+  };
+  D.closure38.prototype = {
+    call$1: function($arguments) {
+      var results, result, _box_0 = {},
+        t1 = J.$index$asx($arguments, 0).get$asList(),
+        t2 = H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,List<Value*>*>"),
+        lists = P.List_List$from(new H.MappedListIterable(t1, new D._closure5(), t2), true, t2._eval$1("ListIterable.E"));
+      if (lists.length === 0)
+        return C.SassList_lmy;
+      _box_0.i = 0;
+      results = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SassList);
+      for (t1 = H._arrayInstanceType(lists)._eval$1("MappedListIterable<1,Value*>"), t2 = type$.legacy_Value; C.JSArray_methods.every$1(lists, new D._closure6(_box_0));) {
+        result = P.List_List$from(new H.MappedListIterable(lists, new D._closure7(_box_0), t1), false, t2);
+        result.fixed$length = Array;
+        result.immutable$list = Array;
+        results.push(new D.SassList(result, C.ListSeparator_space, false));
+        ++_box_0.i;
+      }
+      return D.SassList$(results, C.ListSeparator_comma, false);
+    },
+    $signature: 28
+  };
+  D._closure5.prototype = {
+    call$1: function(list) {
+      return list.get$asList();
+    },
+    $signature: 291
+  };
+  D._closure6.prototype = {
+    call$1: function(list) {
+      return this._box_0.i !== J.get$length$asx(list);
+    },
+    $signature: 290
+  };
+  D._closure7.prototype = {
+    call$1: function(list) {
+      return J.$index$asx(list, this._box_0.i);
+    },
+    $signature: 5
+  };
+  D.closure37.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        index = C.JSArray_methods.indexOf$1(t1.$index($arguments, 0).get$asList(), t1.$index($arguments, 1));
+      if (index === -1)
+        t1 = C.C_SassNull0;
+      else
+        t1 = new N.UnitlessSassNumber(index + 1, null);
+      return t1;
+    },
+    $signature: 5
+  };
+  D.closure35.prototype = {
+    call$1: function($arguments) {
+      return J.$index$asx($arguments, 0).get$separator() === C.ListSeparator_comma ? new D.SassString("comma", false) : new D.SassString("space", false);
+    },
+    $signature: 16
+  };
+  D.closure36.prototype = {
+    call$1: function($arguments) {
+      return J.$index$asx($arguments, 0).get$hasBrackets() ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  A.closure34.prototype = {
+    call$1: function($arguments) {
+      var t3, _i, cur, value,
+        t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+      t2.push(t1.$index($arguments, 1));
+      for (t1 = t1.$index($arguments, 2).get$asList(), t3 = t1.length, _i = 0; _i < t1.length; t1.length === t3 || (0, H.throwConcurrentModificationError)(t1), ++_i)
+        t2.push(t1[_i]);
+      for (t1 = H.SubListIterable$(t2, 0, t2.length - 1, type$.legacy_Value), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0(); map = value) {
+        cur = t1.__internal$_current;
+        value = map.contents.$index(0, cur);
+        if (!(value instanceof A.SassMap))
+          return C.C_SassNull0;
+      }
+      t1 = map.contents.$index(0, C.JSArray_methods.get$last(t2));
+      return t1 == null ? C.C_SassNull0 : t1;
+    },
+    $signature: 5
+  };
+  A.closure97.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return A._modify(t1.$index($arguments, 0).assertMap$1("map"), H.setRuntimeTypeInfo([t1.$index($arguments, 1)], type$.JSArray_legacy_Value), new A._closure12($arguments));
+    },
+    $signature: 5
+  };
+  A._closure12.prototype = {
+    call$1: function(_) {
+      return J.$index$asx(this.$arguments, 2);
+    },
+    $signature: 64
+  };
+  A.closure98.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        args = t1.$index($arguments, 1).get$asList();
+      t1 = args.length;
+      if (t1 === 0)
+        throw H.wrapException(E.SassScriptException$("Expected $args to contain a key."));
+      else if (t1 === 1)
+        throw H.wrapException(E.SassScriptException$("Expected $args to contain a value."));
+      return A._modify(map, C.JSArray_methods.sublist$2(args, 0, t1 - 1), new A._closure11(args));
+    },
+    $signature: 5
+  };
+  A._closure11.prototype = {
+    call$1: function(_) {
+      return C.JSArray_methods.get$last(this.args);
+    },
+    $signature: 64
+  };
+  A.closure32.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.getInterceptor$asx($arguments),
+        map1 = t1.$index($arguments, 0).assertMap$1("map1"),
+        map2 = t1.$index($arguments, 1).assertMap$1("map2");
+      t1 = type$.legacy_Value;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = map1.contents, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, t4.key, t4.value);
+      }
+      for (t3 = map2.contents, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, t4.key, t4.value);
+      }
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 36
+  };
+  A.closure33.prototype = {
+    call$1: function($arguments) {
+      var map2,
+        t1 = J.getInterceptor$asx($arguments),
+        map1 = t1.$index($arguments, 0).assertMap$1("map1"),
+        args = t1.$index($arguments, 1).get$asList();
+      t1 = args.length;
+      if (t1 === 0)
+        throw H.wrapException(E.SassScriptException$("Expected $args to contain a key."));
+      else if (t1 === 1)
+        throw H.wrapException(E.SassScriptException$("Expected $args to contain a map."));
+      map2 = C.JSArray_methods.get$last(args).assertMap$1("map2");
+      return A._modify(map1, H.SubListIterable$(args, 0, args.length - 1, H._arrayInstanceType(args)._precomputed1), new A._closure4(map2));
+    },
+    $signature: 5
+  };
+  A._closure4.prototype = {
+    call$1: function(oldValue) {
+      var t1, t2, t3, t4,
+        nestedMap = oldValue == null ? null : oldValue.tryMap$0();
+      if (nestedMap == null)
+        return this.map2;
+      t1 = type$.legacy_Value;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = nestedMap.contents, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, t4.key, t4.value);
+      }
+      for (t3 = this.map2.contents, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, t4.key, t4.value);
+      }
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 288
+  };
+  A.closure96.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return A._deepMergeImpl(t1.$index($arguments, 0).assertMap$1("map1"), t1.$index($arguments, 1).assertMap$1("map2"));
+    },
+    $signature: 36
+  };
+  A.closure95.prototype = {
+    call$1: function($arguments) {
+      var t3, _i,
+        t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+      t2.push(t1.$index($arguments, 1));
+      for (t1 = t1.$index($arguments, 2).get$asList(), t3 = t1.length, _i = 0; _i < t1.length; t1.length === t3 || (0, H.throwConcurrentModificationError)(t1), ++_i)
+        t2.push(t1[_i]);
+      return A._modify(map, H.SubListIterable$(t2, 0, t2.length - 1, type$.legacy_Value), new A._closure10(t2));
+    },
+    $signature: 5
+  };
+  A._closure10.prototype = {
+    call$1: function(value) {
+      var t2,
+        nestedMap = value == null ? null : value.tryMap$0(),
+        t1 = nestedMap == null ? null : nestedMap.contents;
+      t1 = t1 == null ? null : t1.containsKey$1(C.JSArray_methods.get$last(this.keys));
+      if (t1 === true) {
+        t1 = type$.legacy_Value;
+        t2 = P.LinkedHashMap_LinkedHashMap$of(nestedMap.contents, t1, t1);
+        t2.remove$1(0, C.JSArray_methods.get$last(this.keys));
+        return new A.SassMap(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+      }
+      return value;
+    },
+    $signature: 64
+  };
+  A.closure30.prototype = {
+    call$1: function($arguments) {
+      return J.$index$asx($arguments, 0).assertMap$1("map");
+    },
+    $signature: 36
+  };
+  A.closure31.prototype = {
+    call$1: function($arguments) {
+      var t3, _i, mutableMap,
+        t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+      t2.push(t1.$index($arguments, 1));
+      for (t1 = t1.$index($arguments, 2).get$asList(), t3 = t1.length, _i = 0; _i < t1.length; t1.length === t3 || (0, H.throwConcurrentModificationError)(t1), ++_i)
+        t2.push(t1[_i]);
+      t1 = type$.legacy_Value;
+      mutableMap = P.LinkedHashMap_LinkedHashMap$of(map.contents, t1, t1);
+      for (t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        mutableMap.remove$1(0, t2[_i]);
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(mutableMap, t1, t1));
+    },
+    $signature: 36
+  };
+  A.closure29.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).assertMap$1("map").contents;
+      return D.SassList$(t1.get$keys(t1), C.ListSeparator_comma, false);
+    },
+    $signature: 28
+  };
+  A.closure28.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).assertMap$1("map").contents;
+      return D.SassList$(t1.get$values(t1), C.ListSeparator_comma, false);
+    },
+    $signature: 28
+  };
+  A.closure27.prototype = {
+    call$1: function($arguments) {
+      var t3, _i, cur, value,
+        t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+      t2.push(t1.$index($arguments, 1));
+      for (t1 = t1.$index($arguments, 2).get$asList(), t3 = t1.length, _i = 0; _i < t1.length; t1.length === t3 || (0, H.throwConcurrentModificationError)(t1), ++_i)
+        t2.push(t1[_i]);
+      for (t1 = H.SubListIterable$(t2, 0, t2.length - 1, type$.legacy_Value), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0(); map = value) {
+        cur = t1.__internal$_current;
+        value = map.contents.$index(0, cur);
+        if (!(value instanceof A.SassMap))
+          return C.SassBoolean_false0;
+      }
+      return map.contents.containsKey$1(C.JSArray_methods.get$last(t2)) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  A._modify__modifyNestedMap.prototype = {
+    call$2: function(map, newValue) {
+      var nestedMap, _this = this,
+        t1 = type$.legacy_Value,
+        mutableMap = P.LinkedHashMap_LinkedHashMap$of(map.contents, t1, t1),
+        t2 = _this.keyIterator,
+        key = t2.get$current(t2);
+      if (!t2.moveNext$0()) {
+        mutableMap.$indexSet(0, key, newValue == null ? _this.modify.call$1(mutableMap.$index(0, key)) : newValue);
+        return new A.SassMap(H.ConstantMap_ConstantMap$from(mutableMap, t1, t1));
+      }
+      t2 = mutableMap.$index(0, key);
+      nestedMap = t2 == null ? null : t2.tryMap$0();
+      t2 = nestedMap == null;
+      if (t2) {
+        newValue = _this.modify.call$1(null);
+        if (newValue == null)
+          return new A.SassMap(H.ConstantMap_ConstantMap$from(mutableMap, t1, t1));
+      }
+      mutableMap.$indexSet(0, key, _this.call$2(t2 ? C.SassMap_Map_empty : nestedMap, newValue));
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(mutableMap, t1, t1));
+    },
+    call$1: function(map) {
+      return this.call$2(map, null);
+    },
+    $signature: 286
+  };
+  A._deepMergeImpl__ensureMutable.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this._box_0;
+      if (t1.mutable)
+        return;
+      t1.mutable = true;
+      t2 = type$.legacy_Value;
+      t1.result = P.LinkedHashMap_LinkedHashMap$of(t1.result, t2, t2);
+    },
+    $signature: 1
+  };
+  A._deepMergeImpl_closure.prototype = {
+    call$2: function(key, value) {
+      var resultMap, valueMap, merged,
+        t1 = this._box_0,
+        resultValue = t1.result.$index(0, key);
+      if (resultValue == null) {
+        this._ensureMutable.call$0();
+        t1.result.$indexSet(0, key, value);
+      } else {
+        resultMap = resultValue.tryMap$0();
+        valueMap = value.tryMap$0();
+        if (resultMap != null && valueMap != null) {
+          merged = A._deepMergeImpl(valueMap, resultMap);
+          if (merged === resultMap)
+            return;
+          this._ensureMutable.call$0();
+          t1.result.$indexSet(0, key, merged);
+        }
+      }
+    },
+    $signature: 46
+  };
+  K.closure25.prototype = {
+    call$1: function(value) {
+      return J.ceil$0$n(value);
+    },
+    $signature: 39
+  };
+  K.closure90.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        min = t1.$index($arguments, 0).assertNumber$1("min"),
+        number = t1.$index($arguments, 1).assertNumber$1("number"),
+        max = t1.$index($arguments, 2).assertNumber$1("max");
+      number.convertValueToMatch$3(min, "number", "min");
+      max.convertValueToMatch$3(min, "max", "min");
+      if (min.greaterThanOrEquals$1(max).value)
+        return min;
+      if (min.greaterThanOrEquals$1(number).value)
+        return min;
+      if (number.greaterThanOrEquals$1(max).value)
+        return max;
+      return number;
+    },
+    $signature: 9
+  };
+  K.closure24.prototype = {
+    call$1: function(value) {
+      return J.floor$0$n(value);
+    },
+    $signature: 39
+  };
+  K.closure23.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, max, _i, number;
+      for (t1 = J.$index$asx($arguments, 0).get$asList(), t2 = t1.length, max = null, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        number = t1[_i].assertNumber$0();
+        if (max == null || max.lessThan$1(number).value)
+          max = number;
+      }
+      if (max != null)
+        return max;
+      throw H.wrapException(E.SassScriptException$("At least one argument must be passed."));
+    },
+    $signature: 9
+  };
+  K.closure22.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, min, _i, number;
+      for (t1 = J.$index$asx($arguments, 0).get$asList(), t2 = t1.length, min = null, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        number = t1[_i].assertNumber$0();
+        if (min == null || min.greaterThan$1(number).value)
+          min = number;
+      }
+      if (min != null)
+        return min;
+      throw H.wrapException(E.SassScriptException$("At least one argument must be passed."));
+    },
+    $signature: 9
+  };
+  K.closure26.prototype = {
+    call$1: function(value) {
+      return Math.abs(value);
+    },
+    $signature: 155
+  };
+  K.closure88.prototype = {
+    call$1: function($arguments) {
+      var subtotal, i, i0, value,
+        t1 = J.$index$asx($arguments, 0).get$asList(),
+        t2 = H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,SassNumber*>"),
+        numbers = P.List_List$from(new H.MappedListIterable(t1, new K._closure9(), t2), true, t2._eval$1("ListIterable.E"));
+      if (numbers.length === 0)
+        throw H.wrapException(E.SassScriptException$("At least one argument must be passed."));
+      for (subtotal = 0, i = 0; i < numbers.length; i = i0) {
+        i0 = i + 1;
+        value = numbers[i].convertValueToMatch$3(numbers[0], "numbers[" + i0 + "]", "numbers[1]");
+        H.checkNum(value);
+        subtotal += Math.pow(value, 2);
+      }
+      t1 = Math.sqrt(subtotal);
+      t2 = numbers[0].get$numeratorUnits();
+      return T.SassNumber_SassNumber$withUnits(t1, numbers[0].get$denominatorUnits(), t2);
+    },
+    $signature: 9
+  };
+  K._closure9.prototype = {
+    call$1: function(argument) {
+      return argument.assertNumber$0();
+    },
+    $signature: 284
+  };
+  K.closure87.prototype = {
+    call$1: function($arguments) {
+      var numberValue, base, baseValue, t2,
+        _s18_ = " to have no units.",
+        t1 = J.getInterceptor$asx($arguments),
+        number = t1.$index($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$("$number: Expected " + number.toString$0(0) + _s18_));
+      numberValue = K._fuzzyRoundIfZero(number.value);
+      if (J.$eq$(t1.$index($arguments, 1), C.C_SassNull0)) {
+        t1 = Math.log(H.checkNum(numberValue));
+        return new N.UnitlessSassNumber(t1, null);
+      }
+      base = t1.$index($arguments, 1).assertNumber$1("base");
+      if (base.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$("$base: Expected " + base.toString$0(0) + _s18_));
+      t1 = base.value;
+      baseValue = Math.abs(t1 - 1) < $.$get$epsilon() ? T.fuzzyRound(t1) : K._fuzzyRoundIfZero(t1);
+      t1 = Math.log(H.checkNum(numberValue));
+      t2 = Math.log(H.checkNum(baseValue));
+      return new N.UnitlessSassNumber(t1 / t2, null);
+    },
+    $signature: 9
+  };
+  K.closure86.prototype = {
+    call$1: function($arguments) {
+      var baseValue, exponentValue, t2, t3,
+        _s18_ = " to have no units.",
+        _null = null,
+        t1 = J.getInterceptor$asx($arguments),
+        base = t1.$index($arguments, 0).assertNumber$1("base"),
+        exponent = t1.$index($arguments, 1).assertNumber$1("exponent");
+      if (base.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$("$base: Expected " + base.toString$0(0) + _s18_));
+      else if (exponent.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$("$exponent: Expected " + exponent.toString$0(0) + _s18_));
+      baseValue = K._fuzzyRoundIfZero(base.value);
+      exponentValue = K._fuzzyRoundIfZero(exponent.value);
+      t1 = $.$get$epsilon();
+      if (Math.abs(Math.abs(baseValue) - 1) < t1) {
+        exponentValue.toString;
+        t2 = exponentValue == 1 / 0 || exponentValue == -1 / 0;
+      } else
+        t2 = false;
+      if (t2)
+        return new N.UnitlessSassNumber(0 / 0, _null);
+      else {
+        t2 = Math.abs(baseValue - 0);
+        if (t2 < t1) {
+          exponentValue.toString;
+          if (isFinite(exponentValue))
+            if (T.fuzzyIsInt(exponentValue))
+              t1 = C.JSInt_methods.$mod(T.fuzzyIsInt(exponentValue) ? C.JSNumber_methods.round$0(exponentValue) : _null, 2) === 1;
+            else
+              t1 = false;
+          else
+            t1 = false;
+          if (t1)
+            exponentValue = T.fuzzyRound(exponentValue);
+        } else {
+          if (isFinite(baseValue))
+            if (baseValue < 0 && !(t2 < t1)) {
+              exponentValue.toString;
+              t3 = isFinite(exponentValue) && T.fuzzyIsInt(exponentValue);
+            } else
+              t3 = false;
+          else
+            t3 = false;
+          if (t3)
+            exponentValue = T.fuzzyRound(exponentValue);
+          else {
+            if (baseValue == 1 / 0 || baseValue == -1 / 0)
+              if (baseValue < 0 && !(t2 < t1)) {
+                exponentValue.toString;
+                if (isFinite(exponentValue))
+                  if (T.fuzzyIsInt(exponentValue))
+                    t1 = C.JSInt_methods.$mod(T.fuzzyIsInt(exponentValue) ? C.JSNumber_methods.round$0(exponentValue) : _null, 2) === 1;
+                  else
+                    t1 = false;
+                else
+                  t1 = false;
+              } else
+                t1 = false;
+            else
+              t1 = false;
+            if (t1)
+              exponentValue = T.fuzzyRound(exponentValue);
+          }
+        }
+      }
+      H.checkNum(exponentValue);
+      t1 = Math.pow(baseValue, exponentValue);
+      return new N.UnitlessSassNumber(t1, _null);
+    },
+    $signature: 9
+  };
+  K.closure84.prototype = {
+    call$1: function($arguments) {
+      var t1,
+        number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$("$number: Expected " + number.toString$0(0) + " to have no units."));
+      t1 = Math.sqrt(H.checkNum(K._fuzzyRoundIfZero(number.value)));
+      return new N.UnitlessSassNumber(t1, null);
+    },
+    $signature: 9
+  };
+  K.closure94.prototype = {
+    call$1: function($arguments) {
+      var numberValue,
+        number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$("$number: Expected " + number.toString$0(0) + " to have no units."));
+      numberValue = number.value;
+      if (Math.abs(Math.abs(numberValue) - 1) < $.$get$epsilon())
+        numberValue = T.fuzzyRound(numberValue);
+      return T.SassNumber_SassNumber$withUnits(Math.acos(numberValue) * 180 / 3.141592653589793, null, H.setRuntimeTypeInfo(["deg"], type$.JSArray_legacy_String));
+    },
+    $signature: 9
+  };
+  K.closure93.prototype = {
+    call$1: function($arguments) {
+      var t1,
+        number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$("$number: Expected " + number.toString$0(0) + " to have no units."));
+      t1 = number.value;
+      return T.SassNumber_SassNumber$withUnits(Math.asin(H.checkNum(Math.abs(Math.abs(t1) - 1) < $.$get$epsilon() ? T.fuzzyRound(t1) : K._fuzzyRoundIfZero(t1))) * 180 / 3.141592653589793, null, H.setRuntimeTypeInfo(["deg"], type$.JSArray_legacy_String));
+    },
+    $signature: 9
+  };
+  K.closure92.prototype = {
+    call$1: function($arguments) {
+      var number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$("$number: Expected " + number.toString$0(0) + " to have no units."));
+      return T.SassNumber_SassNumber$withUnits(Math.atan(H.checkNum(K._fuzzyRoundIfZero(number.value))) * 180 / 3.141592653589793, null, H.setRuntimeTypeInfo(["deg"], type$.JSArray_legacy_String));
+    },
+    $signature: 9
+  };
+  K.closure91.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        y = t1.$index($arguments, 0).assertNumber$1("y"),
+        xValue = K._fuzzyRoundIfZero(t1.$index($arguments, 1).assertNumber$1("x").convertValueToMatch$3(y, "x", "y"));
+      return T.SassNumber_SassNumber$withUnits(Math.atan2(H.checkNum(K._fuzzyRoundIfZero(y.value)), H.checkNum(xValue)) * 180 / 3.141592653589793, null, H.setRuntimeTypeInfo(["deg"], type$.JSArray_legacy_String));
+    },
+    $signature: 9
+  };
+  K.closure89.prototype = {
+    call$1: function($arguments) {
+      var t1 = Math.cos(H.checkNum(J.$index$asx($arguments, 0).assertNumber$1("number").coerceValueToUnit$2("rad", "number")));
+      return new N.UnitlessSassNumber(t1, null);
+    },
+    $signature: 9
+  };
+  K.closure85.prototype = {
+    call$1: function($arguments) {
+      var t1 = Math.sin(H.checkNum(K._fuzzyRoundIfZero(J.$index$asx($arguments, 0).assertNumber$1("number").coerceValueToUnit$2("rad", "number"))));
+      return new N.UnitlessSassNumber(t1, null);
+    },
+    $signature: 9
+  };
+  K.closure83.prototype = {
+    call$1: function($arguments) {
+      var value = J.$index$asx($arguments, 0).assertNumber$1("number").coerceValueToUnit$2("rad", "number"),
+        t1 = C.JSNumber_methods.$mod(value - 1.5707963267948966, 6.283185307179586),
+        t2 = $.$get$epsilon();
+      if (Math.abs(t1 - 0) < t2)
+        return new N.UnitlessSassNumber(1 / 0, null);
+      else if (Math.abs(C.JSNumber_methods.$mod(value + 1.5707963267948966, 6.283185307179586) - 0) < t2)
+        return new N.UnitlessSassNumber(-1 / 0, null);
+      else {
+        t1 = Math.tan(H.checkNum(K._fuzzyRoundIfZero(value)));
+        return new N.UnitlessSassNumber(t1, null);
+      }
+    },
+    $signature: 9
+  };
+  K.closure18.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return t1.$index($arguments, 0).assertNumber$1("number1").isComparableTo$1(t1.$index($arguments, 1).assertNumber$1("number2")) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  K.closure17.prototype = {
+    call$1: function($arguments) {
+      return !J.$index$asx($arguments, 0).assertNumber$1("number").get$hasUnits() ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  K.closure19.prototype = {
+    call$1: function($arguments) {
+      return new D.SassString(J.$index$asx($arguments, 0).assertNumber$1("number").get$unitString(), true);
+    },
+    $signature: 16
+  };
+  K.closure21.prototype = {
+    call$1: function($arguments) {
+      var number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      number.assertNoUnits$1("number");
+      return new L.SingleUnitSassNumber("%", number.value * 100, null);
+    },
+    $signature: 9
+  };
+  K.closure20.prototype = {
+    call$1: function($arguments) {
+      var limit,
+        t1 = J.getInterceptor$asx($arguments);
+      if (J.$eq$(t1.$index($arguments, 0), C.C_SassNull0)) {
+        t1 = $.$get$_random0().nextDouble$0();
+        return new N.UnitlessSassNumber(t1, null);
+      }
+      limit = t1.$index($arguments, 0).assertNumber$1("limit").assertInt$1("limit");
+      if (limit < 1)
+        throw H.wrapException(E.SassScriptException$("$limit: Must be greater than 0, was " + limit + "."));
+      t1 = $.$get$_random0().nextInt$1(limit);
+      return new N.UnitlessSassNumber(t1 + 1, null);
+    },
+    $signature: 9
+  };
+  K._numberFunction_closure.prototype = {
+    call$1: function($arguments) {
+      var number = J.$index$asx($arguments, 0).assertNumber$1("number"),
+        t1 = this.transform.call$1(number.value),
+        t2 = number.get$numeratorUnits();
+      return T.SassNumber_SassNumber$withUnits(t1, number.get$denominatorUnits(), t2);
+    },
+    $signature: 9
+  };
+  Q.closure108.prototype = {
+    call$1: function($arguments) {
+      return $._features.contains$1(0, J.$index$asx($arguments, 0).assertString$1("feature").text) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  Q.closure109.prototype = {
+    call$1: function($arguments) {
+      return new D.SassString(J.toString$0$(J.get$first$ax($arguments)), false);
+    },
+    $signature: 16
+  };
+  Q.closure110.prototype = {
+    call$1: function($arguments) {
+      var value = J.$index$asx($arguments, 0);
+      if (value instanceof D.SassArgumentList)
+        return new D.SassString("arglist", false);
+      if (value instanceof Z.SassBoolean)
+        return new D.SassString("bool", false);
+      if (value instanceof K.SassColor)
+        return new D.SassString("color", false);
+      if (value instanceof D.SassList)
+        return new D.SassString("list", false);
+      if (value instanceof A.SassMap)
+        return new D.SassString("map", false);
+      if (value instanceof O.SassNull)
+        return new D.SassString("null", false);
+      if (value instanceof T.SassNumber)
+        return new D.SassString("number", false);
+      if (value instanceof F.SassFunction)
+        return new D.SassString("function", false);
+      return new D.SassString("string", false);
+    },
+    $signature: 16
+  };
+  Q.closure111.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, t3, t4,
+        argumentList = J.$index$asx($arguments, 0);
+      if (argumentList instanceof D.SassArgumentList) {
+        t1 = type$.legacy_Value;
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+        for (argumentList._wereKeywordsAccessed = true, t3 = argumentList._keywords, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+          t4 = t3.get$current(t3);
+          t2.$indexSet(0, new D.SassString(t4.key, false), t4.value);
+        }
+        return new A.SassMap(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+      } else
+        throw H.wrapException("$args: " + H.S(argumentList) + " is not an argument list.");
+    },
+    $signature: 36
+  };
+  T.closure13.prototype = {
+    call$1: function($arguments) {
+      var t1 = {},
+        selectors = J.$index$asx($arguments, 0).get$asList();
+      if (selectors.length === 0)
+        throw H.wrapException(E.SassScriptException$(string$.x24selec));
+      t1.first = true;
+      return new H.MappedListIterable(selectors, new T._closure1(t1), H._arrayInstanceType(selectors)._eval$1("MappedListIterable<1,SelectorList*>")).reduce$1(0, new T._closure2()).get$asSassList();
+    },
+    $signature: 28
+  };
+  T._closure1.prototype = {
+    call$1: function(selector) {
+      var t1 = this._box_0,
+        result = selector.assertSelector$1$allowParent(!t1.first);
+      t1.first = false;
+      return result;
+    },
+    $signature: 157
+  };
+  T._closure2.prototype = {
+    call$2: function($parent, child) {
+      return child.resolveParentSelectors$1($parent);
+    },
+    $signature: 158
+  };
+  T.closure12.prototype = {
+    call$1: function($arguments) {
+      var selectors = J.$index$asx($arguments, 0).get$asList();
+      if (selectors.length === 0)
+        throw H.wrapException(E.SassScriptException$(string$.x24selec));
+      return new H.MappedListIterable(selectors, new T._closure(), H._arrayInstanceType(selectors)._eval$1("MappedListIterable<1,SelectorList*>")).reduce$1(0, new T._closure0()).get$asSassList();
+    },
+    $signature: 28
+  };
+  T._closure.prototype = {
+    call$1: function(selector) {
+      return selector.assertSelector$0();
+    },
+    $signature: 157
+  };
+  T._closure0.prototype = {
+    call$2: function($parent, child) {
+      var t1 = child.components;
+      return D.SelectorList$(new H.MappedListIterable(t1, new T.__closure($parent), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,ComplexSelector*>"))).resolveParentSelectors$1($parent);
+    },
+    $signature: 158
+  };
+  T.__closure.prototype = {
+    call$1: function(complex) {
+      var newCompound, t2, cur,
+        t1 = complex.components,
+        compound = C.JSArray_methods.get$first(t1);
+      if (compound instanceof X.CompoundSelector) {
+        newCompound = T._prependParent(compound);
+        if (newCompound == null)
+          throw H.wrapException(E.SassScriptException$("Can't append " + complex.toString$0(0) + " to " + H.S(this.parent) + "."));
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent);
+        t2.push(newCompound);
+        for (t1 = H.SubListIterable$(t1, 1, null, H._arrayInstanceType(t1)._precomputed1), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          t2.push(cur);
+        }
+        return S.ComplexSelector$(t2, false);
+      } else
+        throw H.wrapException(E.SassScriptException$("Can't append " + complex.toString$0(0) + " to " + H.S(this.parent) + "."));
+    },
+    $signature: 83
+  };
+  T.closure11.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        selector = t1.$index($arguments, 0).assertSelector$1$name("selector"),
+        target = t1.$index($arguments, 1).assertSelector$1$name("extendee");
+      return F.Extender__extendOrReplace(selector, t1.$index($arguments, 2).assertSelector$1$name("extender"), target, C.ExtendMode_allTargets).get$asSassList();
+    },
+    $signature: 28
+  };
+  T.closure10.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        selector = t1.$index($arguments, 0).assertSelector$1$name("selector"),
+        target = t1.$index($arguments, 1).assertSelector$1$name("original");
+      return F.Extender__extendOrReplace(selector, t1.$index($arguments, 2).assertSelector$1$name("replacement"), target, C.ExtendMode_replace).get$asSassList();
+    },
+    $signature: 28
+  };
+  T.closure9.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        result = t1.$index($arguments, 0).assertSelector$1$name("selector1").unify$1(t1.$index($arguments, 1).assertSelector$1$name("selector2"));
+      return result == null ? C.C_SassNull0 : result.get$asSassList();
+    },
+    $signature: 5
+  };
+  T.closure16.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        selector1 = t1.$index($arguments, 0).assertSelector$1$name("super"),
+        selector2 = t1.$index($arguments, 1).assertSelector$1$name("sub");
+      return Y.listIsSuperselector(selector1.components, selector2.components) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  T.closure15.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).assertCompoundSelector$1$name("selector").components;
+      return D.SassList$(new H.MappedListIterable(t1, new T._closure3(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Value*>")), C.ListSeparator_comma, false);
+    },
+    $signature: 28
+  };
+  T._closure3.prototype = {
+    call$1: function(simple) {
+      return new D.SassString(J.toString$0$(simple), false);
+    },
+    $signature: 239
+  };
+  T.closure14.prototype = {
+    call$1: function($arguments) {
+      return J.$index$asx($arguments, 0).assertSelector$1$name("selector").get$asSassList();
+    },
+    $signature: 28
+  };
+  D.closure8.prototype = {
+    call$1: function($arguments) {
+      var string = J.$index$asx($arguments, 0).assertString$1("string");
+      if (!string.hasQuotes)
+        return string;
+      return new D.SassString(string.text, false);
+    },
+    $signature: 16
+  };
+  D.closure7.prototype = {
+    call$1: function($arguments) {
+      var string = J.$index$asx($arguments, 0).assertString$1("string");
+      if (string.hasQuotes)
+        return string;
+      return new D.SassString(string.text, true);
+    },
+    $signature: 16
+  };
+  D.closure3.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).assertString$1("string").get$sassLength();
+      return new N.UnitlessSassNumber(t1, null);
+    },
+    $signature: 9
+  };
+  D.closure2.prototype = {
+    call$1: function($arguments) {
+      var indexInt, codeUnitIndex, _s5_ = "index",
+        t1 = J.getInterceptor$asx($arguments),
+        string = t1.$index($arguments, 0).assertString$1("string"),
+        insert = t1.$index($arguments, 1).assertString$1("insert"),
+        index = t1.$index($arguments, 2).assertNumber$1(_s5_);
+      index.assertNoUnits$1(_s5_);
+      indexInt = index.assertInt$1(_s5_);
+      if (indexInt < 0)
+        indexInt = string.get$sassLength() + indexInt + 2;
+      t1 = string.text;
+      codeUnitIndex = B.codepointIndexToCodeUnitIndex(t1, D._codepointForIndex(indexInt, string.get$sassLength(), false));
+      return new D.SassString(J.replaceRange$3$asx(t1, codeUnitIndex, codeUnitIndex, insert.text), string.hasQuotes);
+    },
+    $signature: 16
+  };
+  D.closure1.prototype = {
+    call$1: function($arguments) {
+      var codepointIndex,
+        t1 = J.getInterceptor$asx($arguments),
+        t2 = t1.$index($arguments, 0).assertString$1("string").text,
+        codeUnitIndex = J.indexOf$1$asx(t2, t1.$index($arguments, 1).assertString$1("substring").text);
+      if (codeUnitIndex === -1)
+        return C.C_SassNull0;
+      codepointIndex = B.codeUnitIndexToCodepointIndex(t2, codeUnitIndex);
+      return new N.UnitlessSassNumber(codepointIndex + 1, null);
+    },
+    $signature: 5
+  };
+  D.closure0.prototype = {
+    call$1: function($arguments) {
+      var lengthInCodepoints, endInt, startCodepoint, endCodepoint,
+        t1 = J.getInterceptor$asx($arguments),
+        string = t1.$index($arguments, 0).assertString$1("string"),
+        start = t1.$index($arguments, 1).assertNumber$1("start-at"),
+        end = t1.$index($arguments, 2).assertNumber$1("end-at");
+      start.assertNoUnits$1("start");
+      end.assertNoUnits$1("end");
+      lengthInCodepoints = string.get$sassLength();
+      endInt = end.assertInt$0();
+      if (endInt === 0)
+        return string.hasQuotes ? $.$get$_emptyQuoted() : $.$get$_emptyUnquoted();
+      startCodepoint = D._codepointForIndex(start.assertInt$0(), lengthInCodepoints, false);
+      endCodepoint = D._codepointForIndex(endInt, lengthInCodepoints, true);
+      if (endCodepoint === lengthInCodepoints)
+        --endCodepoint;
+      if (endCodepoint < startCodepoint)
+        return string.hasQuotes ? $.$get$_emptyQuoted() : $.$get$_emptyUnquoted();
+      t1 = string.text;
+      return new D.SassString(J.substring$2$s(t1, B.codepointIndexToCodeUnitIndex(t1, startCodepoint), B.codepointIndexToCodeUnitIndex(t1, endCodepoint + 1)), string.hasQuotes);
+    },
+    $signature: 16
+  };
+  D.closure6.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, t3, i, t4, t5,
+        string = J.$index$asx($arguments, 0).assertString$1("string");
+      for (t1 = string.text, t2 = t1.length, t3 = J.getInterceptor$s(t1), i = 0, t4 = ""; i < t2; ++i) {
+        t5 = t3._codeUnitAt$1(t1, i);
+        t4 += H.Primitives_stringFromCharCode(t5 >= 97 && t5 <= 122 ? t5 & 4294967263 : t5);
+      }
+      return new D.SassString(t4.charCodeAt(0) == 0 ? t4 : t4, string.hasQuotes);
+    },
+    $signature: 16
+  };
+  D.closure5.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, t3, i, t4, t5,
+        string = J.$index$asx($arguments, 0).assertString$1("string");
+      for (t1 = string.text, t2 = t1.length, t3 = J.getInterceptor$s(t1), i = 0, t4 = ""; i < t2; ++i) {
+        t5 = t3._codeUnitAt$1(t1, i);
+        t4 += H.Primitives_stringFromCharCode(t5 >= 65 && t5 <= 90 ? t5 | 32 : t5);
+      }
+      return new D.SassString(t4.charCodeAt(0) == 0 ? t4 : t4, string.hasQuotes);
+    },
+    $signature: 16
+  };
+  D.closure4.prototype = {
+    call$1: function($arguments) {
+      var t1 = $.$get$_previousUniqueId() + ($.$get$_random().nextInt$1(36) + 1);
+      $._previousUniqueId = t1;
+      if (t1 > Math.pow(36, 6))
+        $._previousUniqueId = C.JSInt_methods.$mod($.$get$_previousUniqueId(), H._asIntS(Math.pow(36, 6)));
+      return new D.SassString("u" + C.JSString_methods.padLeft$2(J.toRadixString$1$n($.$get$_previousUniqueId(), 36), 6, "0"), false);
+    },
+    $signature: 16
+  };
+  R.ImportCache.prototype = {
+    canonicalize$4$baseImporter$baseUrl$forImport: function(url, baseImporter, baseUrl, forImport) {
+      var resolvedUrl, canonicalUrl;
+      if (baseImporter != null) {
+        resolvedUrl = baseUrl != null ? baseUrl.resolveUri$1(url) : url;
+        canonicalUrl = this._canonicalize$3(baseImporter, resolvedUrl, forImport);
+        if (canonicalUrl != null)
+          return new S.Tuple3(baseImporter, canonicalUrl, resolvedUrl, type$.Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri);
+      }
+      return this._canonicalizeCache.putIfAbsent$2(new S.Tuple2(url, forImport, type$.Tuple2_of_legacy_Uri_and_legacy_bool), new R.ImportCache_canonicalize_closure(this, url, forImport));
+    },
+    canonicalize$3$baseImporter$baseUrl: function(url, baseImporter, baseUrl) {
+      return this.canonicalize$4$baseImporter$baseUrl$forImport(url, baseImporter, baseUrl, false);
+    },
+    _canonicalize$3: function(importer, url, forImport) {
+      var result = forImport ? B.inImportRule(new R.ImportCache__canonicalize_closure(importer, url)) : importer.canonicalize$1(url);
+      if ((result == null ? null : result.get$scheme()) === "")
+        this._logger.warn$2$deprecation(0, "Importer " + H.S(importer) + " canonicalized " + H.S(url) + " to " + H.S(result) + string$.x2e_Rela, true);
+      return result;
+    },
+    import$4$baseImporter$baseUrl$forImport: function(url, baseImporter, baseUrl, forImport) {
+      var t1, stylesheet,
+        tuple = this.canonicalize$4$baseImporter$baseUrl$forImport(url, baseImporter, baseUrl, forImport);
+      if (tuple == null)
+        return null;
+      t1 = tuple.item1;
+      stylesheet = this.importCanonical$3(t1, tuple.item2, tuple.item3);
+      if (stylesheet == null)
+        return null;
+      return new S.Tuple2(t1, stylesheet, type$.Tuple2_of_legacy_Importer_and_legacy_Stylesheet);
+    },
+    importCanonical$3: function(importer, canonicalUrl, originalUrl) {
+      return this._importCache.putIfAbsent$2(canonicalUrl, new R.ImportCache_importCanonical_closure(this, importer, canonicalUrl, originalUrl));
+    },
+    importCanonical$2: function(importer, canonicalUrl) {
+      return this.importCanonical$3(importer, canonicalUrl, null);
+    },
+    humanize$1: function(canonicalUrl) {
+      var t2, url,
+        t1 = this._canonicalizeCache;
+      t1 = t1.get$values(t1);
+      t2 = H._instanceType(t1);
+      url = Y.minBy(new H.MappedIterable(new H.WhereIterable(t1, new R.ImportCache_humanize_closure(canonicalUrl), t2._eval$1("WhereIterable<Iterable.E>")), new R.ImportCache_humanize_closure0(), t2._eval$1("MappedIterable<Iterable.E,Uri*>")), new R.ImportCache_humanize_closure1(), type$.legacy_Uri, type$.dynamic);
+      if (url == null)
+        return canonicalUrl;
+      t1 = $.$get$url();
+      return url.resolve$1(X.ParsedPath_ParsedPath$parse(canonicalUrl.get$path(canonicalUrl), t1.style).get$basename());
+    },
+    clearImport$1: function(canonicalUrl) {
+      this._resultsCache.remove$1(0, canonicalUrl);
+      this._importCache.remove$1(0, canonicalUrl);
+    }
+  };
+  R.ImportCache_canonicalize_closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, t4, t5, _i, importer, canonicalUrl;
+      for (t1 = this.$this, t2 = t1._importers, t3 = t2.length, t4 = this.url, t5 = this.forImport, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i) {
+        importer = t2[_i];
+        canonicalUrl = t1._canonicalize$3(importer, t4, t5);
+        if (canonicalUrl != null)
+          return new S.Tuple3(importer, canonicalUrl, t4, type$.Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri);
+      }
+      return null;
+    },
+    $signature: 109
+  };
+  R.ImportCache__canonicalize_closure.prototype = {
+    call$0: function() {
+      return this.importer.canonicalize$1(this.url);
+    },
+    $signature: 161
+  };
+  R.ImportCache_importCanonical_closure.prototype = {
+    call$0: function() {
+      var t3, _this = this,
+        t1 = _this.canonicalUrl,
+        result = _this.importer.load$1(0, t1),
+        t2 = _this.$this;
+      t2._resultsCache.$indexSet(0, t1, result);
+      t3 = _this.originalUrl;
+      t1 = t3 == null ? t1 : t3.resolveUri$1(t1);
+      return V.Stylesheet_Stylesheet$parse(result.contents, result.syntax, t2._logger, t1);
+    },
+    $signature: 59
+  };
+  R.ImportCache_humanize_closure.prototype = {
+    call$1: function(tuple) {
+      var t1 = tuple == null ? null : tuple.item2;
+      return J.$eq$(t1, this.canonicalUrl);
+    },
+    $signature: 281
+  };
+  R.ImportCache_humanize_closure0.prototype = {
+    call$1: function(tuple) {
+      return tuple.item3;
+    },
+    $signature: 279
+  };
+  R.ImportCache_humanize_closure1.prototype = {
+    call$1: function(url) {
+      return J.get$length$asx(J.get$path$x(url));
+    },
+    $signature: 43
+  };
+  M.Importer.prototype = {
+    modificationTime$1: function(url) {
+      return new P.DateTime(Date.now(), false);
+    },
+    couldCanonicalize$2: function(url, canonicalUrl) {
+      return true;
+    }
+  };
+  B.AsyncImporter.prototype = {};
+  F.FilesystemImporter.prototype = {
+    canonicalize$1: function(url) {
+      var t1, resolved;
+      if (url.get$scheme() !== "file" && url.get$scheme() !== "")
+        return null;
+      t1 = $.$get$context();
+      resolved = B.resolveImportPath(D.join(this._loadPath, t1.style.pathFromUri$1(M._parseUri(url)), null));
+      if (resolved == null)
+        t1 = null;
+      else
+        t1 = t1.toUri$1(J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin") ? F._realCasePath(D.absolute(t1.normalize$1(resolved))) : t1.canonicalize$1(resolved));
+      return t1;
+    },
+    load$1: function(_, url) {
+      var path = $.$get$context().style.pathFromUri$1(M._parseUri(url)),
+        t1 = B.readFile(path),
+        t2 = M.Syntax_forPath(path),
+        t3 = url.get$scheme();
+      if (t3 === "")
+        H.throwExpression(P.ArgumentError$value(url, "sourceMapUrl", "must be absolute"));
+      return new E.ImporterResult(t1, url, t2);
+    },
+    modificationTime$1: function(url) {
+      return B.modificationTime($.$get$context().style.pathFromUri$1(M._parseUri(url)));
+    },
+    couldCanonicalize$2: function(url, canonicalUrl) {
+      var t1, t2, t3, basename, canonicalBasename;
+      if (url.get$scheme() !== "file" && url.get$scheme() !== "")
+        return false;
+      if (canonicalUrl.get$scheme() !== "file")
+        return false;
+      t1 = $.$get$url();
+      t2 = url.get$path(url);
+      t3 = t1.style;
+      basename = X.ParsedPath_ParsedPath$parse(t2, t3).get$basename();
+      canonicalBasename = X.ParsedPath_ParsedPath$parse(canonicalUrl.get$path(canonicalUrl), t3).get$basename();
+      if (!J.startsWith$1$s(basename, "_") && J.startsWith$1$s(canonicalBasename, "_"))
+        canonicalBasename = J.substring$1$s(canonicalBasename, 1);
+      return basename === canonicalBasename || basename === t1.withoutExtension$1(canonicalBasename);
+    },
+    toString$0: function(_) {
+      return this._loadPath;
+    }
+  };
+  E.ImporterResult.prototype = {
+    get$sourceMapUrl: function() {
+      return this._sourceMapUrl;
+    }
+  };
+  B.resolveImportPath_closure.prototype = {
+    call$0: function() {
+      return B._exactlyOne(B._tryPath($.$get$context().withoutExtension$1(this.path) + ".import" + this.extension));
+    },
+    $signature: 12
+  };
+  B.resolveImportPath_closure0.prototype = {
+    call$0: function() {
+      return B._exactlyOne(B._tryPathWithExtensions(this.path + ".import"));
+    },
+    $signature: 12
+  };
+  B._tryPathAsDirectory_closure.prototype = {
+    call$0: function() {
+      return B._exactlyOne(B._tryPathWithExtensions(D.join(this.path, "index.import", null)));
+    },
+    $signature: 12
+  };
+  B._exactlyOne_closure.prototype = {
+    call$1: function(path) {
+      var t1 = $.$get$context();
+      return C.JSString_methods.$add("  ", t1.prettyUri$1(t1.toUri$1(path)));
+    },
+    $signature: 4
+  };
+  Z.InterpolationBuffer.prototype = {
+    add$1: function(_, expression) {
+      this._flushText$0();
+      this._interpolation_buffer$_contents.push(expression);
+    },
+    addInterpolation$1: function(interpolation) {
+      var first, t1, _this = this,
+        toAdd = interpolation.contents;
+      if (toAdd.length === 0)
+        return;
+      first = C.JSArray_methods.get$first(toAdd);
+      if (typeof first == "string") {
+        _this._interpolation_buffer$_text._contents += first;
+        toAdd = H.SubListIterable$(toAdd, 1, null, H._arrayInstanceType(toAdd)._precomputed1);
+      }
+      _this._flushText$0();
+      t1 = _this._interpolation_buffer$_contents;
+      C.JSArray_methods.addAll$1(t1, toAdd);
+      if (typeof C.JSArray_methods.get$last(t1) == "string")
+        _this._interpolation_buffer$_text._contents += H.S(t1.pop());
+    },
+    _flushText$0: function() {
+      var t1 = this._interpolation_buffer$_text,
+        t2 = t1._contents;
+      if (t2.length === 0)
+        return;
+      this._interpolation_buffer$_contents.push(t2.charCodeAt(0) == 0 ? t2 : t2);
+      t1._contents = "";
+    },
+    interpolation$1: function(span) {
+      var t2, t3, _i,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
+      for (t2 = this._interpolation_buffer$_contents, t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        t1.push(t2[_i]);
+      t2 = this._interpolation_buffer$_text._contents;
+      if (t2.length !== 0)
+        t1.push(t2.charCodeAt(0) == 0 ? t2 : t2);
+      return X.Interpolation$(t1, span);
+    },
+    toString$0: function(_) {
+      var t1, t2, _i, t3, element;
+      for (t1 = this._interpolation_buffer$_contents, t2 = t1.length, _i = 0, t3 = ""; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        element = t1[_i];
+        t3 = typeof element == "string" ? t3 + element : t3 + "#{" + H.S(element) + H.Primitives_stringFromCharCode(125);
+      }
+      t1 = t3 + this._interpolation_buffer$_text.toString$0(0);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  F._realCasePath_helper.prototype = {
+    call$1: function(path) {
+      var dirname = $.$get$context().dirname$1(path);
+      if (dirname === path)
+        return path;
+      return $._realCaseCache.putIfAbsent$2(path, new F._realCasePath_helper_closure(this, dirname, path));
+    },
+    $signature: 4
+  };
+  F._realCasePath_helper_closure.prototype = {
+    call$0: function() {
+      var matches, t2, exception,
+        realDirname = this.helper.call$1(this.dirname),
+        t1 = this.path,
+        basename = X.ParsedPath_ParsedPath$parse(t1, $.$get$context().style).get$basename();
+      try {
+        matches = J.where$1$ax(B.listDir(realDirname, false), new F._realCasePath_helper__closure(basename)).toList$0(0);
+        t2 = J.get$length$asx(matches) !== 1 ? D.join(realDirname, basename, null) : J.$index$asx(matches, 0);
+        return t2;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof B.FileSystemException)
+          return t1;
+        else
+          throw exception;
+      }
+    },
+    $signature: 12
+  };
+  F._realCasePath_helper__closure.prototype = {
+    call$1: function(realPath) {
+      return B.equalsIgnoreCase(X.ParsedPath_ParsedPath$parse(realPath, $.$get$context().style).get$basename(), this.basename);
+    },
+    $signature: 6
+  };
+  B.FileSystemException.prototype = {
+    toString$0: function(_) {
+      var t1 = $.$get$context();
+      return H.S(t1.prettyUri$1(t1.toUri$1(this.path))) + ": " + this.message;
+    },
+    get$message: function(receiver) {
+      return this.message;
+    },
+    get$path: function(receiver) {
+      return this.path;
+    }
+  };
+  B.Stderr.prototype = {
+    writeln$1: function(object) {
+      J.write$1$x(this._stderr, H.S(object == null ? "" : object) + "\n");
+    },
+    writeln$0: function() {
+      return this.writeln$1(null);
+    }
+  };
+  B._readFile_closure.prototype = {
+    call$0: function() {
+      return J.readFileSync$2$x(D.fs(), this.path, this.encoding);
+    },
+    $signature: 66
+  };
+  B.writeFile_closure.prototype = {
+    call$0: function() {
+      return J.writeFileSync$2$x(D.fs(), this.path, this.contents);
+    },
+    $signature: 1
+  };
+  B.deleteFile_closure.prototype = {
+    call$0: function() {
+      return J.unlinkSync$1$x(D.fs(), this.path);
+    },
+    $signature: 1
+  };
+  B.readStdin_closure.prototype = {
+    call$1: function(result) {
+      this._box_0.contents = result;
+      this.completer.complete$1(result);
+    },
+    $signature: 275
+  };
+  B.readStdin_closure0.prototype = {
+    call$1: function(chunk) {
+      this.sink.add$1(0, type$.legacy_List_legacy_int._as(chunk));
+    },
+    call$0: function() {
+      return this.call$1(null);
+    },
+    "call*": "call$1",
+    $requiredArgCount: 0,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 65
+  };
+  B.readStdin_closure1.prototype = {
+    call$1: function(_) {
+      this.sink.close$0(0);
+    },
+    call$0: function() {
+      return this.call$1(null);
+    },
+    "call*": "call$1",
+    $requiredArgCount: 0,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 65
+  };
+  B.readStdin_closure2.prototype = {
+    call$1: function(e) {
+      var t1 = $.$get$stderr();
+      t1.writeln$1("Failed to read from stdin");
+      t1.writeln$1(e);
+      this.completer.completeError$1(e);
+    },
+    call$0: function() {
+      return this.call$1(null);
+    },
+    "call*": "call$1",
+    $requiredArgCount: 0,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 65
+  };
+  B.fileExists_closure.prototype = {
+    call$0: function() {
+      var error, systemError, exception,
+        t1 = this.path;
+      if (!J.existsSync$1$x(D.fs(), t1))
+        return false;
+      try {
+        t1 = J.isFile$0$x(J.statSync$1$x(D.fs(), t1));
+        return t1;
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        systemError = type$.legacy_JsSystemError._as(error);
+        if (J.$eq$(J.get$code$x(systemError), "ENOENT"))
+          return false;
+        throw exception;
+      }
+    },
+    $signature: 35
+  };
+  B.dirExists_closure.prototype = {
+    call$0: function() {
+      var error, systemError, exception,
+        t1 = this.path;
+      if (!J.existsSync$1$x(D.fs(), t1))
+        return false;
+      try {
+        t1 = J.isDirectory$0$x(J.statSync$1$x(D.fs(), t1));
+        return t1;
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        systemError = type$.legacy_JsSystemError._as(error);
+        if (J.$eq$(J.get$code$x(systemError), "ENOENT"))
+          return false;
+        throw exception;
+      }
+    },
+    $signature: 35
+  };
+  B.ensureDir_closure.prototype = {
+    call$0: function() {
+      var error, systemError, exception, t1;
+      try {
+        J.mkdirSync$1$x(D.fs(), this.path);
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        systemError = type$.legacy_JsSystemError._as(error);
+        if (J.$eq$(J.get$code$x(systemError), "EEXIST"))
+          return;
+        if (!J.$eq$(J.get$code$x(systemError), "ENOENT"))
+          throw exception;
+        t1 = this.path;
+        B.ensureDir($.$get$context().dirname$1(t1));
+        J.mkdirSync$1$x(D.fs(), t1);
+      }
+    },
+    $signature: 0
+  };
+  B.listDir_closure.prototype = {
+    call$0: function() {
+      var t1 = this.path;
+      if (!this.recursive)
+        return J.map$1$1$ax(J.readdirSync$1$x(D.fs(), t1), new B.listDir__closure(t1), type$.legacy_String).where$1(0, new B.listDir__closure0());
+      else
+        return new B.listDir_closure_list().call$1(t1);
+    },
+    $signature: 169
+  };
+  B.listDir__closure.prototype = {
+    call$1: function(child) {
+      return D.join(this.path, H._asStringS(child), null);
+    },
+    $signature: 107
+  };
+  B.listDir__closure0.prototype = {
+    call$1: function(child) {
+      return !B.dirExists(child);
+    },
+    $signature: 6
+  };
+  B.listDir_closure_list.prototype = {
+    call$1: function($parent) {
+      return J.expand$1$1$ax(J.readdirSync$1$x(D.fs(), $parent), new B.listDir__list_closure($parent, this), type$.legacy_String);
+    },
+    $signature: 170
+  };
+  B.listDir__list_closure.prototype = {
+    call$1: function(child) {
+      var path = D.join(this.parent, H._asStringS(child), null);
+      return B.dirExists(path) ? this.list.call$1(path) : H.setRuntimeTypeInfo([path], type$.JSArray_legacy_String);
+    },
+    $signature: 171
+  };
+  B.modificationTime_closure.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = J.getTime$0$x(J.get$mtime$x(J.statSync$1$x(D.fs(), this.path)));
+      if (Math.abs(t1) <= 864e13)
+        t2 = false;
+      else
+        t2 = true;
+      if (t2)
+        H.throwExpression(P.ArgumentError$("DateTime is outside valid range: " + H.S(t1)));
+      P.ArgumentError_checkNotNull(false, "isUtc");
+      return new P.DateTime(t1, false);
+    },
+    $signature: 172
+  };
+  B.watchDir_closure.prototype = {
+    call$2: function(path, _) {
+      var t1 = this._box_0.controller;
+      return t1 == null ? null : t1.add$1(0, new E.WatchEvent(C.ChangeType_add, path));
+    },
+    call$1: function(path) {
+      return this.call$2(path, null);
+    },
+    "call*": "call$2",
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 173
+  };
+  B.watchDir_closure0.prototype = {
+    call$2: function(path, _) {
+      var t1 = this._box_0.controller;
+      return t1 == null ? null : t1.add$1(0, new E.WatchEvent(C.ChangeType_modify, path));
+    },
+    call$1: function(path) {
+      return this.call$2(path, null);
+    },
+    "call*": "call$2",
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 173
+  };
+  B.watchDir_closure1.prototype = {
+    call$1: function(path) {
+      var t1 = this._box_0.controller;
+      return t1 == null ? null : t1.add$1(0, new E.WatchEvent(C.ChangeType_remove, path));
+    },
+    $signature: 271
+  };
+  B.watchDir_closure2.prototype = {
+    call$1: function(error) {
+      var t1 = this._box_0.controller;
+      return t1 == null ? null : t1.addError$1(error);
+    },
+    $signature: 49
+  };
+  B.watchDir_closure3.prototype = {
+    call$0: function() {
+      var controller = P.StreamController_StreamController(new B.watchDir__closure(this.watcher), null, null, null, false, type$.legacy_WatchEvent);
+      this._box_0.controller = controller;
+      this.completer.complete$1(new P._ControllerStream(controller, H._instanceType(controller)._eval$1("_ControllerStream<1>")));
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  B.watchDir__closure.prototype = {
+    call$0: function() {
+      J.close$0$x(this.watcher);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  F._QuietLogger.prototype = {
+    warn$4$deprecation$span$trace: function(_, message, deprecation, span, trace) {
+    },
+    warn$2$span: function($receiver, message, span) {
+      return this.warn$4$deprecation$span$trace($receiver, message, false, span, null);
+    },
+    warn$2$deprecation: function($receiver, message, deprecation) {
+      return this.warn$4$deprecation$span$trace($receiver, message, deprecation, null, null);
+    },
+    warn$3$deprecation$span: function($receiver, message, deprecation, span) {
+      return this.warn$4$deprecation$span$trace($receiver, message, deprecation, span, null);
+    },
+    warn$2$trace: function($receiver, message, trace) {
+      return this.warn$4$deprecation$span$trace($receiver, message, false, null, trace);
+    },
+    debug$2: function(_, message, span) {
+    }
+  };
+  S.StderrLogger.prototype = {
+    warn$4$deprecation$span$trace: function(_, message, deprecation, span, trace) {
+      var t2, t3,
+        t1 = this.color;
+      if (t1) {
+        t2 = $.$get$stderr();
+        t3 = t2._stderr;
+        J.write$1$x(t3, "\x1b[33m\x1b[1m");
+        if (deprecation)
+          J.write$1$x(t3, "Deprecation ");
+        J.write$1$x(t3, "Warning\x1b[0m");
+      } else {
+        if (deprecation)
+          J.write$1$x($.$get$stderr()._stderr, "DEPRECATION ");
+        t2 = $.$get$stderr();
+        J.write$1$x(t2._stderr, "WARNING");
+      }
+      if (span == null)
+        t2.writeln$1(": " + H.S(message));
+      else if (trace != null)
+        t2.writeln$1(": " + H.S(message) + "\n\n" + span.highlight$1$color(t1));
+      else
+        t2.writeln$1(" on " + span.message$2$color(0, C.JSString_methods.$add("\n", message), t1));
+      if (trace != null)
+        t2.writeln$1(B.indent(C.JSString_methods.trimRight$0(trace.toString$0(0)), 4));
+      t2.writeln$0();
+    },
+    warn$2$span: function($receiver, message, span) {
+      return this.warn$4$deprecation$span$trace($receiver, message, false, span, null);
+    },
+    warn$2$deprecation: function($receiver, message, deprecation) {
+      return this.warn$4$deprecation$span$trace($receiver, message, deprecation, null, null);
+    },
+    warn$3$deprecation$span: function($receiver, message, deprecation, span) {
+      return this.warn$4$deprecation$span$trace($receiver, message, deprecation, span, null);
+    },
+    warn$2$trace: function($receiver, message, trace) {
+      return this.warn$4$deprecation$span$trace($receiver, message, false, null, trace);
+    },
+    debug$2: function(_, message, span) {
+      var url, t3, t4,
+        t1 = span.file,
+        t2 = span._file$_start;
+      if (Y.FileLocation$_(t1, t2).file.url == null)
+        url = "-";
+      else {
+        t3 = Y.FileLocation$_(t1, t2);
+        url = $.$get$context().prettyUri$1(t3.file.url);
+      }
+      t3 = $.$get$stderr();
+      t4 = H.S(url) + ":";
+      t2 = Y.FileLocation$_(t1, t2);
+      t2 = t4 + (t2.file.getLine$1(t2.offset) + 1) + " ";
+      t4 = t3._stderr;
+      J.write$1$x(t4, t2);
+      J.write$1$x(t4, this.color ? "\x1b[1mDebug\x1b[0m" : "DEBUG");
+      t3.writeln$1(": " + H.S(message));
+    }
+  };
+  T.TrackingLogger.prototype = {
+    warn$4$deprecation$span$trace: function(_, message, deprecation, span, trace) {
+      this._emittedWarning = true;
+      this._tracking$_logger.warn$4$deprecation$span$trace(0, message, deprecation, span, trace);
+    },
+    warn$2$span: function($receiver, message, span) {
+      return this.warn$4$deprecation$span$trace($receiver, message, false, span, null);
+    },
+    warn$2$deprecation: function($receiver, message, deprecation) {
+      return this.warn$4$deprecation$span$trace($receiver, message, deprecation, null, null);
+    },
+    warn$3$deprecation$span: function($receiver, message, deprecation, span) {
+      return this.warn$4$deprecation$span$trace($receiver, message, deprecation, span, null);
+    },
+    warn$2$trace: function($receiver, message, trace) {
+      return this.warn$4$deprecation$span$trace($receiver, message, false, null, trace);
+    },
+    debug$2: function(_, message, span) {
+      this._emittedDebug = true;
+      this._tracking$_logger.debug$2(0, message, span);
+    }
+  };
+  Q.BuiltInModule.prototype = {
+    get$upstream: function() {
+      return C.List_empty3;
+    },
+    get$variableNodes: function() {
+      return C.Map_empty1;
+    },
+    get$extender: function() {
+      return C.C_EmptyExtender;
+    },
+    get$css: function(_) {
+      return new V.CssStylesheet(C.List_empty0, Y.SourceFile$decoded(C.List_empty1, this.url).span$2(0, 0));
+    },
+    get$transitivelyContainsCss: function() {
+      return false;
+    },
+    get$transitivelyContainsExtensions: function() {
+      return false;
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      if (!this.variables.containsKey$1($name))
+        throw H.wrapException(E.SassScriptException$("Undefined variable."));
+      throw H.wrapException(E.SassScriptException$("Cannot modify built-in variable."));
+    },
+    variableIdentity$1: function($name) {
+      return this;
+    },
+    cloneCss$0: function() {
+      return this;
+    },
+    $isModule: 1,
+    get$url: function() {
+      return this.url;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    },
+    get$variables: function() {
+      return this.variables;
+    }
+  };
+  R.ForwardedModuleView.prototype = {
+    get$url: function() {
+      return this._forwarded_view$_inner.get$url();
+    },
+    get$upstream: function() {
+      return this._forwarded_view$_inner.get$upstream();
+    },
+    get$extender: function() {
+      return this._forwarded_view$_inner.get$extender();
+    },
+    get$css: function(_) {
+      var t1 = this._forwarded_view$_inner;
+      return t1.get$css(t1);
+    },
+    get$transitivelyContainsCss: function() {
+      return this._forwarded_view$_inner.get$transitivelyContainsCss();
+    },
+    get$transitivelyContainsExtensions: function() {
+      return this._forwarded_view$_inner.get$transitivelyContainsExtensions();
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      var _s19_ = "Undefined variable.",
+        t1 = this._rule,
+        t2 = t1.shownVariables;
+      if (t2 != null && !t2._base.contains$1(0, $name))
+        throw H.wrapException(E.SassScriptException$(_s19_));
+      else {
+        t2 = t1.hiddenVariables;
+        if (t2 != null && t2._base.contains$1(0, $name))
+          throw H.wrapException(E.SassScriptException$(_s19_));
+      }
+      t1 = t1.prefix;
+      if (t1 != null) {
+        if (!C.JSString_methods.startsWith$1($name, t1))
+          throw H.wrapException(E.SassScriptException$(_s19_));
+        $name = C.JSString_methods.substring$1($name, t1.length);
+      }
+      return this._forwarded_view$_inner.setVariable$3($name, value, nodeWithSpan);
+    },
+    variableIdentity$1: function($name) {
+      var t1 = this._rule.prefix;
+      if (t1 != null)
+        $name = J.substring$1$s($name, t1.length);
+      return this._forwarded_view$_inner.variableIdentity$1($name);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof R.ForwardedModuleView && J.$eq$(this._forwarded_view$_inner, other._forwarded_view$_inner) && this._rule === other._rule;
+    },
+    get$hashCode: function(_) {
+      return (J.get$hashCode$(this._forwarded_view$_inner) ^ H.Primitives_objectHashCode(this._rule)) >>> 0;
+    },
+    cloneCss$0: function() {
+      return R.ForwardedModuleView$(this._forwarded_view$_inner.cloneCss$0(), this._rule, this.$ti._eval$1("1*"));
+    },
+    toString$0: function(_) {
+      return "forwarded " + H.S(this._forwarded_view$_inner);
+    },
+    $isModule: 1,
+    get$variables: function() {
+      return this.variables;
+    },
+    get$variableNodes: function() {
+      return this.variableNodes;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    }
+  };
+  B.ShadowedModuleView.prototype = {
+    get$url: function() {
+      return this._shadowed_view$_inner.get$url();
+    },
+    get$upstream: function() {
+      return this._shadowed_view$_inner.get$upstream();
+    },
+    get$extender: function() {
+      return this._shadowed_view$_inner.get$extender();
+    },
+    get$css: function(_) {
+      var t1 = this._shadowed_view$_inner;
+      return t1.get$css(t1);
+    },
+    get$transitivelyContainsCss: function() {
+      return this._shadowed_view$_inner.get$transitivelyContainsCss();
+    },
+    get$transitivelyContainsExtensions: function() {
+      return this._shadowed_view$_inner.get$transitivelyContainsExtensions();
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      if (!this.variables.containsKey$1($name))
+        throw H.wrapException(E.SassScriptException$("Undefined variable."));
+      else
+        return this._shadowed_view$_inner.setVariable$3($name, value, nodeWithSpan);
+    },
+    variableIdentity$1: function($name) {
+      return this._shadowed_view$_inner.variableIdentity$1($name);
+    },
+    $eq: function(_, other) {
+      var t1, t2, _this = this;
+      if (other == null)
+        return false;
+      if (other instanceof B.ShadowedModuleView)
+        if (_this._shadowed_view$_inner.$eq(0, other._shadowed_view$_inner)) {
+          t1 = _this.variables;
+          t1 = t1.get$keys(t1);
+          t2 = other.variables;
+          if (C.C_IterableEquality.equals$2(0, t1, t2.get$keys(t2))) {
+            t1 = _this.functions;
+            t1 = t1.get$keys(t1);
+            t2 = other.functions;
+            if (C.C_IterableEquality.equals$2(0, t1, t2.get$keys(t2))) {
+              t1 = _this.mixins;
+              t1 = t1.get$keys(t1);
+              t2 = other.mixins;
+              t2 = C.C_IterableEquality.equals$2(0, t1, t2.get$keys(t2));
+              t1 = t2;
+            } else
+              t1 = false;
+          } else
+            t1 = false;
+        } else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this._shadowed_view$_inner;
+      return t1.get$hashCode(t1);
+    },
+    cloneCss$0: function() {
+      var _this = this;
+      return new B.ShadowedModuleView(_this._shadowed_view$_inner.cloneCss$0(), _this.variables, _this.variableNodes, _this.functions, _this.mixins, _this.$ti._eval$1("ShadowedModuleView<1*>"));
+    },
+    toString$0: function(_) {
+      return "shadowed " + this._shadowed_view$_inner.toString$0(0);
+    },
+    $isModule: 1,
+    get$variables: function() {
+      return this.variables;
+    },
+    get$variableNodes: function() {
+      return this.variableNodes;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    }
+  };
+  Y.Chokidar.prototype = {};
+  Y.ChokidarOptions.prototype = {};
+  Y.ChokidarWatcher.prototype = {};
+  F.JSFunction.prototype = {};
+  F.NodeImporterResult.prototype = {};
+  B._PropertyDescriptor.prototype = {};
+  V.AtRootQueryParser.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new V.AtRootQueryParser_parse_closure(this));
+    }
+  };
+  V.AtRootQueryParser_parse_closure.prototype = {
+    call$0: function() {
+      var include, atRules,
+        t1 = this.$this,
+        t2 = t1.scanner;
+      t2.expectChar$1(40);
+      t1.whitespace$0();
+      include = t1.scanIdentifier$1("with");
+      if (!include)
+        t1.expectIdentifier$2$name("without", '"with" or "without"');
+      t1.whitespace$0();
+      t2.expectChar$1(58);
+      t1.whitespace$0();
+      atRules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_String);
+      do {
+        atRules.add$1(0, t1.identifier$0().toLowerCase());
+        t1.whitespace$0();
+      } while (t1.lookingAtIdentifier$0());
+      t2.expectChar$1(41);
+      t2.expectDone$0();
+      return new V.AtRootQuery(include, atRules, atRules.contains$1(0, "all"), atRules.contains$1(0, "rule"));
+    },
+    $signature: 113
+  };
+  Q.closure112.prototype = {
+    call$1: function($function) {
+      return $function.name;
+    },
+    $signature: 270
+  };
+  Q.CssParser.prototype = {
+    get$plainCss: function() {
+      return true;
+    },
+    silentComment$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position;
+      this.super$Parser$silentComment();
+      this.error$2(0, string$.Silent, t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    atRule$2$root: function(child, root) {
+      var $name, urlStart, next, url, urlSpan, queries, t2, t3, t4, t5, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expectChar$1(64);
+      $name = _this.interpolatedIdentifier$0();
+      _this.whitespace$0();
+      switch ($name.get$asPlain()) {
+        case "at-root":
+        case "content":
+        case "debug":
+        case "each":
+        case "error":
+        case "extend":
+        case "for":
+        case "function":
+        case "if":
+        case "include":
+        case "mixin":
+        case "return":
+        case "warn":
+        case "while":
+          _this.almostAnyValue$0();
+          _this.error$2(0, "This at-rule isn't allowed in plain CSS.", t1.spanFrom$1(start));
+          break;
+        case "charset":
+          _this.string$0();
+          if (!root)
+            _this.error$2(0, "This at-rule is not allowed here.", t1.spanFrom$1(start));
+          return null;
+        case "import":
+          urlStart = new S._SpanScannerState(t1, t1._string_scanner$_position);
+          next = t1.peekChar$0();
+          url = next === 117 || next === 85 ? _this.dynamicUrl$0() : new D.StringExpression(_this.interpolatedString$0().asInterpolation$1$static(true), false);
+          urlSpan = t1.spanFrom$1(urlStart);
+          _this.whitespace$0();
+          queries = _this.tryImportQueries$0();
+          _this.expectStatementSeparator$1("@import rule");
+          t2 = X.Interpolation$(H.setRuntimeTypeInfo([url], type$.JSArray_legacy_Object), urlSpan);
+          t3 = t1.spanFrom$1(urlStart);
+          t4 = queries == null;
+          t5 = t4 ? null : queries.item1;
+          t2 = H.setRuntimeTypeInfo([new Q.StaticImport(t2, t5, t4 ? null : queries.item2, t3)], type$.JSArray_legacy_Import);
+          t1 = t1.spanFrom$1(start);
+          return new B.ImportRule(P.List_List$unmodifiable(t2, type$.legacy_Import), t1);
+        case "media":
+          return _this.mediaRule$1(start);
+        case "-moz-document":
+          return _this.mozDocumentRule$2(start, $name);
+        case "supports":
+          return _this.supportsRule$1(start);
+        default:
+          return _this.unknownAtRule$2(start, $name);
+      }
+    },
+    identifierLike$0: function() {
+      var t2, $arguments, t3, t4, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        identifier = _this.interpolatedIdentifier$0(),
+        plain = identifier.get$asPlain(),
+        specialFunction = _this.trySpecialFunction$2(plain.toLowerCase(), start);
+      if (specialFunction != null)
+        return specialFunction;
+      t2 = t1._string_scanner$_position;
+      if (!t1.scanChar$1(40))
+        return new D.StringExpression(identifier, false);
+      $arguments = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression);
+      if (!t1.scanChar$1(41)) {
+        do {
+          _this.whitespace$0();
+          $arguments.push(_this.expression$1$singleEquals(true));
+          _this.whitespace$0();
+        } while (t1.scanChar$1(44));
+        t1.expectChar$1(41);
+      }
+      if ($.$get$_disallowedFunctionNames().contains$1(0, plain))
+        _this.error$2(0, string$.This_f, t1.spanFrom$1(start));
+      t3 = X.Interpolation$(H.setRuntimeTypeInfo([new D.StringExpression(identifier, false)], type$.JSArray_legacy_Object), identifier.span);
+      t2 = t1.spanFrom$1(new S._SpanScannerState(t1, t2));
+      t4 = type$.legacy_Expression;
+      return new F.FunctionExpression(null, t3, new X.ArgumentInvocation(P.List_List$unmodifiable($arguments, t4), H.ConstantMap_ConstantMap$from(C.Map_empty3, type$.legacy_String, t4), null, null, t2), t1.spanFrom$1(start));
+    }
+  };
+  E.KeyframeSelectorParser.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new E.KeyframeSelectorParser_parse_closure(this));
+    },
+    _percentage$0: function() {
+      var t3, next,
+        t1 = this.scanner,
+        t2 = t1.scanChar$1(43) ? H.Primitives_stringFromCharCode(43) : "",
+        second = t1.peekChar$0();
+      if (!T.isDigit(second) && second !== 46)
+        t1.error$1(0, "Expected number.");
+      while (true) {
+        t3 = t1.peekChar$0();
+        if (!(t3 != null && t3 >= 48 && t3 <= 57))
+          break;
+        t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+      }
+      if (t1.peekChar$0() === 46) {
+        t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+        while (true) {
+          t3 = t1.peekChar$0();
+          if (!(t3 != null && t3 >= 48 && t3 <= 57))
+            break;
+          t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+        }
+      }
+      if (this.scanIdentifier$1("e")) {
+        t2 += t1.readChar$0();
+        next = t1.peekChar$0();
+        if (next === 43 || next === 45)
+          t2 += t1.readChar$0();
+        if (!T.isDigit(t1.peekChar$0()))
+          t1.error$1(0, "Expected digit.");
+        while (true) {
+          t3 = t1.peekChar$0();
+          if (!(t3 != null && t3 >= 48 && t3 <= 57))
+            break;
+          t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+        }
+      }
+      t1.expectChar$1(37);
+      t2 += H.Primitives_stringFromCharCode(37);
+      return t2.charCodeAt(0) == 0 ? t2 : t2;
+    }
+  };
+  E.KeyframeSelectorParser_parse_closure.prototype = {
+    call$0: function() {
+      var selectors = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String),
+        t1 = this.$this,
+        t2 = t1.scanner;
+      do {
+        t1.whitespace$0();
+        if (t1.lookingAtIdentifier$0())
+          if (t1.scanIdentifier$1("from"))
+            selectors.push("from");
+          else {
+            t1.expectIdentifier$2$name("to", '"to" or "from"');
+            selectors.push("to");
+          }
+        else
+          selectors.push(t1._percentage$0());
+        t1.whitespace$0();
+      } while (t2.scanChar$1(44));
+      t2.expectDone$0();
+      return selectors;
+    },
+    $signature: 40
+  };
+  F.MediaQueryParser.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new F.MediaQueryParser_parse_closure(this));
+    },
+    _mediaQuery$0: function() {
+      var identifier1, identifier2, type, modifier, features, _this = this, _null = null,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() !== 40) {
+        identifier1 = _this.identifier$0();
+        _this.whitespace$0();
+        if (!_this.lookingAtIdentifier$0())
+          return new F.CssMediaQuery(_null, identifier1, C.List_empty);
+        identifier2 = _this.identifier$0();
+        _this.whitespace$0();
+        if (B.equalsIgnoreCase(identifier2, "and")) {
+          type = identifier1;
+          modifier = _null;
+        } else {
+          if (_this.scanIdentifier$1("and"))
+            _this.whitespace$0();
+          else
+            return new F.CssMediaQuery(identifier1, identifier2, C.List_empty);
+          type = identifier2;
+          modifier = identifier1;
+        }
+      } else {
+        type = _null;
+        modifier = type;
+      }
+      features = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      do {
+        _this.whitespace$0();
+        t1.expectChar$1(40);
+        features.push("(" + _this.declarationValue$0() + ")");
+        t1.expectChar$1(41);
+        _this.whitespace$0();
+      } while (_this.scanIdentifier$1("and"));
+      if (type == null)
+        return new F.CssMediaQuery(_null, _null, P.List_List$unmodifiable(features, type$.legacy_String));
+      else {
+        t1 = P.List_List$unmodifiable(features, type$.legacy_String);
+        return new F.CssMediaQuery(modifier, type, t1);
+      }
+    }
+  };
+  F.MediaQueryParser_parse_closure.prototype = {
+    call$0: function() {
+      var queries = H.setRuntimeTypeInfo([], type$.JSArray_legacy_CssMediaQuery),
+        t1 = this.$this,
+        t2 = t1.scanner;
+      do {
+        t1.whitespace$0();
+        queries.push(t1._mediaQuery$0());
+      } while (t2.scanChar$1(44));
+      t2.expectDone$0();
+      return queries;
+    },
+    $signature: 114
+  };
+  G.Parser.prototype = {
+    _parseIdentifier$0: function() {
+      return this.wrapSpanFormatException$1(new G.Parser__parseIdentifier_closure(this));
+    },
+    _isVariableDeclarationLike$0: function() {
+      var _this = this,
+        t1 = _this.scanner;
+      if (!t1.scanChar$1(36))
+        return false;
+      if (!_this.lookingAtIdentifier$0())
+        return false;
+      _this.identifier$0();
+      _this.whitespace$0();
+      return t1.scanChar$1(58);
+    },
+    whitespace$0: function() {
+      do
+        this.whitespaceWithoutComments$0();
+      while (this.scanComment$0());
+    },
+    whitespaceWithoutComments$0: function() {
+      var t3,
+        t1 = this.scanner,
+        t2 = t1.string.length;
+      while (true) {
+        if (t1._string_scanner$_position !== t2) {
+          t3 = t1.peekChar$0();
+          t3 = t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        t1.readChar$0();
+      }
+    },
+    spaces$0: function() {
+      var t3,
+        t1 = this.scanner,
+        t2 = t1.string.length;
+      while (true) {
+        if (t1._string_scanner$_position !== t2) {
+          t3 = t1.peekChar$0();
+          t3 = t3 === 32 || t3 === 9;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        t1.readChar$0();
+      }
+    },
+    scanComment$0: function() {
+      var next,
+        t1 = this.scanner;
+      if (t1.peekChar$0() !== 47)
+        return false;
+      next = t1.peekChar$1(1);
+      if (next === 47) {
+        this.silentComment$0();
+        return true;
+      } else if (next === 42) {
+        this.loudComment$0();
+        return true;
+      } else
+        return false;
+    },
+    silentComment$0: function() {
+      var t2, t3,
+        t1 = this.scanner;
+      t1.expect$1("//");
+      t2 = t1.string.length;
+      while (true) {
+        if (t1._string_scanner$_position !== t2) {
+          t3 = t1.peekChar$0();
+          t3 = !(t3 === 10 || t3 === 13 || t3 === 12);
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        t1.readChar$0();
+      }
+    },
+    loudComment$0: function() {
+      var next,
+        t1 = this.scanner;
+      t1.expect$1("/*");
+      for (; true;) {
+        if (t1.readChar$0() !== 42)
+          continue;
+        do
+          next = t1.readChar$0();
+        while (next === 42);
+        if (next === 47)
+          break;
+      }
+    },
+    identifier$2$normalize$unit: function(normalize, unit) {
+      var t2, first, _this = this,
+        _s20_ = "Expected identifier.",
+        text = new P.StringBuffer(""),
+        t1 = _this.scanner;
+      if (t1.scanChar$1(45)) {
+        t2 = text._contents = H.Primitives_stringFromCharCode(45);
+        if (t1.scanChar$1(45)) {
+          text._contents = t2 + H.Primitives_stringFromCharCode(45);
+          _this._identifierBody$3$normalize$unit(text, normalize, unit);
+          t1 = text._contents;
+          return t1.charCodeAt(0) == 0 ? t1 : t1;
+        }
+      } else
+        t2 = "";
+      first = t1.peekChar$0();
+      if (first == null)
+        t1.error$1(0, _s20_);
+      else if (normalize && first === 95) {
+        t1.readChar$0();
+        text._contents = t2 + H.Primitives_stringFromCharCode(45);
+      } else if (first === 95 || T.isAlphabetic0(first) || first >= 128)
+        text._contents = t2 + H.Primitives_stringFromCharCode(t1.readChar$0());
+      else if (first === 92)
+        text._contents = t2 + H.S(_this.escape$1$identifierStart(true));
+      else
+        t1.error$1(0, _s20_);
+      _this._identifierBody$3$normalize$unit(text, normalize, unit);
+      t1 = text._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    identifier$0: function() {
+      return this.identifier$2$normalize$unit(false, false);
+    },
+    identifier$1$normalize: function(normalize) {
+      return this.identifier$2$normalize$unit(normalize, false);
+    },
+    identifier$1$unit: function(unit) {
+      return this.identifier$2$normalize$unit(false, unit);
+    },
+    _identifierBody$3$normalize$unit: function(text, normalize, unit) {
+      var t1, next, second, t2;
+      for (t1 = this.scanner; true;) {
+        next = t1.peekChar$0();
+        if (next == null)
+          break;
+        else if (unit && next === 45) {
+          second = t1.peekChar$1(1);
+          if (second != null)
+            if (second !== 46)
+              t2 = second >= 48 && second <= 57;
+            else
+              t2 = true;
+          else
+            t2 = false;
+          if (t2)
+            break;
+          text._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+        } else if (normalize && next === 95) {
+          t1.readChar$0();
+          text._contents += H.Primitives_stringFromCharCode(45);
+        } else {
+          if (next !== 95) {
+            if (!(next >= 97 && next <= 122))
+              t2 = next >= 65 && next <= 90;
+            else
+              t2 = true;
+            t2 = t2 || next >= 128;
+          } else
+            t2 = true;
+          if (!t2) {
+            t2 = next >= 48 && next <= 57;
+            t2 = t2 || next === 45;
+          } else
+            t2 = true;
+          if (t2)
+            text._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          else if (next === 92)
+            text._contents += H.S(this.escape$0());
+          else
+            break;
+        }
+      }
+    },
+    _identifierBody$1: function(text) {
+      return this._identifierBody$3$normalize$unit(text, false, false);
+    },
+    string$0: function() {
+      var t2, buffer, next,
+        t1 = this.scanner,
+        quote = t1.readChar$0();
+      if (quote !== 39 && quote !== 34) {
+        t2 = t1._string_scanner$_position;
+        t1.error$2$position(0, "Expected string.", t2 - 1);
+      }
+      buffer = new P.StringBuffer("");
+      for (; true;) {
+        next = t1.peekChar$0();
+        if (next === quote) {
+          t1.readChar$0();
+          break;
+        } else if (next == null || next === 10 || next === 13 || next === 12)
+          t1.error$1(0, "Expected " + H.Primitives_stringFromCharCode(quote) + ".");
+        else if (next === 92) {
+          t2 = t1.peekChar$1(1);
+          if (t2 === 10 || t2 === 13 || t2 === 12) {
+            t1.readChar$0();
+            t1.readChar$0();
+          } else
+            buffer._contents += H.Primitives_stringFromCharCode(this.escapeCharacter$0());
+        } else
+          buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+      }
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    naturalNumber$0: function() {
+      var number, t2,
+        t1 = this.scanner,
+        first = t1.readChar$0();
+      if (!T.isDigit(first))
+        t1.error$2$position(0, "Expected digit.", t1._string_scanner$_position - 1);
+      number = first - 48;
+      while (true) {
+        t2 = t1.peekChar$0();
+        if (!(t2 != null && t2 >= 48 && t2 <= 57))
+          break;
+        number = number * 10 + (t1.readChar$0() - 48);
+      }
+      return number;
+    },
+    declarationValue$1$allowEmpty: function(allowEmpty) {
+      var t1, t2, wroteNewline, next, start, end, t3, url, _this = this,
+        buffer = new P.StringBuffer(""),
+        brackets = H.setRuntimeTypeInfo([], type$.JSArray_legacy_int);
+      $label0$1:
+        for (t1 = _this.scanner, t2 = _this.get$string(), wroteNewline = false; true;) {
+          next = t1.peekChar$0();
+          switch (next) {
+            case 92:
+              buffer._contents += H.S(_this.escape$1$identifierStart(true));
+              wroteNewline = false;
+              break;
+            case 34:
+            case 39:
+              start = t1._string_scanner$_position;
+              t2.call$0();
+              end = t1._string_scanner$_position;
+              buffer._contents += J.substring$2$s(t1.string, start, end);
+              wroteNewline = false;
+              break;
+            case 47:
+              if (t1.peekChar$1(1) === 42) {
+                t3 = _this.get$loudComment();
+                start = t1._string_scanner$_position;
+                t3.call$0();
+                end = t1._string_scanner$_position;
+                buffer._contents += J.substring$2$s(t1.string, start, end);
+              } else
+                buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 32:
+            case 9:
+              if (!wroteNewline) {
+                t3 = t1.peekChar$1(1);
+                t3 = !(t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12);
+              } else
+                t3 = true;
+              if (t3)
+                buffer._contents += H.Primitives_stringFromCharCode(32);
+              t1.readChar$0();
+              break;
+            case 10:
+            case 13:
+            case 12:
+              t3 = t1.peekChar$1(-1);
+              if (!(t3 === 10 || t3 === 13 || t3 === 12))
+                buffer._contents += "\n";
+              t1.readChar$0();
+              wroteNewline = true;
+              break;
+            case 40:
+            case 123:
+            case 91:
+              buffer._contents += H.Primitives_stringFromCharCode(next);
+              brackets.push(T.opposite(t1.readChar$0()));
+              wroteNewline = false;
+              break;
+            case 41:
+            case 125:
+            case 93:
+              if (brackets.length === 0)
+                break $label0$1;
+              buffer._contents += H.Primitives_stringFromCharCode(next);
+              t1.expectChar$1(brackets.pop());
+              wroteNewline = false;
+              break;
+            case 59:
+              if (brackets.length === 0)
+                break $label0$1;
+              buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 117:
+            case 85:
+              url = _this.tryUrl$0();
+              if (url != null)
+                buffer._contents += url;
+              else
+                buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            default:
+              if (next == null)
+                break $label0$1;
+              if (_this.lookingAtIdentifier$0())
+                buffer._contents += _this.identifier$0();
+              else
+                buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+          }
+        }
+      if (brackets.length !== 0)
+        t1.expectChar$1(C.JSArray_methods.get$last(brackets));
+      if (!allowEmpty && buffer._contents.length === 0)
+        t1.error$1(0, "Expected token.");
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    declarationValue$0: function() {
+      return this.declarationValue$1$allowEmpty(false);
+    },
+    tryUrl$0: function() {
+      var buffer, next, t2, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      if (!_this.scanIdentifier$1("url"))
+        return null;
+      if (!t1.scanChar$1(40)) {
+        t1.set$state(start);
+        return null;
+      }
+      _this.whitespace$0();
+      buffer = new P.StringBuffer("");
+      buffer._contents = "url(";
+      for (; true;) {
+        next = t1.peekChar$0();
+        if (next == null)
+          break;
+        else {
+          if (next !== 37)
+            if (next !== 38)
+              if (next !== 35)
+                t2 = next >= 42 && next <= 126 || next >= 128;
+              else
+                t2 = true;
+            else
+              t2 = true;
+          else
+            t2 = true;
+          if (t2)
+            buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          else if (next === 92)
+            buffer._contents += H.S(_this.escape$0());
+          else if (next === 32 || next === 9 || next === 10 || next === 13 || next === 12) {
+            _this.whitespace$0();
+            if (t1.peekChar$0() !== 41)
+              break;
+          } else if (next === 41) {
+            t2 = buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            return t2.charCodeAt(0) == 0 ? t2 : t2;
+          } else
+            break;
+        }
+      }
+      t1.set$state(start);
+      return null;
+    },
+    variableName$0: function() {
+      this.scanner.expectChar$1(36);
+      return this.identifier$1$normalize(true);
+    },
+    escape$1$identifierStart: function(identifierStart) {
+      var value, first, i, next, t2, exception,
+        t1 = this.scanner,
+        start = t1._string_scanner$_position;
+      t1.expectChar$1(92);
+      value = 0;
+      first = t1.peekChar$0();
+      if (first == null)
+        return "";
+      else if (T.isNewline(first))
+        t1.error$1(0, "Expected escape sequence.");
+      else if (T.isHex(first)) {
+        for (i = 0; i < 6; ++i) {
+          next = t1.peekChar$0();
+          if (next == null || !T.isHex(next))
+            break;
+          value *= 16;
+          value += T.asHex(t1.readChar$0());
+        }
+        this.scanCharIf$1(T.character__isWhitespace$closure());
+      } else
+        value = t1.readChar$0();
+      if (identifierStart) {
+        t2 = value;
+        t2 = t2 === 95 || T.isAlphabetic0(t2) || t2 >= 128;
+      } else {
+        t2 = value;
+        t2 = t2 === 95 || T.isAlphabetic0(t2) || t2 >= 128 || T.isDigit(t2) || t2 === 45;
+      }
+      if (t2)
+        try {
+          t2 = H.Primitives_stringFromCharCode(value);
+          return t2;
+        } catch (exception) {
+          if (type$.legacy_RangeError._is(H.unwrapException(exception)))
+            t1.error$3$length$position(0, "Invalid Unicode code point.", t1._string_scanner$_position - start, start);
+          else
+            throw exception;
+        }
+      else {
+        if (!(value <= 31))
+          if (!J.$eq$(value, 127))
+            t1 = identifierStart && T.isDigit(value);
+          else
+            t1 = true;
+        else
+          t1 = true;
+        if (t1) {
+          t1 = H.Primitives_stringFromCharCode(92);
+          if (value > 15)
+            t1 += H.Primitives_stringFromCharCode(T.hexCharFor(C.JSNumber_methods._shrOtherPositive$1(value, 4)));
+          t1 = t1 + H.Primitives_stringFromCharCode(T.hexCharFor(value & 15)) + H.Primitives_stringFromCharCode(32);
+          return t1.charCodeAt(0) == 0 ? t1 : t1;
+        } else
+          return P.String_String$fromCharCodes(H.setRuntimeTypeInfo([92, value], type$.JSArray_legacy_int), 0, null);
+      }
+    },
+    escape$0: function() {
+      return this.escape$1$identifierStart(false);
+    },
+    escapeCharacter$0: function() {
+      var first, value, i, next, t2,
+        t1 = this.scanner;
+      t1.expectChar$1(92);
+      first = t1.peekChar$0();
+      if (first == null)
+        return 65533;
+      else if (T.isNewline(first))
+        t1.error$1(0, "Expected escape sequence.");
+      else if (T.isHex(first)) {
+        for (value = 0, i = 0; i < 6; ++i) {
+          next = t1.peekChar$0();
+          if (next == null || !T.isHex(next))
+            break;
+          value = (value << 4 >>> 0) + T.asHex(t1.readChar$0());
+        }
+        t2 = t1.peekChar$0();
+        if (t2 === 32 || t2 === 9 || T.isNewline(t2))
+          t1.readChar$0();
+        if (value !== 0)
+          t1 = value >= 55296 && value <= 57343 || value >= 1114111;
+        else
+          t1 = true;
+        if (t1)
+          return 65533;
+        else
+          return value;
+      } else
+        return t1.readChar$0();
+    },
+    scanCharIf$1: function(condition) {
+      var t1 = this.scanner;
+      if (!condition.call$1(t1.peekChar$0()))
+        return false;
+      t1.readChar$0();
+      return true;
+    },
+    scanIdentChar$2$caseSensitive: function(char, caseSensitive) {
+      var t3,
+        t1 = new G.Parser_scanIdentChar_matches(caseSensitive, char),
+        t2 = this.scanner,
+        next = t2.peekChar$0();
+      if (next != null && t1.call$1(next)) {
+        t2.readChar$0();
+        return true;
+      } else if (next === 92) {
+        t3 = t2._string_scanner$_position;
+        if (t1.call$1(this.escapeCharacter$0()))
+          return true;
+        t2.set$state(new S._SpanScannerState(t2, t3));
+      }
+      return false;
+    },
+    scanIdentChar$1: function(char) {
+      return this.scanIdentChar$2$caseSensitive(char, false);
+    },
+    expectIdentChar$1: function(letter) {
+      var t1;
+      if (this.scanIdentChar$2$caseSensitive(letter, false))
+        return;
+      t1 = this.scanner;
+      t1.error$2$position(0, 'Expected "' + H.Primitives_stringFromCharCode(letter) + '".', t1._string_scanner$_position);
+    },
+    lookingAtNumber$0: function() {
+      var second, third,
+        t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first == null)
+        return false;
+      if (T.isDigit(first))
+        return true;
+      if (first === 46) {
+        second = t1.peekChar$1(1);
+        return second != null && T.isDigit(second);
+      } else if (first === 43 || first === 45) {
+        second = t1.peekChar$1(1);
+        if (second == null)
+          return false;
+        if (T.isDigit(second))
+          return true;
+        if (second !== 46)
+          return false;
+        third = t1.peekChar$1(2);
+        return third != null && T.isDigit(third);
+      } else
+        return false;
+    },
+    lookingAtIdentifier$1: function($forward) {
+      var t1, first, second;
+      if ($forward == null)
+        $forward = 0;
+      t1 = this.scanner;
+      first = t1.peekChar$1($forward);
+      if (first == null)
+        return false;
+      if (first === 95 || T.isAlphabetic0(first) || first >= 128 || first === 92)
+        return true;
+      if (first !== 45)
+        return false;
+      second = t1.peekChar$1($forward + 1);
+      if (second == null)
+        return false;
+      return second === 95 || T.isAlphabetic0(second) || second >= 128 || second === 92 || second === 45;
+    },
+    lookingAtIdentifier$0: function() {
+      return this.lookingAtIdentifier$1(null);
+    },
+    lookingAtIdentifierBody$0: function() {
+      var t1,
+        next = this.scanner.peekChar$0();
+      if (next != null)
+        t1 = next === 95 || T.isAlphabetic0(next) || next >= 128 || T.isDigit(next) || next === 45 || next === 92;
+      else
+        t1 = false;
+      return t1;
+    },
+    scanIdentifier$2$caseSensitive: function(text, caseSensitive) {
+      var t1, start, t2, cur, _this = this;
+      if (!_this.lookingAtIdentifier$0())
+        return false;
+      t1 = _this.scanner;
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      for (t2 = new H.CodeUnits(text), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        if (_this.scanIdentChar$2$caseSensitive(cur, caseSensitive))
+          continue;
+        if (start._scanner !== t1)
+          H.throwExpression(P.ArgumentError$(string$.The_gi));
+        t2 = start.position;
+        if (t2 < 0 || t2 > t1.string.length)
+          H.throwExpression(P.ArgumentError$("Invalid position " + t2));
+        t1._string_scanner$_position = t2;
+        t1._lastMatch = null;
+        return false;
+      }
+      if (!_this.lookingAtIdentifierBody$0())
+        return true;
+      t1.set$state(start);
+      return false;
+    },
+    scanIdentifier$1: function(text) {
+      return this.scanIdentifier$2$caseSensitive(text, false);
+    },
+    expectIdentifier$2$name: function(text, $name) {
+      var t1, start, t2, cur;
+      if ($name == null)
+        $name = '"' + text + '"';
+      t1 = this.scanner;
+      start = t1._string_scanner$_position;
+      for (t2 = new H.CodeUnits(text), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        if (this.scanIdentChar$2$caseSensitive(cur, false))
+          continue;
+        t1.error$2$position(0, "Expected " + $name + ".", start);
+      }
+      if (!this.lookingAtIdentifierBody$0())
+        return;
+      t1.error$2$position(0, "Expected " + $name, start);
+    },
+    expectIdentifier$1: function(text) {
+      return this.expectIdentifier$2$name(text, null);
+    },
+    rawText$1: function(consumer) {
+      var t1 = this.scanner,
+        start = t1._string_scanner$_position;
+      consumer.call$0();
+      return t1.substring$1(0, start);
+    },
+    error$2: function(_, message, span) {
+      return H.throwExpression(E.StringScannerException$(message, span, this.scanner.string));
+    },
+    withErrorMessage$1$2: function(message, callback) {
+      var error, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_SourceSpanFormatException._is(t1)) {
+          error = t1;
+          throw H.wrapException(G.SourceSpanFormatException$(message, error.get$span(), error.get$source()));
+        } else
+          throw exception;
+      }
+    },
+    withErrorMessage$2: function(message, callback) {
+      return this.withErrorMessage$1$2(message, callback, type$.dynamic);
+    },
+    wrapSpanFormatException$1$1: function(callback) {
+      var error, span, startPosition, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_SourceSpanFormatException._is(t1)) {
+          error = t1;
+          span = error.get$span();
+          if (B.startsWithIgnoreCase(error._span_exception$_message, "expected")) {
+            t1 = span;
+            t1 = t1._end - t1._file$_start === 0;
+          } else
+            t1 = false;
+          if (t1) {
+            t1 = span;
+            startPosition = this._firstNewlineBefore$1(Y.FileLocation$_(t1.file, t1._file$_start).offset);
+            t1 = span;
+            if (!J.$eq$(startPosition, Y.FileLocation$_(t1.file, t1._file$_start).offset))
+              span = span.file.span$2(startPosition, startPosition);
+          }
+          throw H.wrapException(E.SassFormatException$(error._span_exception$_message, span));
+        } else
+          throw exception;
+      }
+    },
+    wrapSpanFormatException$1: function(callback) {
+      return this.wrapSpanFormatException$1$1(callback, type$.dynamic);
+    },
+    _firstNewlineBefore$1: function(position) {
+      var t1, t2, lastNewline, codeUnit,
+        index = position - 1;
+      for (t1 = this.scanner.string, t2 = J.getInterceptor$s(t1), lastNewline = null; index >= 0;) {
+        codeUnit = t2.codeUnitAt$1(t1, index);
+        if (!(codeUnit === 32 || codeUnit === 9 || codeUnit === 10 || codeUnit === 13 || codeUnit === 12))
+          return lastNewline == null ? position : lastNewline;
+        if (codeUnit === 10 || codeUnit === 13 || codeUnit === 12)
+          lastNewline = index;
+        --index;
+      }
+      return position;
+    }
+  };
+  G.Parser__parseIdentifier_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        result = t1.identifier$0();
+      t1.scanner.expectDone$0();
+      return result;
+    },
+    $signature: 12
+  };
+  G.Parser_scanIdentChar_matches.prototype = {
+    call$1: function(actual) {
+      var t1 = this.char;
+      return this.caseSensitive ? actual === t1 : T.characterEqualsIgnoreCase(t1, actual);
+    },
+    $signature: 24
+  };
+  U.SassParser.prototype = {
+    get$currentIndentation: function() {
+      return this._currentIndentation;
+    },
+    get$indented: function() {
+      return true;
+    },
+    styleRuleSelector$0: function() {
+      var t4,
+        t1 = this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        buffer = new Z.InterpolationBuffer(t3, []);
+      do {
+        buffer.addInterpolation$1(this.almostAnyValue$1$omitComments(true));
+        t4 = t3._contents += H.Primitives_stringFromCharCode(10);
+      } while (C.JSString_methods.endsWith$1(C.JSString_methods.trimRight$0(t4.charCodeAt(0) == 0 ? t4 : t4), ",") && this.scanCharIf$1(T.character__isNewline$closure()));
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    expectStatementSeparator$1: function($name) {
+      var _this = this;
+      if (!_this.atEndOfStatement$0())
+        _this._expectNewline$0();
+      if (_this._peekIndentation$0() <= _this._currentIndentation)
+        return;
+      _this.scanner.error$2$position(0, "Nothing may be indented " + ($name == null ? "here" : "beneath a " + $name) + ".", _this._nextIndentationEnd.position);
+    },
+    expectStatementSeparator$0: function() {
+      return this.expectStatementSeparator$1(null);
+    },
+    atEndOfStatement$0: function() {
+      var next = this.scanner.peekChar$0();
+      return next == null || T.isNewline(next);
+    },
+    lookingAtChildren$0: function() {
+      return this.atEndOfStatement$0() && this._peekIndentation$0() > this._currentIndentation;
+    },
+    importArgument$0: function() {
+      var url, span, innerError, start, next, t2, exception, _this = this,
+        t1 = _this.scanner;
+      switch (t1.peekChar$0()) {
+        case 117:
+        case 85:
+          start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+          if (_this.scanIdentifier$1("url"))
+            if (t1.scanChar$1(40)) {
+              t1.set$state(start);
+              return _this.super$StylesheetParser$importArgument();
+            } else
+              t1.set$state(start);
+          break;
+        case 39:
+        case 34:
+          return _this.super$StylesheetParser$importArgument();
+      }
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      next = t1.peekChar$0();
+      while (true) {
+        if (next != null)
+          if (next !== 44)
+            if (next !== 59)
+              t2 = !(next === 10 || next === 13 || next === 12);
+            else
+              t2 = false;
+          else
+            t2 = false;
+        else
+          t2 = false;
+        if (!t2)
+          break;
+        t1.readChar$0();
+        next = t1.peekChar$0();
+      }
+      url = t1.substring$1(0, start.position);
+      span = t1.spanFrom$1(start);
+      if (_this.isPlainImportUrl$1(url))
+        return new Q.StaticImport(X.Interpolation$(H.setRuntimeTypeInfo([N.serializeValue0(new D.SassString(url, true), true, true)], type$.JSArray_legacy_Object), span), null, null, span);
+      else
+        try {
+          t1 = _this.parseImportUrl$1(url);
+          return new B.DynamicImport(t1, span);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (type$.legacy_FormatException._is(t1)) {
+            innerError = t1;
+            _this.error$2(0, "Invalid URL: " + H.S(J.get$message$x(innerError)), span);
+          } else
+            throw exception;
+        }
+    },
+    scanElse$1: function(ifIndentation) {
+      var t1, t2, startIndentation, startNextIndentation, startNextIndentationEnd, _this = this;
+      if (_this._peekIndentation$0() != ifIndentation)
+        return false;
+      t1 = _this.scanner;
+      t2 = t1._string_scanner$_position;
+      startIndentation = _this._currentIndentation;
+      startNextIndentation = _this._nextIndentation;
+      startNextIndentationEnd = _this._nextIndentationEnd;
+      _this._readIndentation$0();
+      if (t1.scanChar$1(64) && _this.scanIdentifier$1("else"))
+        return true;
+      t1.set$state(new S._SpanScannerState(t1, t2));
+      _this._currentIndentation = startIndentation;
+      _this._nextIndentation = startNextIndentation;
+      _this._nextIndentationEnd = startNextIndentationEnd;
+      return false;
+    },
+    children$1: function(_, child) {
+      var children = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Statement);
+      this._whileIndentedLower$1(new U.SassParser_children_closure(this, children, child));
+      return children;
+    },
+    statements$1: function(statement) {
+      var statements, t2, child,
+        t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first === 9 || first === 32)
+        t1.error$3$length$position(0, string$.Indent, t1._string_scanner$_position, 0);
+      statements = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Statement);
+      for (t2 = t1.string.length; t1._string_scanner$_position !== t2;) {
+        child = this._child$1(statement);
+        if (child != null)
+          statements.push(child);
+        this._readIndentation$0();
+      }
+      return statements;
+    },
+    _child$1: function(child) {
+      var _this = this,
+        t1 = _this.scanner;
+      switch (t1.peekChar$0()) {
+        case 13:
+        case 10:
+        case 12:
+          return null;
+        case 36:
+          return _this.variableDeclarationWithoutNamespace$0();
+        case 47:
+          switch (t1.peekChar$1(1)) {
+            case 47:
+              return _this._silentComment$0();
+            case 42:
+              return _this._loudComment$0();
+            default:
+              return child.call$0();
+          }
+        default:
+          return child.call$0();
+      }
+    },
+    _silentComment$0: function() {
+      var buffer, parentIndentation, t3, commentPrefix, i, t4, i0, t5, t6, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expect$1("//");
+      buffer = new P.StringBuffer("");
+      parentIndentation = _this._currentIndentation;
+      t3 = t1.string;
+      $label0$0:
+        do {
+          commentPrefix = t1.scanChar$1(47) ? "///" : "//";
+          for (i = commentPrefix.length; true;) {
+            t4 = buffer._contents += commentPrefix;
+            for (i0 = i; i0 < _this._currentIndentation - parentIndentation; ++i0) {
+              t4 += H.Primitives_stringFromCharCode(32);
+              buffer._contents = t4;
+            }
+            t5 = t3.length;
+            while (true) {
+              if (t1._string_scanner$_position !== t5) {
+                t6 = t1.peekChar$0();
+                t6 = !(t6 === 10 || t6 === 13 || t6 === 12);
+              } else
+                t6 = false;
+              if (!t6)
+                break;
+              t4 += H.Primitives_stringFromCharCode(t1.readChar$0());
+              buffer._contents = t4;
+            }
+            buffer._contents = t4 + "\n";
+            if (_this._peekIndentation$0() < parentIndentation)
+              break $label0$0;
+            if (_this._peekIndentation$0() === parentIndentation) {
+              if (t1.peekChar$1(1 + parentIndentation) === 47 && t1.peekChar$1(2 + parentIndentation) === 47)
+                _this._readIndentation$0();
+              break;
+            }
+            _this._readIndentation$0();
+          }
+        } while (t1.scan$1("//"));
+      t3 = buffer._contents;
+      return _this.lastSilentComment = new B.SilentComment(t3.charCodeAt(0) == 0 ? t3 : t3, t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _loudComment$0: function() {
+      var t3, t4, buffer, parentIndentation, t5, first, beginningOfComment, t6, end, i, t7, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expect$1("/*");
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer(t3, t4);
+      t3._contents = "/*";
+      parentIndentation = _this._currentIndentation;
+      for (t5 = t1.string, first = true; true; first = false) {
+        if (first) {
+          beginningOfComment = t1._string_scanner$_position;
+          _this.spaces$0();
+          t6 = t1.peekChar$0();
+          if (t6 === 10 || t6 === 13 || t6 === 12) {
+            _this._readIndentation$0();
+            t3._contents += H.Primitives_stringFromCharCode(32);
+          } else {
+            end = t1._string_scanner$_position;
+            t3._contents += J.substring$2$s(t5, beginningOfComment, end);
+          }
+        } else {
+          t6 = t3._contents += "\n";
+          t3._contents = t6 + " * ";
+        }
+        for (i = 3; i < _this._currentIndentation - parentIndentation; ++i)
+          t3._contents += H.Primitives_stringFromCharCode(32);
+        $label0$1:
+          for (t6 = t5.length; t1._string_scanner$_position !== t6;)
+            switch (t1.peekChar$0()) {
+              case 10:
+              case 13:
+              case 12:
+                break $label0$1;
+              case 35:
+                if (t1.peekChar$1(1) === 123) {
+                  t7 = _this.singleInterpolation$0();
+                  buffer._flushText$0();
+                  t4.push(t7);
+                } else
+                  t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+                break;
+              default:
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+                break;
+            }
+        if (_this._peekIndentation$0() <= parentIndentation)
+          break;
+        for (; _this._lookingAtDoubleNewline$0();) {
+          _this._expectNewline$0();
+          t6 = t3._contents += "\n";
+          t3._contents = t6 + " *";
+        }
+        _this._readIndentation$0();
+      }
+      t4 = t3._contents;
+      if (!C.JSString_methods.endsWith$1(C.JSString_methods.trimRight$0(t4.charCodeAt(0) == 0 ? t4 : t4), "*/"))
+        t3._contents += " */";
+      return new L.LoudComment(buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2))));
+    },
+    whitespaceWithoutComments$0: function() {
+      var t1, t2, next;
+      for (t1 = this.scanner, t2 = t1.string.length; t1._string_scanner$_position !== t2;) {
+        next = t1.peekChar$0();
+        if (next !== 9 && next !== 32)
+          break;
+        t1.readChar$0();
+      }
+    },
+    loudComment$0: function() {
+      var next,
+        t1 = this.scanner;
+      t1.expect$1("/*");
+      for (; true;) {
+        next = t1.readChar$0();
+        if (next === 10 || next === 13 || next === 12)
+          t1.error$1(0, "expected */.");
+        if (next !== 42)
+          continue;
+        do
+          next = t1.readChar$0();
+        while (next === 42);
+        if (next === 47)
+          break;
+      }
+    },
+    _expectNewline$0: function() {
+      var t1 = this.scanner;
+      switch (t1.peekChar$0()) {
+        case 59:
+          t1.error$1(0, string$.semico);
+          break;
+        case 13:
+          t1.readChar$0();
+          if (t1.peekChar$0() === 10)
+            t1.readChar$0();
+          return;
+        case 10:
+        case 12:
+          t1.readChar$0();
+          return;
+        default:
+          t1.error$1(0, "expected newline.");
+      }
+    },
+    _lookingAtDoubleNewline$0: function() {
+      var nextChar,
+        t1 = this.scanner;
+      switch (t1.peekChar$0()) {
+        case 13:
+          nextChar = t1.peekChar$1(1);
+          if (nextChar === 10)
+            return T.isNewline(t1.peekChar$1(2));
+          return nextChar === 13 || nextChar === 12;
+        case 10:
+        case 12:
+          return T.isNewline(t1.peekChar$1(1));
+        default:
+          return false;
+      }
+    },
+    _whileIndentedLower$1: function(body) {
+      var t1, t2, childIndentation, indentation, t3, t4, t5, _this = this,
+        parentIndentation = _this._currentIndentation;
+      for (t1 = _this.scanner, t2 = t1._sourceFile, childIndentation = null; _this._peekIndentation$0() > parentIndentation;) {
+        indentation = _this._readIndentation$0();
+        if (childIndentation == null)
+          childIndentation = indentation;
+        if (childIndentation != indentation) {
+          t3 = "Inconsistent indentation, expected " + H.S(childIndentation) + " spaces.";
+          t4 = t1._string_scanner$_position;
+          t5 = t2.getColumn$1(t4);
+          t1.error$3$length$position(0, t3, t2.getColumn$1(t1._string_scanner$_position), t4 - t5);
+        }
+        body.call$0();
+      }
+    },
+    _readIndentation$0: function() {
+      var _this = this;
+      if (_this._nextIndentation == null)
+        _this._peekIndentation$0();
+      _this._currentIndentation = _this._nextIndentation;
+      _this.scanner.set$state(_this._nextIndentationEnd);
+      _this._nextIndentationEnd = _this._nextIndentation = null;
+      return _this._currentIndentation;
+    },
+    _peekIndentation$0: function() {
+      var t2, t3, start, containsTab, containsSpace, next, t4, _this = this,
+        t1 = _this._nextIndentation;
+      if (t1 != null)
+        return t1;
+      t1 = _this.scanner;
+      t2 = t1._string_scanner$_position;
+      t3 = t1.string.length;
+      if (t2 === t3) {
+        _this._nextIndentation = 0;
+        _this._nextIndentationEnd = new S._SpanScannerState(t1, t2);
+        return 0;
+      }
+      start = new S._SpanScannerState(t1, t2);
+      if (!_this.scanCharIf$1(T.character__isNewline$closure()))
+        t1.error$2$position(0, "Expected newline.", t1._string_scanner$_position);
+      do {
+        _this._nextIndentation = 0;
+        for (containsTab = false, containsSpace = false; true;) {
+          next = t1.peekChar$0();
+          if (next === 32)
+            containsSpace = true;
+          else {
+            if (next !== 9)
+              break;
+            containsTab = true;
+          }
+          _this._nextIndentation = _this._nextIndentation + 1;
+          t1.readChar$0();
+        }
+        t2 = t1._string_scanner$_position;
+        if (t2 === t3) {
+          _this._nextIndentation = 0;
+          _this._nextIndentationEnd = new S._SpanScannerState(t1, t2);
+          t1.set$state(start);
+          return 0;
+        }
+      } while (_this.scanCharIf$1(T.character__isNewline$closure()));
+      if (containsTab) {
+        if (containsSpace) {
+          t2 = t1._string_scanner$_position;
+          t3 = t1._sourceFile;
+          t4 = t3.getColumn$1(t2);
+          t1.error$3$length$position(0, "Tabs and spaces may not be mixed.", t3.getColumn$1(t1._string_scanner$_position), t2 - t4);
+        } else if (_this._spaces === true) {
+          t2 = t1._string_scanner$_position;
+          t3 = t1._sourceFile;
+          t4 = t3.getColumn$1(t2);
+          t1.error$3$length$position(0, "Expected spaces, was tabs.", t3.getColumn$1(t1._string_scanner$_position), t2 - t4);
+        }
+      } else if (containsSpace && _this._spaces === false) {
+        t2 = t1._string_scanner$_position;
+        t3 = t1._sourceFile;
+        t4 = t3.getColumn$1(t2);
+        t1.error$3$length$position(0, "Expected tabs, was spaces.", t3.getColumn$1(t1._string_scanner$_position), t2 - t4);
+      }
+      if (_this._nextIndentation > 0)
+        if (_this._spaces == null)
+          _this._spaces = containsSpace;
+      _this._nextIndentationEnd = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.set$state(start);
+      return _this._nextIndentation;
+    }
+  };
+  U.SassParser_children_closure.prototype = {
+    call$0: function() {
+      this.children.push(this.$this._child$1(this.child));
+    },
+    $signature: 0
+  };
+  L.ScssParser.prototype = {
+    get$indented: function() {
+      return false;
+    },
+    get$currentIndentation: function() {
+      return null;
+    },
+    styleRuleSelector$0: function() {
+      return this.almostAnyValue$0();
+    },
+    expectStatementSeparator$1: function($name) {
+      var t1, next;
+      this.whitespaceWithoutComments$0();
+      t1 = this.scanner;
+      if (t1._string_scanner$_position === t1.string.length)
+        return;
+      next = t1.peekChar$0();
+      if (next === 59 || next === 125)
+        return;
+      t1.expectChar$1(59);
+    },
+    expectStatementSeparator$0: function() {
+      return this.expectStatementSeparator$1(null);
+    },
+    atEndOfStatement$0: function() {
+      var next = this.scanner.peekChar$0();
+      return next == null || next === 59 || next === 125 || next === 123;
+    },
+    lookingAtChildren$0: function() {
+      return this.scanner.peekChar$0() === 123;
+    },
+    scanElse$1: function(_) {
+      var t3, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      _this.whitespace$0();
+      t3 = t1._string_scanner$_position;
+      if (t1.scanChar$1(64)) {
+        if (_this.scanIdentifier$2$caseSensitive("else", true))
+          return true;
+        if (_this.scanIdentifier$2$caseSensitive("elseif", true)) {
+          _this.logger.warn$3$deprecation$span(0, string$.x40elsei, true, t1.spanFrom$1(new S._SpanScannerState(t1, t3)));
+          t1.set$position(t1._string_scanner$_position - 2);
+          return true;
+        }
+      }
+      t1.set$state(new S._SpanScannerState(t1, t2));
+      return false;
+    },
+    children$1: function(_, child) {
+      var children, _this = this,
+        t1 = _this.scanner;
+      t1.expectChar$1(123);
+      _this.whitespaceWithoutComments$0();
+      children = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Statement);
+      for (; true;)
+        switch (t1.peekChar$0()) {
+          case 36:
+            children.push(_this.variableDeclarationWithoutNamespace$0());
+            break;
+          case 47:
+            switch (t1.peekChar$1(1)) {
+              case 47:
+                children.push(_this._scss$_silentComment$0());
+                _this.whitespaceWithoutComments$0();
+                break;
+              case 42:
+                children.push(_this._scss$_loudComment$0());
+                _this.whitespaceWithoutComments$0();
+                break;
+              default:
+                children.push(child.call$0());
+                break;
+            }
+            break;
+          case 59:
+            t1.readChar$0();
+            _this.whitespaceWithoutComments$0();
+            break;
+          case 125:
+            t1.expectChar$1(125);
+            return children;
+          default:
+            children.push(child.call$0());
+            break;
+        }
+    },
+    statements$1: function(statement) {
+      var t1, t2, child, _this = this,
+        statements = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Statement);
+      _this.whitespaceWithoutComments$0();
+      for (t1 = _this.scanner, t2 = t1.string.length; t1._string_scanner$_position !== t2;)
+        switch (t1.peekChar$0()) {
+          case 36:
+            statements.push(_this.variableDeclarationWithoutNamespace$0());
+            break;
+          case 47:
+            switch (t1.peekChar$1(1)) {
+              case 47:
+                statements.push(_this._scss$_silentComment$0());
+                _this.whitespaceWithoutComments$0();
+                break;
+              case 42:
+                statements.push(_this._scss$_loudComment$0());
+                _this.whitespaceWithoutComments$0();
+                break;
+              default:
+                child = statement.call$0();
+                if (child != null)
+                  statements.push(child);
+                break;
+            }
+            break;
+          case 59:
+            t1.readChar$0();
+            _this.whitespaceWithoutComments$0();
+            break;
+          default:
+            child = statement.call$0();
+            if (child != null)
+              statements.push(child);
+            break;
+        }
+      return statements;
+    },
+    _scss$_silentComment$0: function() {
+      var t2, t3, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expect$1("//");
+      t2 = t1.string.length;
+      do {
+        while (true) {
+          if (t1._string_scanner$_position !== t2) {
+            t3 = t1.readChar$0();
+            t3 = !(t3 === 10 || t3 === 13 || t3 === 12);
+          } else
+            t3 = false;
+          if (!t3)
+            break;
+        }
+        if (t1._string_scanner$_position === t2)
+          break;
+        _this.whitespaceWithoutComments$0();
+      } while (t1.scan$1("//"));
+      if (_this.get$plainCss())
+        _this.error$2(0, string$.Silent, t1.spanFrom$1(start));
+      return _this.lastSilentComment = new B.SilentComment(t1.substring$1(0, start.position), t1.spanFrom$1(start));
+    },
+    _scss$_loudComment$0: function() {
+      var t3, t4, buffer, t5, endPosition,
+        t1 = this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expect$1("/*");
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer(t3, t4);
+      t3._contents = "/*";
+      for (; true;)
+        switch (t1.peekChar$0()) {
+          case 35:
+            if (t1.peekChar$1(1) === 123) {
+              t5 = this.singleInterpolation$0();
+              buffer._flushText$0();
+              t4.push(t5);
+            } else
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            break;
+          case 42:
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            if (t1.peekChar$0() !== 47)
+              break;
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            endPosition = t1._string_scanner$_position;
+            t3 = t1._sourceFile;
+            t4 = new S._SpanScannerState(t1, t2).position;
+            t1 = new Y._FileSpan(t3, t4, endPosition);
+            t1._FileSpan$3(t3, t4, endPosition);
+            return new L.LoudComment(buffer.interpolation$1(t1));
+          case 13:
+            t1.readChar$0();
+            if (t1.peekChar$0() !== 10)
+              t3._contents += H.Primitives_stringFromCharCode(10);
+            break;
+          case 12:
+            t1.readChar$0();
+            t3._contents += H.Primitives_stringFromCharCode(10);
+            break;
+          default:
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            break;
+        }
+    }
+  };
+  T.SelectorParser.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new T.SelectorParser_parse_closure(this));
+    },
+    parseCompoundSelector$0: function() {
+      return this.wrapSpanFormatException$1(new T.SelectorParser_parseCompoundSelector_closure(this));
+    },
+    _selectorList$0: function() {
+      var t3, t4, lineBreak, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._sourceFile,
+        previousLine = t2.getLine$1(t1._string_scanner$_position),
+        components = H.setRuntimeTypeInfo([_this._complexSelector$0()], type$.JSArray_legacy_ComplexSelector);
+      _this.whitespace$0();
+      for (t3 = t1.string; t1.scanChar$1(44);) {
+        _this.whitespace$0();
+        if (t1.peekChar$0() === 44)
+          continue;
+        t4 = t1._string_scanner$_position;
+        if (t4 === t3.length)
+          break;
+        lineBreak = t2.getLine$1(t4) != previousLine;
+        if (lineBreak)
+          previousLine = t2.getLine$1(t1._string_scanner$_position);
+        components.push(_this._complexSelector$1$lineBreak(lineBreak));
+      }
+      return D.SelectorList$(components);
+    },
+    _complexSelector$1$lineBreak: function(lineBreak) {
+      var t1, next, _this = this,
+        _s58_ = string$.x22x26__ma,
+        components = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent);
+      $label0$1:
+        for (t1 = _this.scanner; true;) {
+          _this.whitespace$0();
+          next = t1.peekChar$0();
+          switch (next) {
+            case 43:
+              t1.readChar$0();
+              components.push(C.Combinator_uzg);
+              break;
+            case 62:
+              t1.readChar$0();
+              components.push(C.Combinator_sgq);
+              break;
+            case 126:
+              t1.readChar$0();
+              components.push(C.Combinator_CzM);
+              break;
+            case 91:
+            case 46:
+            case 35:
+            case 37:
+            case 58:
+            case 38:
+            case 42:
+            case 124:
+              components.push(_this._compoundSelector$0());
+              if (t1.peekChar$0() === 38)
+                t1.error$1(0, _s58_);
+              break;
+            default:
+              if (next == null || !_this.lookingAtIdentifier$0())
+                break $label0$1;
+              components.push(_this._compoundSelector$0());
+              if (t1.peekChar$0() === 38)
+                t1.error$1(0, _s58_);
+              break;
+          }
+        }
+      if (components.length === 0)
+        t1.error$1(0, "expected selector.");
+      return S.ComplexSelector$(components, lineBreak);
+    },
+    _complexSelector$0: function() {
+      return this._complexSelector$1$lineBreak(false);
+    },
+    _compoundSelector$0: function() {
+      var t2,
+        components = H.setRuntimeTypeInfo([this._simpleSelector$0()], type$.JSArray_legacy_SimpleSelector),
+        t1 = this.scanner;
+      while (true) {
+        t2 = t1.peekChar$0();
+        if (!(t2 === 42 || t2 === 91 || t2 === 46 || t2 === 35 || t2 === 37 || t2 === 58))
+          break;
+        components.push(this._simpleSelector$1$allowParent(false));
+      }
+      return X.CompoundSelector$(components);
+    },
+    _simpleSelector$1$allowParent: function(allowParent) {
+      var $name, text, t2, suffix, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      if (allowParent == null)
+        allowParent = _this._allowParent;
+      switch (t1.peekChar$0()) {
+        case 91:
+          return _this._attributeSelector$0();
+        case 46:
+          t1.expectChar$1(46);
+          return new X.ClassSelector(_this.identifier$0());
+        case 35:
+          t1.expectChar$1(35);
+          return new N.IDSelector(_this.identifier$0());
+        case 37:
+          t1.expectChar$1(37);
+          $name = _this.identifier$0();
+          if (!_this._allowPlaceholder)
+            _this.error$2(0, string$.Placeh, t1.spanFrom$1(start));
+          return new N.PlaceholderSelector($name);
+        case 58:
+          return _this._pseudoSelector$0();
+        case 38:
+          t1.expectChar$1(38);
+          if (_this.lookingAtIdentifierBody$0()) {
+            text = new P.StringBuffer("");
+            _this._identifierBody$1(text);
+            if (text._contents.length === 0)
+              t1.error$1(0, "Expected identifier body.");
+            t2 = text._contents;
+            suffix = t2.charCodeAt(0) == 0 ? t2 : t2;
+          } else
+            suffix = null;
+          if (!allowParent)
+            _this.error$2(0, "Parent selectors aren't allowed here.", t1.spanFrom$1(start));
+          return new M.ParentSelector(suffix);
+        default:
+          return _this._typeOrUniversalSelector$0();
+      }
+    },
+    _simpleSelector$0: function() {
+      return this._simpleSelector$1$allowParent(null);
+    },
+    _attributeSelector$0: function() {
+      var $name, operator, next, value, modifier, _this = this, _null = null,
+        t1 = _this.scanner;
+      t1.expectChar$1(91);
+      _this.whitespace$0();
+      $name = _this._attributeName$0();
+      _this.whitespace$0();
+      if (t1.scanChar$1(93))
+        return new N.AttributeSelector($name, _null, _null, _null);
+      operator = _this._attributeOperator$0();
+      _this.whitespace$0();
+      next = t1.peekChar$0();
+      value = next === 39 || next === 34 ? _this.string$0() : _this.identifier$0();
+      _this.whitespace$0();
+      modifier = T.isAlphabetic0(t1.peekChar$0()) ? H.Primitives_stringFromCharCode(t1.readChar$0()) : _null;
+      t1.expectChar$1(93);
+      return new N.AttributeSelector($name, operator, value, modifier);
+    },
+    _attributeName$0: function() {
+      var nameOrNamespace, _this = this,
+        t1 = _this.scanner;
+      if (t1.scanChar$1(42)) {
+        t1.expectChar$1(124);
+        return new D.QualifiedName(_this.identifier$0(), "*");
+      }
+      nameOrNamespace = _this.identifier$0();
+      if (t1.peekChar$0() !== 124 || t1.peekChar$1(1) === 61)
+        return new D.QualifiedName(nameOrNamespace, null);
+      t1.readChar$0();
+      return new D.QualifiedName(_this.identifier$0(), nameOrNamespace);
+    },
+    _attributeOperator$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position;
+      switch (t1.readChar$0()) {
+        case 61:
+          return C.AttributeOperator_sEs;
+        case 126:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_fz1;
+        case 124:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_AuK;
+        case 94:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_4L5;
+        case 36:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_mOX;
+        case 42:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_gqZ;
+        default:
+          t1.error$2$position(0, 'Expected "]".', t2);
+      }
+    },
+    _pseudoSelector$0: function() {
+      var element, $name, unvendored, selector, argument, t2, _this = this, _null = null,
+        t1 = _this.scanner;
+      t1.expectChar$1(58);
+      element = t1.scanChar$1(58);
+      $name = _this.identifier$0();
+      if (!t1.scanChar$1(40))
+        return D.PseudoSelector$($name, _null, element, _null);
+      _this.whitespace$0();
+      unvendored = B.unvendor($name);
+      if (element)
+        if ($._selectorPseudoElements.contains$1(0, unvendored)) {
+          selector = _this._selectorList$0();
+          argument = _null;
+        } else {
+          argument = _this.declarationValue$1$allowEmpty(true);
+          selector = _null;
+        }
+      else if ($._selectorPseudoClasses.contains$1(0, unvendored)) {
+        selector = _this._selectorList$0();
+        argument = _null;
+      } else if (unvendored === "nth-child" || unvendored === "nth-last-child") {
+        argument = _this._aNPlusB$0();
+        _this.whitespace$0();
+        t2 = t1.peekChar$1(-1);
+        if ((t2 === 32 || t2 === 9 || T.isNewline(t2)) && t1.peekChar$0() !== 41) {
+          _this.expectIdentifier$1("of");
+          argument += " of";
+          _this.whitespace$0();
+          selector = _this._selectorList$0();
+        } else
+          selector = _null;
+      } else {
+        argument = C.JSString_methods.trimRight$0(_this.declarationValue$1$allowEmpty(true));
+        selector = _null;
+      }
+      t1.expectChar$1(41);
+      return D.PseudoSelector$($name, argument, element, selector);
+    },
+    _aNPlusB$0: function() {
+      var t2, first, t3, next, last, _this = this,
+        t1 = _this.scanner;
+      switch (t1.peekChar$0()) {
+        case 101:
+        case 69:
+          _this.expectIdentifier$1("even");
+          return "even";
+        case 111:
+        case 79:
+          _this.expectIdentifier$1("odd");
+          return "odd";
+        case 43:
+        case 45:
+          t2 = H.Primitives_stringFromCharCode(t1.readChar$0());
+          break;
+        default:
+          t2 = "";
+      }
+      first = t1.peekChar$0();
+      if (first != null && T.isDigit(first)) {
+        while (true) {
+          t3 = t1.peekChar$0();
+          if (!(t3 != null && t3 >= 48 && t3 <= 57))
+            break;
+          t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+        }
+        _this.whitespace$0();
+        if (!_this.scanIdentChar$1(110))
+          return t2.charCodeAt(0) == 0 ? t2 : t2;
+      } else
+        _this.expectIdentChar$1(110);
+      t2 += H.Primitives_stringFromCharCode(110);
+      _this.whitespace$0();
+      next = t1.peekChar$0();
+      if (next !== 43 && next !== 45)
+        return t2.charCodeAt(0) == 0 ? t2 : t2;
+      t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+      _this.whitespace$0();
+      last = t1.peekChar$0();
+      if (last == null || !T.isDigit(last))
+        t1.error$1(0, "Expected a number.");
+      while (true) {
+        t3 = t1.peekChar$0();
+        if (!(t3 != null && t3 >= 48 && t3 <= 57))
+          break;
+        t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+      }
+      return t2.charCodeAt(0) == 0 ? t2 : t2;
+    },
+    _typeOrUniversalSelector$0: function() {
+      var nameOrNamespace, _this = this,
+        t1 = _this.scanner,
+        first = t1.peekChar$0();
+      if (first === 42) {
+        t1.readChar$0();
+        if (!t1.scanChar$1(124))
+          return new N.UniversalSelector(null);
+        if (t1.scanChar$1(42))
+          return new N.UniversalSelector("*");
+        else
+          return new F.TypeSelector(new D.QualifiedName(_this.identifier$0(), "*"));
+      } else if (first === 124) {
+        t1.readChar$0();
+        if (t1.scanChar$1(42))
+          return new N.UniversalSelector("");
+        else
+          return new F.TypeSelector(new D.QualifiedName(_this.identifier$0(), ""));
+      }
+      nameOrNamespace = _this.identifier$0();
+      if (!t1.scanChar$1(124))
+        return new F.TypeSelector(new D.QualifiedName(nameOrNamespace, null));
+      else if (t1.scanChar$1(42))
+        return new N.UniversalSelector(nameOrNamespace);
+      else
+        return new F.TypeSelector(new D.QualifiedName(_this.identifier$0(), nameOrNamespace));
+    }
+  };
+  T.SelectorParser_parse_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        selector = t1._selectorList$0();
+      t1 = t1.scanner;
+      if (t1._string_scanner$_position !== t1.string.length)
+        t1.error$1(0, "expected selector.");
+      return selector;
+    },
+    $signature: 42
+  };
+  T.SelectorParser_parseCompoundSelector_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        compound = t1._compoundSelector$0();
+      t1 = t1.scanner;
+      if (t1._string_scanner$_position !== t1.string.length)
+        t1.error$1(0, "expected selector.");
+      return compound;
+    },
+    $signature: 264
+  };
+  V.StylesheetParser.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new V.StylesheetParser_parse_closure(this));
+    },
+    parseArgumentDeclaration$0: function() {
+      return this._parseSingleProduction$1$1(new V.StylesheetParser_parseArgumentDeclaration_closure(this), type$.legacy_ArgumentDeclaration);
+    },
+    parseVariableDeclaration$0: function() {
+      return this._parseSingleProduction$1$1(new V.StylesheetParser_parseVariableDeclaration_closure(this), type$.legacy_VariableDeclaration);
+    },
+    parseUseRule$0: function() {
+      return this._parseSingleProduction$1$1(new V.StylesheetParser_parseUseRule_closure(this), type$.legacy_UseRule);
+    },
+    _parseSingleProduction$1$1: function(production, $T) {
+      return this.wrapSpanFormatException$1(new V.StylesheetParser__parseSingleProduction_closure(this, production, $T));
+    },
+    _statement$1$root: function(root) {
+      var t2, _this = this,
+        t1 = _this.scanner;
+      switch (t1.peekChar$0()) {
+        case 64:
+          return _this.atRule$2$root(new V.StylesheetParser__statement_closure(_this), root);
+        case 43:
+          if (!_this.get$indented() || !_this.lookingAtIdentifier$1(1))
+            return _this._stylesheet$_styleRule$0();
+          _this._isUseAllowed = false;
+          t2 = t1._string_scanner$_position;
+          t1.readChar$0();
+          return _this._includeRule$1(new S._SpanScannerState(t1, t2));
+        case 61:
+          if (!_this.get$indented())
+            return _this._stylesheet$_styleRule$0();
+          _this._isUseAllowed = false;
+          t2 = t1._string_scanner$_position;
+          t1.readChar$0();
+          _this.whitespace$0();
+          return _this._mixinRule$1(new S._SpanScannerState(t1, t2));
+        case 125:
+          t1.error$2$length(0, 'unmatched "}".', 1);
+          break;
+        default:
+          return _this._inStyleRule || _this._stylesheet$_inUnknownAtRule || _this._stylesheet$_inMixin || _this._inContentBlock ? _this._declarationOrStyleRule$0() : _this._variableDeclarationOrStyleRule$0();
+      }
+    },
+    _statement$0: function() {
+      return this._statement$1$root(false);
+    },
+    _variableDeclarationWithNamespace$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position,
+        namespace = this.identifier$0();
+      t1.expectChar$1(46);
+      return this.variableDeclarationWithoutNamespace$2(namespace, new S._SpanScannerState(t1, t2));
+    },
+    variableDeclarationWithoutNamespace$2: function(namespace, start) {
+      var precedingComment, t1, $name, t2, value, flagStart, guarded, global, flag, endPosition, t3, t4, t5, declaration, _this = this, _box_0 = {};
+      _box_0.start = start;
+      precedingComment = _this.lastSilentComment;
+      _this.lastSilentComment = null;
+      if (start == null) {
+        t1 = _this.scanner;
+        _box_0.start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      }
+      $name = _this.variableName$0();
+      t1 = namespace != null;
+      if (t1)
+        _this._assertPublic$2($name, new V.StylesheetParser_variableDeclarationWithoutNamespace_closure(_box_0, _this));
+      if (_this.get$plainCss())
+        _this.error$2(0, string$.Sass_v, _this.scanner.spanFrom$1(_box_0.start));
+      _this.whitespace$0();
+      t2 = _this.scanner;
+      t2.expectChar$1(58);
+      _this.whitespace$0();
+      value = _this.expression$0();
+      flagStart = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      for (guarded = false, global = false; t2.scanChar$1(33);) {
+        flag = _this.identifier$0();
+        if (flag === "default")
+          guarded = true;
+        else if (flag === "global") {
+          if (t1) {
+            endPosition = t2._string_scanner$_position;
+            t3 = t2._sourceFile;
+            t4 = flagStart.position;
+            t5 = new Y._FileSpan(t3, t4, endPosition);
+            t5._FileSpan$3(t3, t4, endPosition);
+            _this.error$2(0, string$.x21globa, t5);
+          }
+          global = true;
+        } else {
+          endPosition = t2._string_scanner$_position;
+          t3 = t2._sourceFile;
+          t4 = flagStart.position;
+          t5 = new Y._FileSpan(t3, t4, endPosition);
+          t5._FileSpan$3(t3, t4, endPosition);
+          _this.error$2(0, "Invalid flag name.", t5);
+        }
+        _this.whitespace$0();
+        flagStart = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      }
+      _this.expectStatementSeparator$1("variable declaration");
+      declaration = Z.VariableDeclaration$($name, value, t2.spanFrom$1(_box_0.start), precedingComment, global, guarded, namespace);
+      if (global)
+        _this._globalVariables.putIfAbsent$2($name, new V.StylesheetParser_variableDeclarationWithoutNamespace_closure0(declaration));
+      return declaration;
+    },
+    variableDeclarationWithoutNamespace$0: function() {
+      return this.variableDeclarationWithoutNamespace$2(null, null);
+    },
+    _variableDeclarationOrStyleRule$0: function() {
+      var t1, t2, variableOrInterpolation, t3, _this = this;
+      if (_this.get$plainCss())
+        return _this._stylesheet$_styleRule$0();
+      if (_this.get$indented() && _this.scanner.scanChar$1(92))
+        return _this._stylesheet$_styleRule$0();
+      if (!_this.lookingAtIdentifier$0())
+        return _this._stylesheet$_styleRule$0();
+      t1 = _this.scanner;
+      t2 = t1._string_scanner$_position;
+      variableOrInterpolation = _this._variableDeclarationOrInterpolation$0();
+      if (variableOrInterpolation instanceof Z.VariableDeclaration)
+        return variableOrInterpolation;
+      else {
+        t3 = new Z.InterpolationBuffer(new P.StringBuffer(""), []);
+        t3.addInterpolation$1(type$.legacy_Interpolation._as(variableOrInterpolation));
+        return _this._stylesheet$_styleRule$2(t3, new S._SpanScannerState(t1, t2));
+      }
+    },
+    _declarationOrStyleRule$0: function() {
+      var t1, t2, declarationOrBuffer, _this = this;
+      if (_this.get$plainCss() && _this._inStyleRule && !_this._stylesheet$_inUnknownAtRule)
+        return _this._propertyOrVariableDeclaration$0();
+      if (_this.get$indented() && _this.scanner.scanChar$1(92))
+        return _this._stylesheet$_styleRule$0();
+      t1 = _this.scanner;
+      t2 = t1._string_scanner$_position;
+      declarationOrBuffer = _this._declarationOrBuffer$0();
+      return type$.legacy_Statement._is(declarationOrBuffer) ? declarationOrBuffer : _this._stylesheet$_styleRule$2(type$.legacy_InterpolationBuffer._as(declarationOrBuffer), new S._SpanScannerState(t1, t2));
+    },
+    _declarationOrBuffer$0: function() {
+      var midBuffer, couldBeSelector, beforeDeclaration, additional, t3, startsWithPunctuation, variableOrInterpolation, t4, $name, postColonWhitespace, t5, value, exception, _this = this, t1 = {},
+        t2 = _this.scanner,
+        start = new S._SpanScannerState(t2, t2._string_scanner$_position),
+        nameBuffer = new Z.InterpolationBuffer(new P.StringBuffer(""), []),
+        first = t2.peekChar$0();
+      if (first !== 58)
+        if (first !== 42)
+          if (first !== 46)
+            t3 = first === 35 && t2.peekChar$1(1) !== 123;
+          else
+            t3 = true;
+        else
+          t3 = true;
+      else
+        t3 = true;
+      if (t3) {
+        t3 = t2.readChar$0();
+        nameBuffer._interpolation_buffer$_text._contents += H.Primitives_stringFromCharCode(t3);
+        t3 = _this.rawText$1(_this.get$whitespace());
+        nameBuffer._interpolation_buffer$_text._contents += t3;
+        startsWithPunctuation = true;
+      } else
+        startsWithPunctuation = false;
+      if (!_this._lookingAtInterpolatedIdentifier$0())
+        return nameBuffer;
+      variableOrInterpolation = startsWithPunctuation ? _this.interpolatedIdentifier$0() : _this._variableDeclarationOrInterpolation$0();
+      if (variableOrInterpolation instanceof Z.VariableDeclaration)
+        return variableOrInterpolation;
+      else
+        nameBuffer.addInterpolation$1(type$.legacy_Interpolation._as(variableOrInterpolation));
+      _this._isUseAllowed = false;
+      if (t2.matches$1("/*")) {
+        t3 = _this.rawText$1(_this.get$loudComment());
+        nameBuffer._interpolation_buffer$_text._contents += t3;
+      }
+      midBuffer = new P.StringBuffer("");
+      t3 = _this.get$whitespace();
+      midBuffer._contents += _this.rawText$1(t3);
+      t4 = t2._string_scanner$_position;
+      if (!t2.scanChar$1(58)) {
+        if (midBuffer._contents.length !== 0)
+          nameBuffer._interpolation_buffer$_text._contents += H.Primitives_stringFromCharCode(32);
+        return nameBuffer;
+      }
+      midBuffer._contents += H.Primitives_stringFromCharCode(58);
+      $name = nameBuffer.interpolation$1(t2.spanFrom$2(start, new S._SpanScannerState(t2, t4)));
+      if (C.JSString_methods.startsWith$1($name.get$initialPlain(), "--")) {
+        t1 = _this._interpolatedDeclarationValue$0();
+        _this.expectStatementSeparator$1("custom property");
+        return L.Declaration$($name, t2.spanFrom$1(start), null, new D.StringExpression(t1, false));
+      }
+      if (t2.scanChar$1(58)) {
+        t1 = nameBuffer;
+        t2 = t1._interpolation_buffer$_text;
+        t2._contents += H.S(midBuffer);
+        t2._contents += H.Primitives_stringFromCharCode(58);
+        return t1;
+      } else if (_this.get$indented() && _this._lookingAtInterpolatedIdentifier$0()) {
+        t1 = nameBuffer;
+        t1._interpolation_buffer$_text._contents += H.S(midBuffer);
+        return t1;
+      }
+      postColonWhitespace = _this.rawText$1(t3);
+      if (_this.lookingAtChildren$0())
+        return _this._withChildren$3(_this.get$_declarationChild(), start, new V.StylesheetParser__declarationOrBuffer_closure($name));
+      midBuffer._contents += postColonWhitespace;
+      couldBeSelector = postColonWhitespace.length === 0 && _this._lookingAtInterpolatedIdentifier$0();
+      beforeDeclaration = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      t1.value = null;
+      try {
+        if (_this.lookingAtChildren$0()) {
+          t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
+          t4 = Y.FileLocation$_(t2._sourceFile, t2._string_scanner$_position);
+          t5 = t4.offset;
+          value = new D.StringExpression(X.Interpolation$(t3, Y._FileSpan$(t4.file, t5, t5)), true);
+        } else
+          value = _this.expression$0();
+        t3 = t1.value = value;
+        if (_this.lookingAtChildren$0()) {
+          if (couldBeSelector)
+            _this.expectStatementSeparator$0();
+        } else if (!_this.atEndOfStatement$0())
+          _this.expectStatementSeparator$0();
+      } catch (exception) {
+        if (type$.legacy_FormatException._is(H.unwrapException(exception))) {
+          if (!couldBeSelector)
+            throw exception;
+          t2.set$state(beforeDeclaration);
+          additional = _this.almostAnyValue$0();
+          if (!_this.get$indented() && t2.peekChar$0() === 59)
+            throw exception;
+          nameBuffer._interpolation_buffer$_text._contents += H.S(midBuffer);
+          nameBuffer.addInterpolation$1(additional);
+          return nameBuffer;
+        } else
+          throw exception;
+      }
+      if (_this.lookingAtChildren$0())
+        return _this._withChildren$3(_this.get$_declarationChild(), start, new V.StylesheetParser__declarationOrBuffer_closure0(t1, $name));
+      else {
+        _this.expectStatementSeparator$0();
+        return L.Declaration$($name, t2.spanFrom$1(start), null, t3);
+      }
+    },
+    _variableDeclarationOrInterpolation$0: function() {
+      var t1, start, identifier, t2, buffer, _this = this;
+      if (!_this.lookingAtIdentifier$0())
+        return _this.interpolatedIdentifier$0();
+      t1 = _this.scanner;
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      identifier = _this.identifier$0();
+      if (t1.matches$1(".$")) {
+        t1.readChar$0();
+        return _this.variableDeclarationWithoutNamespace$2(identifier, start);
+      } else {
+        t2 = new P.StringBuffer("");
+        buffer = new Z.InterpolationBuffer(t2, []);
+        t2._contents = identifier;
+        if (_this._lookingAtInterpolatedIdentifierBody$0())
+          buffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+        return buffer.interpolation$1(t1.spanFrom$1(start));
+      }
+    },
+    _stylesheet$_styleRule$2: function(buffer, start) {
+      var t2, interpolation, t3, wasInStyleRule, _this = this, t1 = {};
+      t1.start = start;
+      _this._isUseAllowed = false;
+      if (start == null) {
+        t2 = _this.scanner;
+        t2 = t1.start = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      } else
+        t2 = start;
+      interpolation = t1.interpolation = _this.styleRuleSelector$0();
+      if (buffer != null) {
+        buffer.addInterpolation$1(interpolation);
+        t3 = t1.interpolation = buffer.interpolation$1(_this.scanner.spanFrom$1(t2));
+      } else
+        t3 = interpolation;
+      if (t3.contents.length === 0)
+        _this.scanner.error$1(0, 'expected "}".');
+      wasInStyleRule = _this._inStyleRule;
+      _this._inStyleRule = true;
+      return _this._withChildren$3(_this.get$_statement(), t2, new V.StylesheetParser__styleRule_closure(t1, _this, wasInStyleRule));
+    },
+    _stylesheet$_styleRule$0: function() {
+      return this._stylesheet$_styleRule$2(null, null);
+    },
+    _propertyOrVariableDeclaration$1$parseCustomProperties: function(parseCustomProperties) {
+      var first, t3, nameBuffer, variableOrInterpolation, $name, value, _this = this,
+        _s48_ = string$.Nested,
+        t1 = {},
+        t2 = _this.scanner,
+        start = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      t1.name = null;
+      first = t2.peekChar$0();
+      if (first !== 58)
+        if (first !== 42)
+          if (first !== 46)
+            t3 = first === 35 && t2.peekChar$1(1) !== 123;
+          else
+            t3 = true;
+        else
+          t3 = true;
+      else
+        t3 = true;
+      if (t3) {
+        t3 = new P.StringBuffer("");
+        nameBuffer = new Z.InterpolationBuffer(t3, []);
+        t3._contents += H.Primitives_stringFromCharCode(t2.readChar$0());
+        t3._contents += _this.rawText$1(_this.get$whitespace());
+        nameBuffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+        t3 = t1.name = nameBuffer.interpolation$1(t2.spanFrom$1(start));
+      } else if (!_this.get$plainCss()) {
+        variableOrInterpolation = _this._variableDeclarationOrInterpolation$0();
+        if (variableOrInterpolation instanceof Z.VariableDeclaration)
+          return variableOrInterpolation;
+        else {
+          type$.legacy_Interpolation._as(variableOrInterpolation);
+          t1.name = variableOrInterpolation;
+        }
+        t3 = variableOrInterpolation;
+      } else {
+        $name = _this.interpolatedIdentifier$0();
+        t1.name = $name;
+        t3 = $name;
+      }
+      _this.whitespace$0();
+      t2.expectChar$1(58);
+      if (parseCustomProperties && C.JSString_methods.startsWith$1(t3.get$initialPlain(), "--")) {
+        t1 = _this._interpolatedDeclarationValue$0();
+        _this.expectStatementSeparator$1("custom property");
+        return L.Declaration$(t3, t2.spanFrom$1(start), null, new D.StringExpression(t1, false));
+      }
+      _this.whitespace$0();
+      if (_this.lookingAtChildren$0()) {
+        if (_this.get$plainCss())
+          t2.error$1(0, _s48_);
+        return _this._withChildren$3(_this.get$_declarationChild(), start, new V.StylesheetParser__propertyOrVariableDeclaration_closure(t1));
+      }
+      value = _this.expression$0();
+      if (_this.lookingAtChildren$0()) {
+        if (_this.get$plainCss())
+          t2.error$1(0, _s48_);
+        return _this._withChildren$3(_this.get$_declarationChild(), start, new V.StylesheetParser__propertyOrVariableDeclaration_closure0(t1, value));
+      } else {
+        _this.expectStatementSeparator$0();
+        return L.Declaration$(t3, t2.spanFrom$1(start), null, value);
+      }
+    },
+    _propertyOrVariableDeclaration$0: function() {
+      return this._propertyOrVariableDeclaration$1$parseCustomProperties(true);
+    },
+    _declarationChild$0: function() {
+      if (this.scanner.peekChar$0() === 64)
+        return this._declarationAtRule$0();
+      return this._propertyOrVariableDeclaration$1$parseCustomProperties(false);
+    },
+    atRule$2$root: function(child, root) {
+      var $name, wasUseAllowed, value, optional, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expectChar$2$name(64, "@-rule");
+      $name = _this.interpolatedIdentifier$0();
+      _this.whitespace$0();
+      wasUseAllowed = _this._isUseAllowed;
+      _this._isUseAllowed = false;
+      switch ($name.get$asPlain()) {
+        case "at-root":
+          return _this._atRootRule$1(start);
+        case "charset":
+          _this._isUseAllowed = wasUseAllowed;
+          if (!root)
+            _this._disallowedAtRule$1(start);
+          _this.string$0();
+          return null;
+        case "content":
+          return _this._contentRule$1(start);
+        case "debug":
+          return _this._debugRule$1(start);
+        case "each":
+          return _this._eachRule$2(start, child);
+        case "else":
+          return _this._disallowedAtRule$1(start);
+        case "error":
+          return _this._errorRule$1(start);
+        case "extend":
+          if (!_this._inStyleRule && !_this._stylesheet$_inMixin && !_this._inContentBlock)
+            _this.error$2(0, string$.x40exten, t1.spanFrom$1(start));
+          value = _this.almostAnyValue$0();
+          optional = t1.scanChar$1(33);
+          if (optional)
+            _this.expectIdentifier$1("optional");
+          _this.expectStatementSeparator$1("@extend rule");
+          return new X.ExtendRule(value, optional, t1.spanFrom$1(start));
+        case "for":
+          return _this._forRule$2(start, child);
+        case "forward":
+          _this._isUseAllowed = wasUseAllowed;
+          if (!root)
+            _this._disallowedAtRule$1(start);
+          return _this._forwardRule$1(start);
+        case "function":
+          return _this._functionRule$1(start);
+        case "if":
+          return _this._ifRule$2(start, child);
+        case "import":
+          return _this._importRule$1(start);
+        case "include":
+          return _this._includeRule$1(start);
+        case "media":
+          return _this.mediaRule$1(start);
+        case "mixin":
+          return _this._mixinRule$1(start);
+        case "-moz-document":
+          return _this.mozDocumentRule$2(start, $name);
+        case "return":
+          return _this._disallowedAtRule$1(start);
+        case "supports":
+          return _this.supportsRule$1(start);
+        case "use":
+          _this._isUseAllowed = wasUseAllowed;
+          if (!root)
+            _this._disallowedAtRule$1(start);
+          return _this._useRule$1(start);
+        case "warn":
+          return _this._warnRule$1(start);
+        case "while":
+          return _this._whileRule$2(start, child);
+        default:
+          return _this.unknownAtRule$2(start, $name);
+      }
+    },
+    _declarationAtRule$0: function() {
+      var _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      switch (_this._plainAtRuleName$0()) {
+        case "content":
+          return _this._contentRule$1(start);
+        case "debug":
+          return _this._debugRule$1(start);
+        case "each":
+          return _this._eachRule$2(start, _this.get$_declarationChild());
+        case "else":
+          return _this._disallowedAtRule$1(start);
+        case "error":
+          return _this._errorRule$1(start);
+        case "for":
+          return _this._forRule$2(start, _this.get$_declarationAtRule());
+        case "if":
+          return _this._ifRule$2(start, _this.get$_declarationChild());
+        case "include":
+          return _this._includeRule$1(start);
+        case "warn":
+          return _this._warnRule$1(start);
+        case "while":
+          return _this._whileRule$2(start, _this.get$_declarationChild());
+        default:
+          return _this._disallowedAtRule$1(start);
+      }
+    },
+    _functionChild$0: function() {
+      var state, variableDeclarationError, statement, t2, exception, t3, start, value, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() !== 64) {
+        state = new S._SpanScannerState(t1, t1._string_scanner$_position);
+        try {
+          t2 = _this._variableDeclarationWithNamespace$0();
+          return t2;
+        } catch (exception) {
+          t2 = H.unwrapException(exception);
+          t3 = type$.legacy_SourceSpanFormatException;
+          if (t3._is(t2)) {
+            variableDeclarationError = t2;
+            t1.set$state(state);
+            statement = null;
+            try {
+              statement = _this._declarationOrStyleRule$0();
+            } catch (exception) {
+              if (t3._is(H.unwrapException(exception)))
+                throw H.wrapException(variableDeclarationError);
+              else
+                throw exception;
+            }
+            _this.error$2(0, "@function rules may not contain " + (statement instanceof X.StyleRule ? "style rules" : "declarations") + ".", statement.get$span());
+          } else
+            throw exception;
+        }
+      }
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      switch (_this._plainAtRuleName$0()) {
+        case "debug":
+          return _this._debugRule$1(start);
+        case "each":
+          return _this._eachRule$2(start, _this.get$_functionChild());
+        case "else":
+          return _this._disallowedAtRule$1(start);
+        case "error":
+          return _this._errorRule$1(start);
+        case "for":
+          return _this._forRule$2(start, _this.get$_functionChild());
+        case "if":
+          return _this._ifRule$2(start, _this.get$_functionChild());
+        case "return":
+          value = _this.expression$0();
+          _this.expectStatementSeparator$1("@return rule");
+          return new B.ReturnRule(value, t1.spanFrom$1(start));
+        case "warn":
+          return _this._warnRule$1(start);
+        case "while":
+          return _this._whileRule$2(start, _this.get$_functionChild());
+        default:
+          return _this._disallowedAtRule$1(start);
+      }
+    },
+    _plainAtRuleName$0: function() {
+      this.scanner.expectChar$2$name(64, "@-rule");
+      var $name = this.identifier$0();
+      this.whitespace$0();
+      return $name;
+    },
+    _atRootRule$1: function(start) {
+      var query, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() === 40) {
+        query = _this._atRootQuery$0();
+        _this.whitespace$0();
+        return _this._withChildren$3(_this.get$_statement(), start, new V.StylesheetParser__atRootRule_closure(query));
+      } else if (_this.lookingAtChildren$0())
+        return _this._withChildren$3(_this.get$_statement(), start, new V.StylesheetParser__atRootRule_closure0());
+      else
+        return V.AtRootRule$(H.setRuntimeTypeInfo([_this._stylesheet$_styleRule$0()], type$.JSArray_legacy_Statement), t1.spanFrom$1(start), null);
+    },
+    _atRootQuery$0: function() {
+      var interpolation, t2, t3, t4, buffer, t5, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() === 35) {
+        interpolation = _this.singleInterpolation$0();
+        return X.Interpolation$(H.setRuntimeTypeInfo([interpolation], type$.JSArray_legacy_Object), interpolation.get$span());
+      }
+      t2 = t1._string_scanner$_position;
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer(t3, t4);
+      t1.expectChar$1(40);
+      t3._contents += H.Primitives_stringFromCharCode(40);
+      _this.whitespace$0();
+      t5 = _this.expression$0();
+      buffer._flushText$0();
+      t4.push(t5);
+      if (t1.scanChar$1(58)) {
+        _this.whitespace$0();
+        t3._contents += H.Primitives_stringFromCharCode(58);
+        t3._contents += H.Primitives_stringFromCharCode(32);
+        t5 = _this.expression$0();
+        buffer._flushText$0();
+        t4.push(t5);
+      }
+      t1.expectChar$1(41);
+      _this.whitespace$0();
+      t3._contents += H.Primitives_stringFromCharCode(41);
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _contentRule$1: function(start) {
+      var t1, $arguments, t2, t3, _this = this;
+      if (!_this._stylesheet$_inMixin)
+        _this.error$2(0, string$.x40conte, _this.scanner.spanFrom$1(start));
+      _this.whitespace$0();
+      t1 = _this.scanner;
+      if (t1.peekChar$0() === 40)
+        $arguments = _this._argumentInvocation$1$mixin(true);
+      else {
+        t2 = Y.FileLocation$_(t1._sourceFile, t1._string_scanner$_position);
+        t3 = t2.offset;
+        $arguments = X.ArgumentInvocation$empty(Y._FileSpan$(t2.file, t3, t3));
+      }
+      _this._mixinHasContent = true;
+      _this.expectStatementSeparator$1("@content rule");
+      return new Q.ContentRule(t1.spanFrom$1(start), $arguments);
+    },
+    _debugRule$1: function(start) {
+      var value = this.expression$0();
+      this.expectStatementSeparator$1("@debug rule");
+      return new Q.DebugRule(value, this.scanner.spanFrom$1(start));
+    },
+    _eachRule$2: function(start, child) {
+      var variables, t1, _this = this,
+        wasInControlDirective = _this._inControlDirective;
+      _this._inControlDirective = true;
+      variables = H.setRuntimeTypeInfo([_this.variableName$0()], type$.JSArray_legacy_String);
+      _this.whitespace$0();
+      for (t1 = _this.scanner; t1.scanChar$1(44);) {
+        _this.whitespace$0();
+        t1.expectChar$1(36);
+        variables.push(_this.identifier$1$normalize(true));
+        _this.whitespace$0();
+      }
+      _this.expectIdentifier$1("in");
+      _this.whitespace$0();
+      return _this._withChildren$3(child, start, new V.StylesheetParser__eachRule_closure(_this, wasInControlDirective, variables, _this.expression$0()));
+    },
+    _errorRule$1: function(start) {
+      var value = this.expression$0();
+      this.expectStatementSeparator$1("@error rule");
+      return new D.ErrorRule(value, this.scanner.spanFrom$1(start));
+    },
+    _functionRule$1: function(start) {
+      var $name, $arguments, _this = this,
+        precedingComment = _this.lastSilentComment;
+      _this.lastSilentComment = null;
+      $name = _this.identifier$1$normalize(true);
+      _this.whitespace$0();
+      $arguments = _this._argumentDeclaration$0();
+      if (_this._stylesheet$_inMixin || _this._inContentBlock)
+        _this.error$2(0, string$.Mixinscf, _this.scanner.spanFrom$1(start));
+      else if (_this._inControlDirective)
+        _this.error$2(0, string$.Functi, _this.scanner.spanFrom$1(start));
+      switch (B.unvendor($name)) {
+        case "calc":
+        case "element":
+        case "expression":
+        case "url":
+        case "and":
+        case "or":
+        case "not":
+        case "clamp":
+          _this.error$2(0, "Invalid function name.", _this.scanner.spanFrom$1(start));
+          break;
+      }
+      _this.whitespace$0();
+      return _this._withChildren$3(_this.get$_functionChild(), start, new V.StylesheetParser__functionRule_closure($name, $arguments, precedingComment));
+    },
+    _forRule$2: function(start, child) {
+      var variable, from, _this = this, t1 = {},
+        wasInControlDirective = _this._inControlDirective;
+      _this._inControlDirective = true;
+      variable = _this.variableName$0();
+      _this.whitespace$0();
+      _this.expectIdentifier$1("from");
+      _this.whitespace$0();
+      t1.exclusive = null;
+      from = _this.expression$1$until(new V.StylesheetParser__forRule_closure(t1, _this));
+      if (t1.exclusive == null)
+        _this.scanner.error$1(0, 'Expected "to" or "through".');
+      _this.whitespace$0();
+      return _this._withChildren$3(child, start, new V.StylesheetParser__forRule_closure0(t1, _this, wasInControlDirective, variable, from, _this.expression$0()));
+    },
+    _forwardRule$1: function(start) {
+      var prefix, members, shownMixinsAndFunctions, shownVariables, hiddenVariables, hiddenMixinsAndFunctions, configuration, span, t1, t2, t3, t4, _this = this, _null = null,
+        url = _this._urlString$0();
+      _this.whitespace$0();
+      if (_this.scanIdentifier$1("as")) {
+        _this.whitespace$0();
+        prefix = _this.identifier$1$normalize(true);
+        _this.scanner.expectChar$1(42);
+        _this.whitespace$0();
+      } else
+        prefix = _null;
+      if (_this.scanIdentifier$1("show")) {
+        members = _this._memberList$0();
+        shownMixinsAndFunctions = members.item1;
+        shownVariables = members.item2;
+        hiddenVariables = _null;
+        hiddenMixinsAndFunctions = hiddenVariables;
+      } else {
+        if (_this.scanIdentifier$1("hide")) {
+          members = _this._memberList$0();
+          hiddenMixinsAndFunctions = members.item1;
+          hiddenVariables = members.item2;
+        } else {
+          hiddenVariables = _null;
+          hiddenMixinsAndFunctions = hiddenVariables;
+        }
+        shownVariables = _null;
+        shownMixinsAndFunctions = shownVariables;
+      }
+      configuration = _this._stylesheet$_configuration$1$allowGuarded(true);
+      _this.expectStatementSeparator$1("@forward rule");
+      span = _this.scanner.spanFrom$1(start);
+      if (!_this._isUseAllowed)
+        _this.error$2(0, string$.x40forwa, span);
+      if (shownMixinsAndFunctions != null) {
+        t1 = type$.legacy_String;
+        t2 = P.LinkedHashSet_LinkedHashSet$of(shownMixinsAndFunctions, t1);
+        t3 = type$.UnmodifiableSetView_legacy_String;
+        t1 = P.LinkedHashSet_LinkedHashSet$of(shownVariables, t1);
+        t4 = configuration == null ? C.List_empty6 : P.List_List$unmodifiable(configuration, type$.legacy_ConfiguredVariable);
+        return new L.ForwardRule(url, new L.UnmodifiableSetView(t2, t3), new L.UnmodifiableSetView(t1, t3), _null, _null, prefix, t4, span);
+      } else if (hiddenMixinsAndFunctions != null) {
+        t1 = type$.legacy_String;
+        t2 = P.LinkedHashSet_LinkedHashSet$of(hiddenMixinsAndFunctions, t1);
+        t3 = type$.UnmodifiableSetView_legacy_String;
+        t1 = P.LinkedHashSet_LinkedHashSet$of(hiddenVariables, t1);
+        t4 = configuration == null ? C.List_empty6 : P.List_List$unmodifiable(configuration, type$.legacy_ConfiguredVariable);
+        return new L.ForwardRule(url, _null, _null, new L.UnmodifiableSetView(t2, t3), new L.UnmodifiableSetView(t1, t3), prefix, t4, span);
+      } else
+        return new L.ForwardRule(url, _null, _null, _null, _null, prefix, configuration == null ? C.List_empty6 : P.List_List$unmodifiable(configuration, type$.legacy_ConfiguredVariable), span);
+    },
+    _memberList$0: function() {
+      var _this = this,
+        t1 = type$.legacy_String,
+        identifiers = P.LinkedHashSet_LinkedHashSet$_empty(t1),
+        variables = P.LinkedHashSet_LinkedHashSet$_empty(t1);
+      t1 = _this.scanner;
+      do {
+        _this.whitespace$0();
+        _this.withErrorMessage$2(string$.Expect, new V.StylesheetParser__memberList_closure(_this, variables, identifiers));
+        _this.whitespace$0();
+      } while (t1.scanChar$1(44));
+      return new S.Tuple2(identifiers, variables, type$.Tuple2_of_legacy_Set_legacy_String_and_legacy_Set_legacy_String);
+    },
+    _ifRule$2: function(start, child) {
+      var condition, children, clauses, lastClause, span, _this = this,
+        ifIndentation = _this.get$currentIndentation(),
+        wasInControlDirective = _this._inControlDirective;
+      _this._inControlDirective = true;
+      condition = _this.expression$0();
+      children = _this.children$1(0, child);
+      _this.whitespaceWithoutComments$0();
+      clauses = H.setRuntimeTypeInfo([V.IfClause$(condition, children)], type$.JSArray_legacy_IfClause);
+      while (true) {
+        if (!_this.scanElse$1(ifIndentation)) {
+          lastClause = null;
+          break;
+        }
+        _this.whitespace$0();
+        if (_this.scanIdentifier$1("if")) {
+          _this.whitespace$0();
+          clauses.push(V.IfClause$(_this.expression$0(), _this.children$1(0, child)));
+        } else {
+          lastClause = V.IfClause$last(_this.children$1(0, child));
+          break;
+        }
+      }
+      _this._inControlDirective = wasInControlDirective;
+      span = _this.scanner.spanFrom$1(start);
+      _this.whitespaceWithoutComments$0();
+      return new V.IfRule(P.List_List$unmodifiable(clauses, type$.legacy_IfClause), lastClause, span);
+    },
+    _importRule$1: function(start) {
+      var argument, _this = this,
+        imports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Import),
+        t1 = _this.scanner;
+      do {
+        _this.whitespace$0();
+        argument = _this.importArgument$0();
+        if ((_this._inControlDirective || _this._stylesheet$_inMixin) && argument instanceof B.DynamicImport)
+          _this._disallowedAtRule$1(start);
+        imports.push(argument);
+        _this.whitespace$0();
+      } while (t1.scanChar$1(44));
+      _this.expectStatementSeparator$1("@import rule");
+      t1 = t1.spanFrom$1(start);
+      return new B.ImportRule(P.List_List$unmodifiable(imports, type$.legacy_Import), t1);
+    },
+    importArgument$0: function() {
+      var url, urlSpan, innerError, queries, t2, t3, t4, exception, _this = this, _null = null,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        next = t1.peekChar$0();
+      if (next === 117 || next === 85) {
+        url = _this.dynamicUrl$0();
+        _this.whitespace$0();
+        queries = _this.tryImportQueries$0();
+        t2 = X.Interpolation$(H.setRuntimeTypeInfo([url], type$.JSArray_legacy_Object), t1.spanFrom$1(start));
+        t1 = t1.spanFrom$1(start);
+        t3 = queries == null;
+        t4 = t3 ? _null : queries.item1;
+        return new Q.StaticImport(t2, t4, t3 ? _null : queries.item2, t1);
+      }
+      url = _this.string$0();
+      urlSpan = t1.spanFrom$1(start);
+      _this.whitespace$0();
+      queries = _this.tryImportQueries$0();
+      if (_this.isPlainImportUrl$1(url) || queries != null) {
+        t2 = urlSpan;
+        t2 = X.Interpolation$(H.setRuntimeTypeInfo([P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t2.file._decodedChars, t2._file$_start, t2._end), 0, _null)], type$.JSArray_legacy_Object), urlSpan);
+        t1 = t1.spanFrom$1(start);
+        t3 = queries == null;
+        t4 = t3 ? _null : queries.item1;
+        return new Q.StaticImport(t2, t4, t3 ? _null : queries.item2, t1);
+      } else
+        try {
+          t1 = _this.parseImportUrl$1(url);
+          return new B.DynamicImport(t1, urlSpan);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (type$.legacy_FormatException._is(t1)) {
+            innerError = t1;
+            _this.error$2(0, "Invalid URL: " + H.S(J.get$message$x(innerError)), urlSpan);
+          } else
+            throw exception;
+        }
+    },
+    parseImportUrl$1: function(url) {
+      var t1 = $.$get$windows();
+      if (t1.style.rootLength$1(url) > 0)
+        return t1.toUri$1(url).toString$0(0);
+      P.Uri_parse(url);
+      return url;
+    },
+    isPlainImportUrl$1: function(url) {
+      var first;
+      if (url.length < 5)
+        return false;
+      if (C.JSString_methods.endsWith$1(url, ".css"))
+        return true;
+      first = C.JSString_methods._codeUnitAt$1(url, 0);
+      if (first === 47)
+        return C.JSString_methods._codeUnitAt$1(url, 1) === 47;
+      if (first !== 104)
+        return false;
+      return C.JSString_methods.startsWith$1(url, "http://") || C.JSString_methods.startsWith$1(url, "https://");
+    },
+    tryImportQueries$0: function() {
+      var t1, start, supports, $name, media, _this = this;
+      if (_this.scanIdentifier$1("supports")) {
+        t1 = _this.scanner;
+        t1.expectChar$1(40);
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+        if (_this.scanIdentifier$1("not")) {
+          _this.whitespace$0();
+          supports = new M.SupportsNegation(_this._supportsConditionInParens$0(), t1.spanFrom$1(start));
+        } else if (t1.peekChar$0() === 40)
+          supports = _this._supportsCondition$0();
+        else {
+          $name = _this.expression$0();
+          t1.expectChar$1(58);
+          _this.whitespace$0();
+          supports = new L.SupportsDeclaration($name, _this.expression$0(), t1.spanFrom$1(start));
+        }
+        t1.expectChar$1(41);
+        _this.whitespace$0();
+      } else
+        supports = null;
+      media = _this._lookingAtInterpolatedIdentifier$0() || _this.scanner.peekChar$0() === 40 ? _this._mediaQueryList$0() : null;
+      if (supports == null && media == null)
+        return null;
+      return new S.Tuple2(supports, media, type$.Tuple2_of_legacy_SupportsCondition_and_legacy_Interpolation);
+    },
+    _includeRule$1: function(start) {
+      var name0, namespace, $arguments, t3, t4, wasInContentBlock, $content, _this = this, _null = null, t1 = {},
+        $name = _this.identifier$0(),
+        t2 = _this.scanner;
+      if (t2.scanChar$1(46)) {
+        name0 = _this._publicIdentifier$0();
+        namespace = $name;
+        $name = name0;
+      } else {
+        $name = H.stringReplaceAllUnchecked($name, "_", "-");
+        namespace = _null;
+      }
+      _this.whitespace$0();
+      if (t2.peekChar$0() === 40)
+        $arguments = _this._argumentInvocation$1$mixin(true);
+      else {
+        t3 = Y.FileLocation$_(t2._sourceFile, t2._string_scanner$_position);
+        t4 = t3.offset;
+        $arguments = X.ArgumentInvocation$empty(Y._FileSpan$(t3.file, t4, t4));
+      }
+      _this.whitespace$0();
+      t1.contentArguments = null;
+      if (_this.scanIdentifier$1("using")) {
+        _this.whitespace$0();
+        t3 = t1.contentArguments = _this._argumentDeclaration$0();
+        _this.whitespace$0();
+      } else
+        t3 = _null;
+      t3 = t3 == null;
+      if (!t3 || _this.lookingAtChildren$0()) {
+        if (t3) {
+          t3 = Y.FileLocation$_(t2._sourceFile, t2._string_scanner$_position);
+          t4 = t3.offset;
+          t1.contentArguments = new B.ArgumentDeclaration(C.List_empty8, _null, Y._FileSpan$(t3.file, t4, t4));
+        }
+        wasInContentBlock = _this._inContentBlock;
+        _this._inContentBlock = true;
+        $content = _this._withChildren$3(_this.get$_statement(), start, new V.StylesheetParser__includeRule_closure(t1));
+        _this._inContentBlock = wasInContentBlock;
+      } else {
+        _this.expectStatementSeparator$0();
+        $content = _null;
+      }
+      t1 = t2.spanFrom$2(start, start);
+      return new A.IncludeRule(namespace, $name, $arguments, $content, t1.expand$1(0, ($content == null ? $arguments : $content).get$span()));
+    },
+    mediaRule$1: function(start) {
+      return this._withChildren$3(this.get$_statement(), start, new V.StylesheetParser_mediaRule_closure(this._mediaQueryList$0()));
+    },
+    _mixinRule$1: function(start) {
+      var $name, t1, $arguments, t2, t3, _this = this,
+        precedingComment = _this.lastSilentComment;
+      _this.lastSilentComment = null;
+      $name = _this.identifier$1$normalize(true);
+      _this.whitespace$0();
+      t1 = _this.scanner;
+      if (t1.peekChar$0() === 40)
+        $arguments = _this._argumentDeclaration$0();
+      else {
+        t2 = Y.FileLocation$_(t1._sourceFile, t1._string_scanner$_position);
+        t3 = t2.offset;
+        $arguments = new B.ArgumentDeclaration(C.List_empty8, null, Y._FileSpan$(t2.file, t3, t3));
+      }
+      if (_this._stylesheet$_inMixin || _this._inContentBlock)
+        _this.error$2(0, string$.Mixinscm, t1.spanFrom$1(start));
+      else if (_this._inControlDirective)
+        _this.error$2(0, string$.Mixinsb, t1.spanFrom$1(start));
+      _this.whitespace$0();
+      _this._stylesheet$_inMixin = true;
+      _this._mixinHasContent = false;
+      return _this._withChildren$3(_this.get$_statement(), start, new V.StylesheetParser__mixinRule_closure(_this, $name, $arguments, precedingComment));
+    },
+    mozDocumentRule$2: function(start, $name) {
+      var t5, t6, identifier, contents, argument, trailing, endPosition, t7, t8, start0, end, _this = this, _box_0 = {},
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        t4 = [],
+        buffer = new Z.InterpolationBuffer(t3, t4);
+      _box_0.needsDeprecationWarning = false;
+      for (t5 = _this.get$whitespace(); true;) {
+        if (t1.peekChar$0() === 35) {
+          t6 = _this.singleInterpolation$0();
+          buffer._flushText$0();
+          t4.push(t6);
+          _box_0.needsDeprecationWarning = true;
+        } else {
+          t6 = t1._string_scanner$_position;
+          identifier = _this.identifier$0();
+          switch (identifier) {
+            case "url":
+            case "url-prefix":
+            case "domain":
+              contents = _this._tryUrlContents$2$name(new S._SpanScannerState(t1, t6), identifier);
+              if (contents != null)
+                buffer.addInterpolation$1(contents);
+              else {
+                t1.expectChar$1(40);
+                _this.whitespace$0();
+                argument = _this.interpolatedString$0();
+                t1.expectChar$1(41);
+                t3._contents += identifier;
+                t3._contents += H.Primitives_stringFromCharCode(40);
+                buffer.addInterpolation$1(argument.asInterpolation$0());
+                t3._contents += H.Primitives_stringFromCharCode(41);
+              }
+              t6 = t3._contents;
+              trailing = t6.charCodeAt(0) == 0 ? t6 : t6;
+              if (!C.JSString_methods.endsWith$1(trailing, "url-prefix()") && !C.JSString_methods.endsWith$1(trailing, "url-prefix('')") && !C.JSString_methods.endsWith$1(trailing, 'url-prefix("")'))
+                _box_0.needsDeprecationWarning = true;
+              break;
+            case "regexp":
+              t3._contents += "regexp(";
+              t1.expectChar$1(40);
+              buffer.addInterpolation$1(_this.interpolatedString$0().asInterpolation$0());
+              t1.expectChar$1(41);
+              t3._contents += H.Primitives_stringFromCharCode(41);
+              _box_0.needsDeprecationWarning = true;
+              break;
+            default:
+              endPosition = t1._string_scanner$_position;
+              t7 = t1._sourceFile;
+              t8 = new Y._FileSpan(t7, t6, endPosition);
+              t8._FileSpan$3(t7, t6, endPosition);
+              _this.error$2(0, "Invalid function name.", t8);
+          }
+        }
+        _this.whitespace$0();
+        if (!t1.scanChar$1(44))
+          break;
+        t3._contents += H.Primitives_stringFromCharCode(44);
+        start0 = t1._string_scanner$_position;
+        t5.call$0();
+        end = t1._string_scanner$_position;
+        t3._contents += J.substring$2$s(t1.string, start0, end);
+      }
+      return _this._withChildren$3(_this.get$_statement(), start, new V.StylesheetParser_mozDocumentRule_closure(_box_0, _this, $name, buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)))));
+    },
+    supportsRule$1: function(start) {
+      var _this = this,
+        condition = _this._supportsCondition$0();
+      _this.whitespace$0();
+      return _this._withChildren$3(_this.get$_statement(), start, new V.StylesheetParser_supportsRule_closure(condition));
+    },
+    _useRule$1: function(start) {
+      var namespace, configuration, span, t1, _this = this,
+        _s9_ = "@use rule",
+        url = _this._urlString$0();
+      _this.whitespace$0();
+      namespace = _this._useNamespace$2(url, start);
+      _this.whitespace$0();
+      configuration = _this._stylesheet$_configuration$0();
+      _this.expectStatementSeparator$1(_s9_);
+      span = _this.scanner.spanFrom$1(start);
+      if (!_this._isUseAllowed)
+        _this.error$2(0, string$.x40use_r, span);
+      _this.expectStatementSeparator$1(_s9_);
+      t1 = new T.UseRule(url, namespace, configuration == null ? C.List_empty6 : P.List_List$unmodifiable(configuration, type$.legacy_ConfiguredVariable), span);
+      t1.UseRule$4$configuration(url, namespace, span, configuration);
+      return t1;
+    },
+    _useNamespace$2: function(url, start) {
+      var namespace, basename, dot, t1, exception, _this = this;
+      if (_this.scanIdentifier$1("as")) {
+        _this.whitespace$0();
+        return _this.scanner.scanChar$1(42) ? null : _this.identifier$0();
+      }
+      basename = url.get$pathSegments().length === 0 ? "" : C.JSArray_methods.get$last(url.get$pathSegments());
+      dot = J.getInterceptor$asx(basename).indexOf$1(basename, ".");
+      t1 = C.JSString_methods.startsWith$1(basename, "_") ? 1 : 0;
+      namespace = C.JSString_methods.substring$2(basename, t1, dot === -1 ? basename.length : dot);
+      try {
+        t1 = S.SpanScanner$(namespace, null);
+        t1 = new G.Parser(t1, _this.logger)._parseIdentifier$0();
+        return t1;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof E.SassFormatException)
+          _this.error$2(0, 'Invalid Sass identifier "' + H.S(namespace) + '"', _this.scanner.spanFrom$1(start));
+        else
+          throw exception;
+      }
+    },
+    _stylesheet$_configuration$1$allowGuarded: function(allowGuarded) {
+      var variableNames, configuration, t1, t2, $name, expression, t3, guarded, endPosition, t4, t5, span, _this = this;
+      if (!_this.scanIdentifier$1("with"))
+        return null;
+      variableNames = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_String);
+      configuration = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ConfiguredVariable);
+      _this.whitespace$0();
+      t1 = _this.scanner;
+      t1.expectChar$1(40);
+      for (; true;) {
+        _this.whitespace$0();
+        t2 = t1._string_scanner$_position;
+        t1.expectChar$1(36);
+        $name = _this.identifier$1$normalize(true);
+        _this.whitespace$0();
+        t1.expectChar$1(58);
+        _this.whitespace$0();
+        expression = _this._expressionUntilComma$0();
+        t3 = t1._string_scanner$_position;
+        if (allowGuarded && t1.scanChar$1(33))
+          if (_this.identifier$0() === "default") {
+            _this.whitespace$0();
+            guarded = true;
+          } else {
+            endPosition = t1._string_scanner$_position;
+            t4 = t1._sourceFile;
+            t5 = new Y._FileSpan(t4, t3, endPosition);
+            t5._FileSpan$3(t4, t3, endPosition);
+            _this.error$2(0, "Invalid flag name.", t5);
+            guarded = false;
+          }
+        else
+          guarded = false;
+        endPosition = t1._string_scanner$_position;
+        t3 = t1._sourceFile;
+        span = new Y._FileSpan(t3, t2, endPosition);
+        span._FileSpan$3(t3, t2, endPosition);
+        if (variableNames.contains$1(0, $name))
+          _this.error$2(0, string$.The_sa, span);
+        variableNames.add$1(0, $name);
+        configuration.push(new Z.ConfiguredVariable($name, expression, guarded, span));
+        if (!t1.scanChar$1(44))
+          break;
+        _this.whitespace$0();
+        if (!_this._lookingAtExpression$0())
+          break;
+      }
+      t1.expectChar$1(41);
+      return configuration;
+    },
+    _stylesheet$_configuration$0: function() {
+      return this._stylesheet$_configuration$1$allowGuarded(false);
+    },
+    _warnRule$1: function(start) {
+      var value = this.expression$0();
+      this.expectStatementSeparator$1("@warn rule");
+      return new Y.WarnRule(value, this.scanner.spanFrom$1(start));
+    },
+    _whileRule$2: function(start, child) {
+      var _this = this,
+        wasInControlDirective = _this._inControlDirective;
+      _this._inControlDirective = true;
+      return _this._withChildren$3(child, start, new V.StylesheetParser__whileRule_closure(_this, wasInControlDirective, _this.expression$0()));
+    },
+    unknownAtRule$2: function(start, $name) {
+      var t2, t3, rule, _this = this, t1 = {},
+        wasInUnknownAtRule = _this._stylesheet$_inUnknownAtRule;
+      _this._stylesheet$_inUnknownAtRule = true;
+      t1.value = null;
+      t2 = _this.scanner;
+      t3 = t2.peekChar$0() !== 33 && !_this.atEndOfStatement$0() ? t1.value = _this.almostAnyValue$0() : null;
+      if (_this.lookingAtChildren$0())
+        rule = _this._withChildren$3(_this.get$_statement(), start, new V.StylesheetParser_unknownAtRule_closure(t1, $name));
+      else {
+        _this.expectStatementSeparator$0();
+        rule = U.AtRule$($name, t2.spanFrom$1(start), null, t3);
+      }
+      _this._stylesheet$_inUnknownAtRule = wasInUnknownAtRule;
+      return rule;
+    },
+    _disallowedAtRule$1: function(start) {
+      this.almostAnyValue$0();
+      this.error$2(0, "This at-rule is not allowed here.", this.scanner.spanFrom$1(start));
+    },
+    _argumentDeclaration$0: function() {
+      var $arguments, named, restArgument, t3, $name, defaultValue, endPosition, t4, t5, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expectChar$1(40);
+      _this.whitespace$0();
+      $arguments = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Argument);
+      named = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_String);
+      while (true) {
+        if (!(t1.peekChar$0() === 36)) {
+          restArgument = null;
+          break;
+        }
+        t3 = t1._string_scanner$_position;
+        t1.expectChar$1(36);
+        $name = _this.identifier$1$normalize(true);
+        _this.whitespace$0();
+        if (t1.scanChar$1(58)) {
+          _this.whitespace$0();
+          defaultValue = _this._expressionUntilComma$0();
+        } else {
+          if (t1.scanChar$1(46)) {
+            t1.expectChar$1(46);
+            t1.expectChar$1(46);
+            _this.whitespace$0();
+            restArgument = $name;
+            break;
+          }
+          defaultValue = null;
+        }
+        endPosition = t1._string_scanner$_position;
+        t4 = t1._sourceFile;
+        t5 = new Y._FileSpan(t4, t3, endPosition);
+        t5._FileSpan$3(t4, t3, endPosition);
+        $arguments.push(new Z.Argument($name, defaultValue, t5));
+        if (!named.add$1(0, $name))
+          _this.error$2(0, "Duplicate argument.", C.JSArray_methods.get$last($arguments).span);
+        if (!t1.scanChar$1(44)) {
+          restArgument = null;
+          break;
+        }
+        _this.whitespace$0();
+      }
+      t1.expectChar$1(41);
+      t1 = t1.spanFrom$1(new S._SpanScannerState(t1, t2));
+      return new B.ArgumentDeclaration(P.List_List$unmodifiable($arguments, type$.legacy_Argument), restArgument, t1);
+    },
+    _argumentInvocation$1$mixin: function(mixin) {
+      var positional, t3, t4, named, keywordRest, t5, rest, expression, t6, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expectChar$1(40);
+      _this.whitespace$0();
+      positional = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression);
+      t3 = type$.legacy_String;
+      t4 = type$.legacy_Expression;
+      named = P.LinkedHashMap_LinkedHashMap$_empty(t3, t4);
+      t5 = !mixin;
+      rest = null;
+      while (true) {
+        if (!_this._lookingAtExpression$0()) {
+          keywordRest = null;
+          break;
+        }
+        expression = _this._expressionUntilComma$1$singleEquals(t5);
+        _this.whitespace$0();
+        if (expression instanceof S.VariableExpression && t1.scanChar$1(58)) {
+          _this.whitespace$0();
+          t6 = expression.name;
+          if (named.containsKey$1(t6))
+            _this.error$2(0, "Duplicate argument.", expression.span);
+          named.$indexSet(0, t6, _this._expressionUntilComma$1$singleEquals(t5));
+        } else if (t1.scanChar$1(46)) {
+          t1.expectChar$1(46);
+          t1.expectChar$1(46);
+          if (rest != null) {
+            _this.whitespace$0();
+            keywordRest = expression;
+            break;
+          }
+          rest = expression;
+        } else if (named.get$isNotEmpty(named))
+          _this.error$2(0, string$.Positi, expression.get$span());
+        else
+          positional.push(expression);
+        _this.whitespace$0();
+        if (!t1.scanChar$1(44)) {
+          keywordRest = null;
+          break;
+        }
+        _this.whitespace$0();
+      }
+      t1.expectChar$1(41);
+      t1 = t1.spanFrom$1(new S._SpanScannerState(t1, t2));
+      return new X.ArgumentInvocation(P.List_List$unmodifiable(positional, t4), H.ConstantMap_ConstantMap$from(named, t3, t4), rest, keywordRest, t1);
+    },
+    _argumentInvocation$0: function() {
+      return this._argumentInvocation$1$mixin(false);
+    },
+    expression$3$bracketList$singleEquals$until: function(bracketList, singleEquals, until) {
+      var t2, beforeBracket, t3, wasInParentheses, resetState, resolveOneOperation, resolveOperations, addSingleExpression, addOperator, resolveSpaceExpressions, first, next, t4, _this = this,
+        _s20_ = "Expected expression.",
+        _box_0 = {},
+        t1 = until != null;
+      if (t1 && until.call$0())
+        _this.scanner.error$1(0, _s20_);
+      if (bracketList) {
+        t2 = _this.scanner;
+        beforeBracket = new S._SpanScannerState(t2, t2._string_scanner$_position);
+        t2.expectChar$1(91);
+        _this.whitespace$0();
+        if (t2.scanChar$1(93))
+          return D.ListExpression$(H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression), C.ListSeparator_undecided, true, t2.spanFrom$1(beforeBracket));
+      } else
+        beforeBracket = null;
+      t2 = _this.scanner;
+      t3 = t2._string_scanner$_position;
+      wasInParentheses = _this._inParentheses;
+      _box_0.operands = _box_0.operators = _box_0.spaceExpressions = _box_0.commaExpressions = null;
+      _box_0.allowSlash = _this.lookingAtNumber$0();
+      _box_0.singleExpression = _this._singleExpression$0();
+      resetState = new V.StylesheetParser_expression_resetState(_box_0, _this, new S._SpanScannerState(t2, t3));
+      resolveOneOperation = new V.StylesheetParser_expression_resolveOneOperation(_box_0, _this);
+      resolveOperations = new V.StylesheetParser_expression_resolveOperations(_box_0, resolveOneOperation);
+      addSingleExpression = new V.StylesheetParser_expression_addSingleExpression(_box_0, _this, resetState, resolveOperations);
+      addOperator = new V.StylesheetParser_expression_addOperator(_box_0, _this, resolveOneOperation);
+      resolveSpaceExpressions = new V.StylesheetParser_expression_resolveSpaceExpressions(_box_0, resolveOperations);
+      $label0$0:
+        for (t3 = type$.JSArray_legacy_Expression; true;) {
+          _this.whitespace$0();
+          if (t1 && until.call$0())
+            break $label0$0;
+          first = t2.peekChar$0();
+          switch (first) {
+            case 40:
+              addSingleExpression.call$1(_this._parentheses$0());
+              break;
+            case 91:
+              addSingleExpression.call$1(_this.expression$1$bracketList(true));
+              break;
+            case 36:
+              addSingleExpression.call$1(_this._variable$0());
+              break;
+            case 38:
+              addSingleExpression.call$1(_this._selector$0());
+              break;
+            case 39:
+            case 34:
+              addSingleExpression.call$1(_this.interpolatedString$0());
+              break;
+            case 35:
+              addSingleExpression.call$1(_this._hashExpression$0());
+              break;
+            case 61:
+              t2.readChar$0();
+              if (singleEquals && t2.peekChar$0() !== 61)
+                addOperator.call$1(C.BinaryOperator_kjl);
+              else {
+                t2.expectChar$1(61);
+                addOperator.call$1(C.BinaryOperator_YlX);
+              }
+              break;
+            case 33:
+              next = t2.peekChar$1(1);
+              if (next === 61) {
+                t2.readChar$0();
+                t2.readChar$0();
+                addOperator.call$1(C.BinaryOperator_i5H);
+              } else {
+                if (next != null)
+                  if ((next | 32) !== 105)
+                    t4 = next === 32 || next === 9 || next === 10 || next === 13 || next === 12;
+                  else
+                    t4 = true;
+                else
+                  t4 = true;
+                if (t4)
+                  addSingleExpression.call$1(_this._importantExpression$0());
+                else
+                  break $label0$0;
+              }
+              break;
+            case 60:
+              t2.readChar$0();
+              addOperator.call$1(t2.scanChar$1(61) ? C.BinaryOperator_33h : C.BinaryOperator_8qt);
+              break;
+            case 62:
+              t2.readChar$0();
+              addOperator.call$1(t2.scanChar$1(61) ? C.BinaryOperator_1da : C.BinaryOperator_AcR);
+              break;
+            case 42:
+              t2.readChar$0();
+              addOperator.call$1(C.BinaryOperator_O1M);
+              break;
+            case 43:
+              if (_box_0.singleExpression == null)
+                addSingleExpression.call$1(_this._unaryOperation$0());
+              else {
+                t2.readChar$0();
+                addOperator.call$1(C.BinaryOperator_AcR0);
+              }
+              break;
+            case 45:
+              next = t2.peekChar$1(1);
+              if (next != null && next >= 48 && next <= 57 || next === 46)
+                if (_box_0.singleExpression != null) {
+                  t4 = t2.peekChar$1(-1);
+                  t4 = t4 === 32 || t4 === 9 || t4 === 10 || t4 === 13 || t4 === 12;
+                } else
+                  t4 = true;
+              else
+                t4 = false;
+              if (t4)
+                addSingleExpression.call$2$number(_this._number$0(), true);
+              else if (_this._lookingAtInterpolatedIdentifier$0())
+                addSingleExpression.call$1(_this.identifierLike$0());
+              else if (_box_0.singleExpression == null)
+                addSingleExpression.call$1(_this._unaryOperation$0());
+              else {
+                t2.readChar$0();
+                addOperator.call$1(C.BinaryOperator_iyO);
+              }
+              break;
+            case 47:
+              if (_box_0.singleExpression == null)
+                addSingleExpression.call$1(_this._unaryOperation$0());
+              else {
+                t2.readChar$0();
+                addOperator.call$1(C.BinaryOperator_RTB);
+              }
+              break;
+            case 37:
+              t2.readChar$0();
+              addOperator.call$1(C.BinaryOperator_2ad);
+              break;
+            case 48:
+            case 49:
+            case 50:
+            case 51:
+            case 52:
+            case 53:
+            case 54:
+            case 55:
+            case 56:
+            case 57:
+              addSingleExpression.call$2$number(_this._number$0(), true);
+              break;
+            case 46:
+              if (t2.peekChar$1(1) === 46)
+                break $label0$0;
+              addSingleExpression.call$2$number(_this._number$0(), true);
+              break;
+            case 97:
+              if (!_this.get$plainCss() && _this.scanIdentifier$1("and"))
+                addOperator.call$1(C.BinaryOperator_and_and_2);
+              else
+                addSingleExpression.call$1(_this.identifierLike$0());
+              break;
+            case 111:
+              if (!_this.get$plainCss() && _this.scanIdentifier$1("or"))
+                addOperator.call$1(C.BinaryOperator_or_or_1);
+              else
+                addSingleExpression.call$1(_this.identifierLike$0());
+              break;
+            case 117:
+            case 85:
+              if (t2.peekChar$1(1) === 43)
+                addSingleExpression.call$1(_this._unicodeRange$0());
+              else
+                addSingleExpression.call$1(_this.identifierLike$0());
+              break;
+            case 98:
+            case 99:
+            case 100:
+            case 101:
+            case 102:
+            case 103:
+            case 104:
+            case 105:
+            case 106:
+            case 107:
+            case 108:
+            case 109:
+            case 110:
+            case 112:
+            case 113:
+            case 114:
+            case 115:
+            case 116:
+            case 118:
+            case 119:
+            case 120:
+            case 121:
+            case 122:
+            case 65:
+            case 66:
+            case 67:
+            case 68:
+            case 69:
+            case 70:
+            case 71:
+            case 72:
+            case 73:
+            case 74:
+            case 75:
+            case 76:
+            case 77:
+            case 78:
+            case 79:
+            case 80:
+            case 81:
+            case 82:
+            case 83:
+            case 84:
+            case 86:
+            case 87:
+            case 88:
+            case 89:
+            case 90:
+            case 95:
+            case 92:
+              addSingleExpression.call$1(_this.identifierLike$0());
+              break;
+            case 44:
+              if (_this._inParentheses) {
+                _this._inParentheses = false;
+                if (_box_0.allowSlash) {
+                  resetState.call$0();
+                  break;
+                }
+              }
+              if (_box_0.commaExpressions == null)
+                _box_0.commaExpressions = H.setRuntimeTypeInfo([], t3);
+              if (_box_0.singleExpression == null)
+                t2.error$1(0, _s20_);
+              resolveSpaceExpressions.call$0();
+              _box_0.commaExpressions.push(_box_0.singleExpression);
+              t2.readChar$0();
+              _box_0.allowSlash = true;
+              _box_0.singleExpression = null;
+              break;
+            default:
+              if (first != null && first >= 128) {
+                addSingleExpression.call$1(_this.identifierLike$0());
+                break;
+              } else
+                break $label0$0;
+          }
+        }
+      if (bracketList)
+        t2.expectChar$1(93);
+      if (_box_0.commaExpressions != null) {
+        resolveSpaceExpressions.call$0();
+        _this._inParentheses = wasInParentheses;
+        t1 = _box_0.singleExpression;
+        if (t1 != null)
+          _box_0.commaExpressions.push(t1);
+        t1 = _box_0.commaExpressions;
+        return D.ListExpression$(t1, C.ListSeparator_comma, bracketList, bracketList ? t2.spanFrom$1(beforeBracket) : null);
+      } else if (bracketList && _box_0.spaceExpressions != null) {
+        resolveOperations.call$0();
+        t1 = _box_0.spaceExpressions;
+        t1.push(_box_0.singleExpression);
+        return D.ListExpression$(t1, C.ListSeparator_space, true, t2.spanFrom$1(beforeBracket));
+      } else {
+        resolveSpaceExpressions.call$0();
+        if (bracketList)
+          _box_0.singleExpression = D.ListExpression$(H.setRuntimeTypeInfo([_box_0.singleExpression], t3), C.ListSeparator_undecided, true, t2.spanFrom$1(beforeBracket));
+        return _box_0.singleExpression;
+      }
+    },
+    expression$0: function() {
+      return this.expression$3$bracketList$singleEquals$until(false, false, null);
+    },
+    expression$2$singleEquals$until: function(singleEquals, until) {
+      return this.expression$3$bracketList$singleEquals$until(false, singleEquals, until);
+    },
+    expression$1$bracketList: function(bracketList) {
+      return this.expression$3$bracketList$singleEquals$until(bracketList, false, null);
+    },
+    expression$1$singleEquals: function(singleEquals) {
+      return this.expression$3$bracketList$singleEquals$until(false, singleEquals, null);
+    },
+    expression$1$until: function(until) {
+      return this.expression$3$bracketList$singleEquals$until(false, false, until);
+    },
+    _expressionUntilComma$1$singleEquals: function(singleEquals) {
+      return this.expression$2$singleEquals$until(singleEquals, new V.StylesheetParser__expressionUntilComma_closure(this));
+    },
+    _expressionUntilComma$0: function() {
+      return this._expressionUntilComma$1$singleEquals(false);
+    },
+    _singleExpression$0: function() {
+      var next, _this = this,
+        t1 = _this.scanner,
+        first = t1.peekChar$0();
+      switch (first) {
+        case 40:
+          return _this._parentheses$0();
+        case 47:
+          return _this._unaryOperation$0();
+        case 46:
+          return _this._number$0();
+        case 91:
+          return _this.expression$1$bracketList(true);
+        case 36:
+          return _this._variable$0();
+        case 38:
+          return _this._selector$0();
+        case 39:
+        case 34:
+          return _this.interpolatedString$0();
+        case 35:
+          return _this._hashExpression$0();
+        case 43:
+          next = t1.peekChar$1(1);
+          return T.isDigit(next) || next === 46 ? _this._number$0() : _this._unaryOperation$0();
+        case 45:
+          return _this._minusExpression$0();
+        case 33:
+          return _this._importantExpression$0();
+        case 117:
+        case 85:
+          if (t1.peekChar$1(1) === 43)
+            return _this._unicodeRange$0();
+          else
+            return _this.identifierLike$0();
+        case 48:
+        case 49:
+        case 50:
+        case 51:
+        case 52:
+        case 53:
+        case 54:
+        case 55:
+        case 56:
+        case 57:
+          return _this._number$0();
+        case 97:
+        case 98:
+        case 99:
+        case 100:
+        case 101:
+        case 102:
+        case 103:
+        case 104:
+        case 105:
+        case 106:
+        case 107:
+        case 108:
+        case 109:
+        case 110:
+        case 111:
+        case 112:
+        case 113:
+        case 114:
+        case 115:
+        case 116:
+        case 118:
+        case 119:
+        case 120:
+        case 121:
+        case 122:
+        case 65:
+        case 66:
+        case 67:
+        case 68:
+        case 69:
+        case 70:
+        case 71:
+        case 72:
+        case 73:
+        case 74:
+        case 75:
+        case 76:
+        case 77:
+        case 78:
+        case 79:
+        case 80:
+        case 81:
+        case 82:
+        case 83:
+        case 84:
+        case 86:
+        case 87:
+        case 88:
+        case 89:
+        case 90:
+        case 95:
+        case 92:
+          return _this.identifierLike$0();
+        default:
+          if (first != null && first >= 128)
+            return _this.identifierLike$0();
+          t1.error$1(0, "Expected expression.");
+      }
+    },
+    _parentheses$0: function() {
+      var wasInParentheses, start, first, expressions, t1, _this = this;
+      if (_this.get$plainCss())
+        _this.scanner.error$2$length(0, "Parentheses aren't allowed in plain CSS.", 1);
+      wasInParentheses = _this._inParentheses;
+      _this._inParentheses = true;
+      try {
+        t1 = _this.scanner;
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+        t1.expectChar$1(40);
+        _this.whitespace$0();
+        if (!_this._lookingAtExpression$0()) {
+          t1.expectChar$1(41);
+          t1 = D.ListExpression$(H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression), C.ListSeparator_undecided, false, t1.spanFrom$1(start));
+          return t1;
+        }
+        first = _this._expressionUntilComma$0();
+        if (t1.scanChar$1(58)) {
+          _this.whitespace$0();
+          t1 = _this._stylesheet$_map$2(first, start);
+          return t1;
+        }
+        if (!t1.scanChar$1(44)) {
+          t1.expectChar$1(41);
+          t1 = t1.spanFrom$1(start);
+          return new T.ParenthesizedExpression(first, t1);
+        }
+        _this.whitespace$0();
+        expressions = H.setRuntimeTypeInfo([first], type$.JSArray_legacy_Expression);
+        for (; true;) {
+          if (!_this._lookingAtExpression$0())
+            break;
+          J.add$1$ax(expressions, _this._expressionUntilComma$0());
+          if (!t1.scanChar$1(44))
+            break;
+          _this.whitespace$0();
+        }
+        t1.expectChar$1(41);
+        t1 = D.ListExpression$(expressions, C.ListSeparator_comma, false, t1.spanFrom$1(start));
+        return t1;
+      } finally {
+        _this._inParentheses = wasInParentheses;
+      }
+    },
+    _stylesheet$_map$2: function(first, start) {
+      var t2, key, _this = this,
+        t1 = type$.Tuple2_of_legacy_Expression_and_legacy_Expression,
+        pairs = H.setRuntimeTypeInfo([new S.Tuple2(first, _this._expressionUntilComma$0(), t1)], type$.JSArray_legacy_Tuple2_of_legacy_Expression_and_legacy_Expression);
+      for (t2 = _this.scanner; t2.scanChar$1(44);) {
+        _this.whitespace$0();
+        if (!_this._lookingAtExpression$0())
+          break;
+        key = _this._expressionUntilComma$0();
+        t2.expectChar$1(58);
+        _this.whitespace$0();
+        pairs.push(new S.Tuple2(key, _this._expressionUntilComma$0(), t1));
+      }
+      t2.expectChar$1(41);
+      t1 = t2.spanFrom$1(start);
+      return new A.MapExpression(P.List_List$unmodifiable(pairs, type$.legacy_Tuple2_of_legacy_Expression_and_legacy_Expression), t1);
+    },
+    _hashExpression$0: function() {
+      var start, first, t2, identifier, buffer, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$1(1) === 123)
+        return _this.identifierLike$0();
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expectChar$1(35);
+      first = t1.peekChar$0();
+      if (first != null && T.isDigit(first))
+        return new K.ColorExpression(_this._hexColorContents$1(start));
+      t2 = t1._string_scanner$_position;
+      identifier = _this.interpolatedIdentifier$0();
+      if (_this._isHexColor$1(identifier)) {
+        t1.set$state(new S._SpanScannerState(t1, t2));
+        return new K.ColorExpression(_this._hexColorContents$1(start));
+      }
+      t2 = new P.StringBuffer("");
+      buffer = new Z.InterpolationBuffer(t2, []);
+      t2._contents += H.Primitives_stringFromCharCode(35);
+      buffer.addInterpolation$1(identifier);
+      return new D.StringExpression(buffer.interpolation$1(t1.spanFrom$1(start)), false);
+    },
+    _hexColorContents$1: function(start) {
+      var red, green, blue, alpha, digit4, t2, t3, _this = this,
+        digit1 = _this._hexDigit$0(),
+        digit2 = _this._hexDigit$0(),
+        digit3 = _this._hexDigit$0(),
+        t1 = _this.scanner;
+      if (!T.isHex(t1.peekChar$0())) {
+        red = (digit1 << 4 >>> 0) + digit1;
+        green = (digit2 << 4 >>> 0) + digit2;
+        blue = (digit3 << 4 >>> 0) + digit3;
+        alpha = 1;
+      } else {
+        digit4 = _this._hexDigit$0();
+        t2 = digit1 << 4 >>> 0;
+        t3 = digit3 << 4 >>> 0;
+        if (!T.isHex(t1.peekChar$0())) {
+          red = t2 + digit1;
+          green = (digit2 << 4 >>> 0) + digit2;
+          blue = t3 + digit3;
+          alpha = ((digit4 << 4 >>> 0) + digit4) / 255;
+        } else {
+          red = t2 + digit2;
+          green = t3 + digit4;
+          blue = (_this._hexDigit$0() << 4 >>> 0) + _this._hexDigit$0();
+          alpha = T.isHex(t1.peekChar$0()) ? ((_this._hexDigit$0() << 4 >>> 0) + _this._hexDigit$0()) / 255 : 1;
+        }
+      }
+      return K.SassColor$rgb(red, green, blue, alpha, t1.spanFrom$1(start));
+    },
+    _isHexColor$1: function(interpolation) {
+      var t1,
+        plain = interpolation.get$asPlain();
+      if (plain == null)
+        return false;
+      t1 = plain.length;
+      if (t1 !== 3 && t1 !== 4 && t1 !== 6 && t1 !== 8)
+        return false;
+      t1 = new H.CodeUnits(plain);
+      return t1.every$1(t1, T.character__isHex$closure());
+    },
+    _hexDigit$0: function() {
+      var t1 = this.scanner,
+        char = t1.peekChar$0();
+      if (char == null || !T.isHex(char))
+        t1.error$1(0, "Expected hex digit.");
+      return T.asHex(t1.readChar$0());
+    },
+    _minusExpression$0: function() {
+      var _this = this,
+        next = _this.scanner.peekChar$1(1);
+      if (T.isDigit(next) || next === 46)
+        return _this._number$0();
+      if (_this._lookingAtInterpolatedIdentifier$0())
+        return _this.identifierLike$0();
+      return _this._unaryOperation$0();
+    },
+    _importantExpression$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.readChar$0();
+      this.whitespace$0();
+      this.expectIdentifier$1("important");
+      t2 = t1.spanFrom$1(new S._SpanScannerState(t1, t2));
+      return new D.StringExpression(X.Interpolation$(H.setRuntimeTypeInfo(["!important"], type$.JSArray_legacy_Object), t2), false);
+    },
+    _unaryOperation$0: function() {
+      var _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        operator = _this._unaryOperatorFor$1(t1.readChar$0());
+      if (operator == null)
+        t1.error$2$position(0, "Expected unary operator.", t1._string_scanner$_position - 1);
+      else if (_this.get$plainCss() && operator !== C.UnaryOperator_zDx)
+        t1.error$3$length$position(0, "Operators aren't allowed in plain CSS.", 1, t1._string_scanner$_position - 1);
+      _this.whitespace$0();
+      return new X.UnaryOperationExpression(operator, _this._singleExpression$0(), t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _unaryOperatorFor$1: function(character) {
+      switch (character) {
+        case 43:
+          return C.UnaryOperator_j2w;
+        case 45:
+          return C.UnaryOperator_U4G;
+        case 47:
+          return C.UnaryOperator_zDx;
+        default:
+          return null;
+      }
+    },
+    _number$0: function() {
+      var number, t4, unit, t5, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        first = t1.peekChar$0(),
+        t3 = first === 45,
+        sign = t3 ? -1 : 1;
+      if (first === 43 || t3)
+        t1.readChar$0();
+      number = t1.peekChar$0() === 46 ? 0 : _this.naturalNumber$0();
+      t3 = _this._tryDecimal$1$allowTrailingDot(t1._string_scanner$_position !== t2);
+      t4 = _this._tryExponent$0();
+      if (t1.scanChar$1(37))
+        unit = "%";
+      else {
+        if (_this.lookingAtIdentifier$0())
+          t5 = t1.peekChar$0() !== 45 || t1.peekChar$1(1) !== 45;
+        else
+          t5 = false;
+        unit = t5 ? _this.identifier$1$unit(true) : null;
+      }
+      return new T.NumberExpression(sign * ((number + t3) * t4), unit, t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _tryDecimal$1$allowTrailingDot: function(allowTrailingDot) {
+      var t2,
+        t1 = this.scanner,
+        start = t1._string_scanner$_position;
+      if (t1.peekChar$0() !== 46)
+        return 0;
+      if (!T.isDigit(t1.peekChar$1(1))) {
+        if (allowTrailingDot)
+          return 0;
+        t1.error$2$position(0, "Expected digit.", t1._string_scanner$_position + 1);
+      }
+      t1.readChar$0();
+      while (true) {
+        t2 = t1.peekChar$0();
+        if (!(t2 != null && t2 >= 48 && t2 <= 57))
+          break;
+        t1.readChar$0();
+      }
+      return P.double_parse(t1.substring$1(0, start));
+    },
+    _tryExponent$0: function() {
+      var next, t2, exponentSign, exponent,
+        t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first !== 101 && first !== 69)
+        return 1;
+      next = t1.peekChar$1(1);
+      if (!T.isDigit(next) && next !== 45 && next !== 43)
+        return 1;
+      t1.readChar$0();
+      t2 = next === 45;
+      exponentSign = t2 ? -1 : 1;
+      if (next === 43 || t2)
+        t1.readChar$0();
+      if (!T.isDigit(t1.peekChar$0()))
+        t1.error$1(0, "Expected digit.");
+      exponent = 0;
+      while (true) {
+        t2 = t1.peekChar$0();
+        if (!(t2 != null && t2 >= 48 && t2 <= 57))
+          break;
+        exponent = exponent * 10 + (t1.readChar$0() - 48);
+      }
+      return Math.pow(10, exponentSign * exponent);
+    },
+    _unicodeRange$0: function() {
+      var i, t2, j, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      _this.expectIdentChar$1(117);
+      t1.expectChar$1(43);
+      for (i = 0; i < 6; ++i)
+        if (!_this.scanCharIf$1(new V.StylesheetParser__unicodeRange_closure()))
+          break;
+      if (t1.scanChar$1(63)) {
+        ++i;
+        for (; i < 6; ++i)
+          if (!t1.scanChar$1(63))
+            break;
+        t2 = t1.substring$1(0, start.position);
+        t1 = t1.spanFrom$1(start);
+        return new D.StringExpression(X.Interpolation$(H.setRuntimeTypeInfo([t2], type$.JSArray_legacy_Object), t1), false);
+      }
+      if (i === 0)
+        t1.error$1(0, 'Expected hex digit or "?".');
+      if (t1.scanChar$1(45)) {
+        for (j = 0; j < 6; ++j)
+          if (!_this.scanCharIf$1(new V.StylesheetParser__unicodeRange_closure0()))
+            break;
+        if (j === 0)
+          t1.error$1(0, "Expected hex digit.");
+      }
+      if (_this._lookingAtInterpolatedIdentifierBody$0())
+        t1.error$1(0, "Expected end of identifier.");
+      t2 = t1.substring$1(0, start.position);
+      t1 = t1.spanFrom$1(start);
+      return new D.StringExpression(X.Interpolation$(H.setRuntimeTypeInfo([t2], type$.JSArray_legacy_Object), t1), false);
+    },
+    _variable$0: function() {
+      var _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        $name = _this.variableName$0();
+      if (_this.get$plainCss())
+        _this.error$2(0, string$.Sass_v, t1.spanFrom$1(start));
+      return new S.VariableExpression(null, $name, t1.spanFrom$1(start));
+    },
+    _selector$0: function() {
+      var t1, start, _this = this;
+      if (_this.get$plainCss())
+        _this.scanner.error$2$length(0, string$.The_pa, 1);
+      t1 = _this.scanner;
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expectChar$1(38);
+      if (t1.scanChar$1(38)) {
+        _this.logger.warn$2$span(0, string$.In_Sas, t1.spanFrom$1(start));
+        t1.set$position(t1._string_scanner$_position - 1);
+      }
+      return new T.SelectorExpression(t1.spanFrom$1(start));
+    },
+    interpolatedString$0: function() {
+      var t3, t4, buffer, next, second, t5,
+        t1 = this.scanner,
+        t2 = t1._string_scanner$_position,
+        quote = t1.readChar$0();
+      if (quote !== 39 && quote !== 34)
+        t1.error$2$position(0, "Expected string.", t2);
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer(t3, t4);
+      for (; true;) {
+        next = t1.peekChar$0();
+        if (next === quote) {
+          t1.readChar$0();
+          break;
+        } else if (next == null || next === 10 || next === 13 || next === 12)
+          t1.error$1(0, "Expected " + H.Primitives_stringFromCharCode(quote) + ".");
+        else if (next === 92) {
+          second = t1.peekChar$1(1);
+          if (second === 10 || second === 13 || second === 12) {
+            t1.readChar$0();
+            t1.readChar$0();
+            if (second === 13)
+              t1.scanChar$1(10);
+          } else
+            t3._contents += H.Primitives_stringFromCharCode(this.escapeCharacter$0());
+        } else if (next === 35)
+          if (t1.peekChar$1(1) === 123) {
+            t5 = this.singleInterpolation$0();
+            buffer._flushText$0();
+            t4.push(t5);
+          } else
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+        else
+          t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+      }
+      return new D.StringExpression(buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2))), true);
+    },
+    identifierLike$0: function() {
+      var invocation, lower, color, specialFunction, $name, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        identifier = _this.interpolatedIdentifier$0(),
+        plain = identifier.get$asPlain(),
+        t2 = plain == null;
+      if (!t2) {
+        if (plain === "if") {
+          invocation = _this._argumentInvocation$0();
+          return new L.IfExpression(invocation, B.spanForList(H.setRuntimeTypeInfo([identifier, invocation], type$.JSArray_legacy_AstNode)));
+        } else if (plain === "not") {
+          _this.whitespace$0();
+          return new X.UnaryOperationExpression(C.UnaryOperator_not_not, _this._singleExpression$0(), identifier.span);
+        }
+        lower = plain.toLowerCase();
+        if (t1.peekChar$0() !== 40) {
+          switch (plain) {
+            case "false":
+              return new Z.BooleanExpression(false, identifier.span);
+            case "null":
+              return new O.NullExpression(identifier.span);
+            case "true":
+              return new Z.BooleanExpression(true, identifier.span);
+          }
+          color = $.$get$colorsByName().$index(0, lower);
+          if (color != null)
+            return new K.ColorExpression(K.SassColor$rgb(color.get$red(), color.get$green(), color.get$blue(), color.alpha, identifier.span));
+        }
+        specialFunction = _this.trySpecialFunction$2(lower, start);
+        if (specialFunction != null)
+          return specialFunction;
+      }
+      switch (t1.peekChar$0()) {
+        case 46:
+          if (t1.peekChar$1(1) === 46)
+            return new D.StringExpression(identifier, false);
+          t1.readChar$0();
+          if (t2)
+            _this.error$2(0, string$.Interpn, identifier.span);
+          if (t1.peekChar$0() === 36) {
+            $name = _this.variableName$0();
+            _this._assertPublic$2($name, new V.StylesheetParser_identifierLike_closure(_this, start));
+            return new S.VariableExpression(plain, $name, t1.spanFrom$1(start));
+          }
+          t2 = t1._string_scanner$_position;
+          return new F.FunctionExpression(plain, X.Interpolation$(H.setRuntimeTypeInfo([_this._publicIdentifier$0()], type$.JSArray_legacy_Object), t1.spanFrom$1(new S._SpanScannerState(t1, t2))), _this._argumentInvocation$0(), t1.spanFrom$1(start));
+        case 40:
+          return new F.FunctionExpression(null, identifier, _this._argumentInvocation$0(), t1.spanFrom$1(start));
+        default:
+          return new D.StringExpression(identifier, false);
+      }
+    },
+    trySpecialFunction$2: function($name, start) {
+      var t1, buffer, t2, t3, next, contents, _this = this, _null = null;
+      switch (B.unvendor($name)) {
+        case "calc":
+        case "element":
+        case "expression":
+          if (!_this.scanner.scanChar$1(40))
+            return _null;
+          t1 = new P.StringBuffer("");
+          buffer = new Z.InterpolationBuffer(t1, []);
+          t1._contents = $name;
+          t1._contents += H.Primitives_stringFromCharCode(40);
+          break;
+        case "min":
+        case "max":
+          t1 = _this.scanner;
+          t2 = t1._string_scanner$_position;
+          if (!t1.scanChar$1(40))
+            return _null;
+          _this.whitespace$0();
+          t3 = new P.StringBuffer("");
+          buffer = new Z.InterpolationBuffer(t3, []);
+          t3._contents = $name;
+          t3._contents += H.Primitives_stringFromCharCode(40);
+          if (!_this._tryMinMaxContents$1(buffer)) {
+            t1.set$state(new S._SpanScannerState(t1, t2));
+            return _null;
+          }
+          return new D.StringExpression(buffer.interpolation$1(t1.spanFrom$1(start)), false);
+        case "progid":
+          t1 = _this.scanner;
+          if (!t1.scanChar$1(58))
+            return _null;
+          t2 = new P.StringBuffer("");
+          buffer = new Z.InterpolationBuffer(t2, []);
+          t2._contents = $name;
+          t2._contents += H.Primitives_stringFromCharCode(58);
+          next = t1.peekChar$0();
+          while (true) {
+            if (next != null) {
+              if (!(next >= 97 && next <= 122))
+                t3 = next >= 65 && next <= 90;
+              else
+                t3 = true;
+              t3 = t3 || next === 46;
+            } else
+              t3 = false;
+            if (!t3)
+              break;
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            next = t1.peekChar$0();
+          }
+          t1.expectChar$1(40);
+          t2._contents += H.Primitives_stringFromCharCode(40);
+          break;
+        case "url":
+          contents = _this._tryUrlContents$1(start);
+          return contents == null ? _null : new D.StringExpression(contents, false);
+        case "clamp":
+          if ($name !== "clamp")
+            return _null;
+          if (!_this.scanner.scanChar$1(40))
+            return _null;
+          t1 = new P.StringBuffer("");
+          buffer = new Z.InterpolationBuffer(t1, []);
+          t1._contents = $name;
+          t1._contents += H.Primitives_stringFromCharCode(40);
+          break;
+        default:
+          return _null;
+      }
+      buffer.addInterpolation$1(_this._interpolatedDeclarationValue$1$allowEmpty(true));
+      t1 = _this.scanner;
+      t1.expectChar$1(41);
+      buffer._interpolation_buffer$_text._contents += H.Primitives_stringFromCharCode(41);
+      return new D.StringExpression(buffer.interpolation$1(t1.spanFrom$1(start)), false);
+    },
+    _tryMinMaxContents$2$allowComma: function(buffer, allowComma) {
+      var t1, t2, t3, t4, start, end, exception, t5, _this = this;
+      for (t1 = _this.scanner, t2 = buffer._interpolation_buffer$_text, t3 = !allowComma, t4 = _this.get$_number(); true;) {
+        switch (t1.peekChar$0()) {
+          case 45:
+          case 43:
+          case 48:
+          case 49:
+          case 50:
+          case 51:
+          case 52:
+          case 53:
+          case 54:
+          case 55:
+          case 56:
+          case 57:
+            try {
+              start = t1._string_scanner$_position;
+              t4.call$0();
+              end = t1._string_scanner$_position;
+              t2._contents += J.substring$2$s(t1.string, start, end);
+            } catch (exception) {
+              if (type$.legacy_FormatException._is(H.unwrapException(exception)))
+                return false;
+              else
+                throw exception;
+            }
+            break;
+          case 35:
+            if (t1.peekChar$1(1) !== 123)
+              return false;
+            t5 = _this.singleInterpolation$0();
+            buffer._flushText$0();
+            buffer._interpolation_buffer$_contents.push(t5);
+            break;
+          case 99:
+          case 67:
+            switch (t1.peekChar$1(1)) {
+              case 97:
+              case 65:
+                if (!_this._tryMinMaxFunction$2(buffer, "calc"))
+                  return false;
+                break;
+              case 108:
+              case 76:
+                if (!_this._tryMinMaxFunction$2(buffer, "clamp"))
+                  return false;
+                break;
+            }
+            break;
+          case 101:
+          case 69:
+            if (!_this._tryMinMaxFunction$2(buffer, "env"))
+              return false;
+            break;
+          case 118:
+          case 86:
+            if (!_this._tryMinMaxFunction$2(buffer, "var"))
+              return false;
+            break;
+          case 40:
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            if (!_this._tryMinMaxContents$2$allowComma(buffer, false))
+              return false;
+            break;
+          case 109:
+          case 77:
+            t1.readChar$0();
+            if (_this.scanIdentChar$1(105)) {
+              if (!_this.scanIdentChar$1(110))
+                return false;
+              t2._contents += "min(";
+            } else if (_this.scanIdentChar$1(97)) {
+              if (!_this.scanIdentChar$1(120))
+                return false;
+              t2._contents += "max(";
+            } else
+              return false;
+            if (!t1.scanChar$1(40))
+              return false;
+            if (!_this._tryMinMaxContents$1(buffer))
+              return false;
+            break;
+          default:
+            return false;
+        }
+        _this.whitespace$0();
+        switch (t1.peekChar$0()) {
+          case 41:
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            return true;
+          case 43:
+          case 45:
+          case 42:
+          case 47:
+            t2._contents += H.Primitives_stringFromCharCode(32);
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            t2._contents += H.Primitives_stringFromCharCode(32);
+            break;
+          case 44:
+            if (t3)
+              return false;
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            t2._contents += H.Primitives_stringFromCharCode(32);
+            break;
+          default:
+            return false;
+        }
+        _this.whitespace$0();
+      }
+    },
+    _tryMinMaxContents$1: function(buffer) {
+      return this._tryMinMaxContents$2$allowComma(buffer, true);
+    },
+    _tryMinMaxFunction$2: function(buffer, $name) {
+      var t1, t2;
+      if (!this.scanIdentifier$1($name))
+        return false;
+      t1 = this.scanner;
+      if (!t1.scanChar$1(40))
+        return false;
+      t2 = buffer._interpolation_buffer$_text;
+      t2._contents += $name;
+      t2._contents += H.Primitives_stringFromCharCode(40);
+      buffer.addInterpolation$1(this._interpolatedDeclarationValue$1$allowEmpty(true));
+      t2._contents += H.Primitives_stringFromCharCode(41);
+      if (!t1.scanChar$1(41))
+        return false;
+      return true;
+    },
+    _tryUrlContents$2$name: function(start, $name) {
+      var t3, t4, buffer, next, t5, endPosition, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      if (!t1.scanChar$1(40))
+        return null;
+      _this.whitespaceWithoutComments$0();
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer(t3, t4);
+      t3._contents = $name == null ? "url" : $name;
+      t3._contents += H.Primitives_stringFromCharCode(40);
+      for (; true;) {
+        next = t1.peekChar$0();
+        if (next == null)
+          break;
+        else {
+          if (next !== 33)
+            if (next !== 37)
+              if (next !== 38)
+                t5 = next >= 42 && next <= 126 || next >= 128;
+              else
+                t5 = true;
+            else
+              t5 = true;
+          else
+            t5 = true;
+          if (t5)
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          else if (next === 92)
+            t3._contents += H.S(_this.escape$0());
+          else if (next === 35)
+            if (t1.peekChar$1(1) === 123) {
+              t5 = _this.singleInterpolation$0();
+              buffer._flushText$0();
+              t4.push(t5);
+            } else
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          else if (next === 32 || next === 9 || next === 10 || next === 13 || next === 12) {
+            _this.whitespaceWithoutComments$0();
+            if (t1.peekChar$0() !== 41)
+              break;
+          } else if (next === 41) {
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            endPosition = t1._string_scanner$_position;
+            t2 = t1._sourceFile;
+            t3 = start.position;
+            t1 = new Y._FileSpan(t2, t3, endPosition);
+            t1._FileSpan$3(t2, t3, endPosition);
+            return buffer.interpolation$1(t1);
+          } else
+            break;
+        }
+      }
+      t1.set$state(new S._SpanScannerState(t1, t2));
+      return null;
+    },
+    _tryUrlContents$1: function(start) {
+      return this._tryUrlContents$2$name(start, null);
+    },
+    dynamicUrl$0: function() {
+      var contents, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      _this.expectIdentifier$1("url");
+      contents = _this._tryUrlContents$1(start);
+      if (contents != null)
+        return new D.StringExpression(contents, false);
+      return new F.FunctionExpression(null, X.Interpolation$(H.setRuntimeTypeInfo(["url"], type$.JSArray_legacy_Object), t1.spanFrom$1(start)), _this._argumentInvocation$0(), t1.spanFrom$1(start));
+    },
+    almostAnyValue$1$omitComments: function(omitComments) {
+      var t4, t5, next, commentStart, end, t6, contents, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        buffer = new Z.InterpolationBuffer(t3, []);
+      $label0$1:
+        for (t4 = t1.string, t5 = !omitComments; true;) {
+          next = t1.peekChar$0();
+          switch (next) {
+            case 92:
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 34:
+            case 39:
+              buffer.addInterpolation$1(_this.interpolatedString$0().asInterpolation$0());
+              break;
+            case 47:
+              commentStart = t1._string_scanner$_position;
+              if (_this.scanComment$0()) {
+                if (t5) {
+                  end = t1._string_scanner$_position;
+                  t3._contents += J.substring$2$s(t4, commentStart, end);
+                }
+              } else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 35:
+              if (t1.peekChar$1(1) === 123)
+                buffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+              else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 13:
+            case 10:
+            case 12:
+              if (_this.get$indented())
+                break $label0$1;
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 33:
+            case 59:
+            case 123:
+            case 125:
+              break $label0$1;
+            case 117:
+            case 85:
+              t6 = t1._string_scanner$_position;
+              if (!_this.scanIdentifier$1("url")) {
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+                break;
+              }
+              contents = _this._tryUrlContents$1(new S._SpanScannerState(t1, t6));
+              if (contents == null) {
+                if (t6 < 0 || t6 > t4.length)
+                  H.throwExpression(P.ArgumentError$("Invalid position " + t6));
+                t1._string_scanner$_position = t6;
+                t1._lastMatch = null;
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              } else
+                buffer.addInterpolation$1(contents);
+              break;
+            default:
+              if (next == null)
+                break $label0$1;
+              if (_this.lookingAtIdentifier$0())
+                t3._contents += _this.identifier$0();
+              else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+          }
+        }
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    almostAnyValue$0: function() {
+      return this.almostAnyValue$1$omitComments(false);
+    },
+    _interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon: function(allowColon, allowEmpty, allowSemicolon) {
+      var t4, t5, t6, wroteNewline, next, t7, start, end, contents, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        buffer = new Z.InterpolationBuffer(t3, []),
+        brackets = H.setRuntimeTypeInfo([], type$.JSArray_legacy_int);
+      $label0$1:
+        for (t4 = t1.string, t5 = !allowColon, t6 = !allowSemicolon, wroteNewline = false; true;) {
+          next = t1.peekChar$0();
+          switch (next) {
+            case 92:
+              t3._contents += H.S(_this.escape$1$identifierStart(true));
+              wroteNewline = false;
+              break;
+            case 34:
+            case 39:
+              buffer.addInterpolation$1(_this.interpolatedString$0().asInterpolation$0());
+              wroteNewline = false;
+              break;
+            case 47:
+              if (t1.peekChar$1(1) === 42) {
+                t7 = _this.get$loudComment();
+                start = t1._string_scanner$_position;
+                t7.call$0();
+                end = t1._string_scanner$_position;
+                t3._contents += J.substring$2$s(t4, start, end);
+              } else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 35:
+              if (t1.peekChar$1(1) === 123)
+                buffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+              else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 32:
+            case 9:
+              if (!wroteNewline) {
+                t7 = t1.peekChar$1(1);
+                t7 = !(t7 === 32 || t7 === 9 || t7 === 10 || t7 === 13 || t7 === 12);
+              } else
+                t7 = true;
+              if (t7)
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              else
+                t1.readChar$0();
+              break;
+            case 10:
+            case 13:
+            case 12:
+              if (_this.get$indented())
+                break $label0$1;
+              t7 = t1.peekChar$1(-1);
+              if (!(t7 === 10 || t7 === 13 || t7 === 12))
+                t3._contents += "\n";
+              t1.readChar$0();
+              wroteNewline = true;
+              break;
+            case 40:
+            case 123:
+            case 91:
+              t3._contents += H.Primitives_stringFromCharCode(next);
+              brackets.push(T.opposite(t1.readChar$0()));
+              wroteNewline = false;
+              break;
+            case 41:
+            case 125:
+            case 93:
+              if (brackets.length === 0)
+                break $label0$1;
+              t3._contents += H.Primitives_stringFromCharCode(next);
+              t1.expectChar$1(brackets.pop());
+              wroteNewline = false;
+              break;
+            case 59:
+              if (t6 && brackets.length === 0)
+                break $label0$1;
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 58:
+              if (t5 && brackets.length === 0)
+                break $label0$1;
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 117:
+            case 85:
+              t7 = t1._string_scanner$_position;
+              if (!_this.scanIdentifier$1("url")) {
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+                wroteNewline = false;
+                break;
+              }
+              contents = _this._tryUrlContents$1(new S._SpanScannerState(t1, t7));
+              if (contents == null) {
+                if (t7 < 0 || t7 > t4.length)
+                  H.throwExpression(P.ArgumentError$("Invalid position " + t7));
+                t1._string_scanner$_position = t7;
+                t1._lastMatch = null;
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              } else
+                buffer.addInterpolation$1(contents);
+              wroteNewline = false;
+              break;
+            default:
+              if (next == null)
+                break $label0$1;
+              if (_this.lookingAtIdentifier$0())
+                t3._contents += _this.identifier$0();
+              else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+          }
+        }
+      if (brackets.length !== 0)
+        t1.expectChar$1(C.JSArray_methods.get$last(brackets));
+      if (!allowEmpty && buffer._interpolation_buffer$_contents.length === 0 && t3._contents.length === 0)
+        t1.error$1(0, "Expected token.");
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _interpolatedDeclarationValue$1$allowEmpty: function(allowEmpty) {
+      return this._interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon(true, allowEmpty, false);
+    },
+    _interpolatedDeclarationValue$2$allowEmpty$allowSemicolon: function(allowEmpty, allowSemicolon) {
+      return this._interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon(true, allowEmpty, allowSemicolon);
+    },
+    _interpolatedDeclarationValue$0: function() {
+      return this._interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon(true, false, false);
+    },
+    interpolatedIdentifier$0: function() {
+      var first, _this = this,
+        _s20_ = "Expected identifier.",
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        t2 = new P.StringBuffer(""),
+        t3 = [],
+        buffer = new Z.InterpolationBuffer(t2, t3);
+      if (t1.scanChar$1(45)) {
+        t2._contents += H.Primitives_stringFromCharCode(45);
+        if (t1.scanChar$1(45)) {
+          t2._contents += H.Primitives_stringFromCharCode(45);
+          _this._interpolatedIdentifierBody$1(buffer);
+          return buffer.interpolation$1(t1.spanFrom$1(start));
+        }
+      }
+      first = t1.peekChar$0();
+      if (first == null)
+        t1.error$1(0, _s20_);
+      else if (first === 95 || T.isAlphabetic0(first) || first >= 128)
+        t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+      else if (first === 92)
+        t2._contents += H.S(_this.escape$1$identifierStart(true));
+      else if (first === 35 && t1.peekChar$1(1) === 123) {
+        t2 = _this.singleInterpolation$0();
+        buffer._flushText$0();
+        t3.push(t2);
+      } else
+        t1.error$1(0, _s20_);
+      _this._interpolatedIdentifierBody$1(buffer);
+      return buffer.interpolation$1(t1.spanFrom$1(start));
+    },
+    _interpolatedIdentifierBody$1: function(buffer) {
+      var t1, t2, t3, next, t4;
+      for (t1 = buffer._interpolation_buffer$_contents, t2 = this.scanner, t3 = buffer._interpolation_buffer$_text; true;) {
+        next = t2.peekChar$0();
+        if (next == null)
+          break;
+        else {
+          if (next !== 95)
+            if (next !== 45) {
+              if (!(next >= 97 && next <= 122))
+                t4 = next >= 65 && next <= 90;
+              else
+                t4 = true;
+              if (!t4)
+                t4 = next >= 48 && next <= 57;
+              else
+                t4 = true;
+              t4 = t4 || next >= 128;
+            } else
+              t4 = true;
+          else
+            t4 = true;
+          if (t4)
+            t3._contents += H.Primitives_stringFromCharCode(t2.readChar$0());
+          else if (next === 92)
+            t3._contents += H.S(this.escape$0());
+          else if (next === 35 && t2.peekChar$1(1) === 123) {
+            t4 = this.singleInterpolation$0();
+            buffer._flushText$0();
+            t1.push(t4);
+          } else
+            break;
+        }
+      }
+    },
+    singleInterpolation$0: function() {
+      var contents, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expect$1("#{");
+      _this.whitespace$0();
+      contents = _this.expression$0();
+      t1.expectChar$1(125);
+      if (_this.get$plainCss())
+        _this.error$2(0, string$.Interpp, t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+      return contents;
+    },
+    _mediaQueryList$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        buffer = new Z.InterpolationBuffer(t3, []);
+      for (; true;) {
+        this.whitespace$0();
+        this._stylesheet$_mediaQuery$1(buffer);
+        if (!t1.scanChar$1(44))
+          break;
+        t3._contents += H.Primitives_stringFromCharCode(44);
+        t3._contents += H.Primitives_stringFromCharCode(32);
+      }
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _stylesheet$_mediaQuery$1: function(buffer) {
+      var t1, identifier, _this = this;
+      if (_this.scanner.peekChar$0() !== 40) {
+        buffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+        _this.whitespace$0();
+        if (!_this._lookingAtInterpolatedIdentifier$0())
+          return;
+        t1 = buffer._interpolation_buffer$_text;
+        t1._contents += H.Primitives_stringFromCharCode(32);
+        identifier = _this.interpolatedIdentifier$0();
+        _this.whitespace$0();
+        if (B.equalsIgnoreCase(identifier.get$asPlain(), "and"))
+          t1._contents += " and ";
+        else {
+          buffer.addInterpolation$1(identifier);
+          if (_this.scanIdentifier$1("and")) {
+            _this.whitespace$0();
+            t1._contents += " and ";
+          } else
+            return;
+        }
+      }
+      for (t1 = buffer._interpolation_buffer$_text; true;) {
+        _this.whitespace$0();
+        buffer.addInterpolation$1(_this._mediaFeature$0());
+        _this.whitespace$0();
+        if (!_this.scanIdentifier$1("and"))
+          break;
+        t1._contents += " and ";
+      }
+    },
+    _mediaFeature$0: function() {
+      var interpolation, t2, t3, t4, buffer, t5, next, isAngle, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() === 35) {
+        interpolation = _this.singleInterpolation$0();
+        return X.Interpolation$(H.setRuntimeTypeInfo([interpolation], type$.JSArray_legacy_Object), interpolation.get$span());
+      }
+      t2 = t1._string_scanner$_position;
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer(t3, t4);
+      t1.expectChar$1(40);
+      t3._contents += H.Primitives_stringFromCharCode(40);
+      _this.whitespace$0();
+      t5 = _this._expressionUntilComparison$0();
+      buffer._flushText$0();
+      t4.push(t5);
+      if (t1.scanChar$1(58)) {
+        _this.whitespace$0();
+        t3._contents += H.Primitives_stringFromCharCode(58);
+        t3._contents += H.Primitives_stringFromCharCode(32);
+        t5 = _this.expression$0();
+        buffer._flushText$0();
+        t4.push(t5);
+      } else {
+        next = t1.peekChar$0();
+        isAngle = next === 60 || next === 62;
+        if (isAngle || next === 61) {
+          t3._contents += H.Primitives_stringFromCharCode(32);
+          t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          if (isAngle && t1.scanChar$1(61))
+            t3._contents += H.Primitives_stringFromCharCode(61);
+          t3._contents += H.Primitives_stringFromCharCode(32);
+          _this.whitespace$0();
+          t5 = _this._expressionUntilComparison$0();
+          buffer._flushText$0();
+          t4.push(t5);
+          if (isAngle && t1.scanChar$1(next)) {
+            t3._contents += H.Primitives_stringFromCharCode(32);
+            t3._contents += H.Primitives_stringFromCharCode(next);
+            if (t1.scanChar$1(61))
+              t3._contents += H.Primitives_stringFromCharCode(61);
+            t3._contents += H.Primitives_stringFromCharCode(32);
+            _this.whitespace$0();
+            t5 = _this._expressionUntilComparison$0();
+            buffer._flushText$0();
+            t4.push(t5);
+          }
+        }
+      }
+      t1.expectChar$1(41);
+      _this.whitespace$0();
+      t3._contents += H.Primitives_stringFromCharCode(41);
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _expressionUntilComparison$0: function() {
+      return this.expression$1$until(new V.StylesheetParser__expressionUntilComparison_closure(this));
+    },
+    _supportsCondition$0: function() {
+      var condition, operator, right, endPosition, t3, t4, lowerOperator, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      if (_this.scanIdentifier$1("not")) {
+        _this.whitespace$0();
+        return new M.SupportsNegation(_this._supportsConditionInParens$0(), t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+      }
+      condition = _this._supportsConditionInParens$0();
+      _this.whitespace$0();
+      for (operator = null; _this.lookingAtIdentifier$0();) {
+        if (operator != null)
+          _this.expectIdentifier$1(operator);
+        else if (_this.scanIdentifier$1("or"))
+          operator = "or";
+        else {
+          _this.expectIdentifier$1("and");
+          operator = "and";
+        }
+        _this.whitespace$0();
+        right = _this._supportsConditionInParens$0();
+        endPosition = t1._string_scanner$_position;
+        t3 = t1._sourceFile;
+        t4 = new Y._FileSpan(t3, t2, endPosition);
+        t4._FileSpan$3(t3, t2, endPosition);
+        condition = new U.SupportsOperation(condition, right, operator, t4);
+        lowerOperator = operator.toLowerCase();
+        if (lowerOperator !== "and" && lowerOperator !== "or")
+          H.throwExpression(P.ArgumentError$value(operator, "operator", 'may only be "and" or "or".'));
+        _this.whitespace$0();
+      }
+      return condition;
+    },
+    _supportsConditionInParens$0: function() {
+      var $name, nameStart, wasInParentheses, identifier, operation, contents, identifier0, t2, $arguments, condition, exception, value, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      if (_this._lookingAtInterpolatedIdentifier$0()) {
+        identifier0 = _this.interpolatedIdentifier$0();
+        t2 = identifier0.get$asPlain();
+        if ((t2 == null ? null : t2.toLowerCase()) === "not")
+          _this.error$2(0, '"not" is not a valid identifier here.', identifier0.span);
+        if (t1.scanChar$1(40)) {
+          $arguments = _this._interpolatedDeclarationValue$2$allowEmpty$allowSemicolon(true, true);
+          t1.expectChar$1(41);
+          return new F.SupportsFunction(identifier0, $arguments, t1.spanFrom$1(start));
+        } else {
+          t2 = identifier0.contents;
+          if (t2.length !== 1 || !type$.legacy_Expression._is(C.JSArray_methods.get$first(t2)))
+            _this.error$2(0, "Expected @supports condition.", identifier0.span);
+          else
+            return new X.SupportsInterpolation(type$.legacy_Expression._as(C.JSArray_methods.get$first(t2)), t1.spanFrom$1(start));
+        }
+      }
+      t1.expectChar$1(40);
+      _this.whitespace$0();
+      if (_this.scanIdentifier$1("not")) {
+        _this.whitespace$0();
+        condition = _this._supportsConditionInParens$0();
+        t1.expectChar$1(41);
+        return new M.SupportsNegation(condition, t1.spanFrom$1(start));
+      } else if (t1.peekChar$0() === 40) {
+        condition = _this._supportsCondition$0();
+        t1.expectChar$1(41);
+        return condition;
+      }
+      $name = null;
+      nameStart = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      wasInParentheses = _this._inParentheses;
+      try {
+        $name = _this.expression$0();
+        t1.expectChar$1(58);
+      } catch (exception) {
+        if (type$.legacy_FormatException._is(H.unwrapException(exception))) {
+          t1.set$state(nameStart);
+          _this._inParentheses = wasInParentheses;
+          identifier = _this.interpolatedIdentifier$0();
+          operation = _this._trySupportsOperation$2(identifier, nameStart);
+          if (operation != null) {
+            t1.expectChar$1(41);
+            return operation;
+          }
+          t2 = new Z.InterpolationBuffer(new P.StringBuffer(""), []);
+          t2.addInterpolation$1(identifier);
+          t2.addInterpolation$1(_this._interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon(false, true, true));
+          contents = t2.interpolation$1(t1.spanFrom$1(nameStart));
+          if (t1.peekChar$0() === 58)
+            throw exception;
+          t1.expectChar$1(41);
+          return new Y.SupportsAnything(contents, t1.spanFrom$1(start));
+        } else
+          throw exception;
+      }
+      _this.whitespace$0();
+      value = _this.expression$0();
+      t1.expectChar$1(41);
+      return new L.SupportsDeclaration($name, value, t1.spanFrom$1(start));
+    },
+    _trySupportsOperation$2: function(interpolation, start) {
+      var expression, beforeWhitespace, t2, t3, operator, operation, right, t4, endPosition, t5, t6, lowerOperator, _this = this, _null = null,
+        t1 = interpolation.contents;
+      if (t1.length !== 1)
+        return _null;
+      expression = C.JSArray_methods.get$first(t1);
+      if (!type$.legacy_Expression._is(expression))
+        return _null;
+      t1 = _this.scanner;
+      beforeWhitespace = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      _this.whitespace$0();
+      for (t2 = start.position, t3 = interpolation.span, operator = _null, operation = operator; _this.lookingAtIdentifier$0();) {
+        if (operator != null)
+          _this.expectIdentifier$1(operator);
+        else if (_this.scanIdentifier$1("and"))
+          operator = "and";
+        else {
+          if (!_this.scanIdentifier$1("or")) {
+            if (beforeWhitespace._scanner !== t1)
+              H.throwExpression(P.ArgumentError$(string$.The_gi));
+            t2 = beforeWhitespace.position;
+            if (t2 < 0 || t2 > t1.string.length)
+              H.throwExpression(P.ArgumentError$("Invalid position " + t2));
+            t1._string_scanner$_position = t2;
+            return t1._lastMatch = null;
+          }
+          operator = "or";
+        }
+        _this.whitespace$0();
+        right = _this._supportsConditionInParens$0();
+        t4 = operation == null ? new X.SupportsInterpolation(expression, t3) : operation;
+        endPosition = t1._string_scanner$_position;
+        t5 = t1._sourceFile;
+        t6 = new Y._FileSpan(t5, t2, endPosition);
+        t6._FileSpan$3(t5, t2, endPosition);
+        operation = new U.SupportsOperation(t4, right, operator, t6);
+        lowerOperator = operator.toLowerCase();
+        if (lowerOperator !== "and" && lowerOperator !== "or")
+          H.throwExpression(P.ArgumentError$value(operator, "operator", 'may only be "and" or "or".'));
+        _this.whitespace$0();
+      }
+      return operation;
+    },
+    _lookingAtInterpolatedIdentifier$0: function() {
+      var second,
+        t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first == null)
+        return false;
+      if (first === 95 || T.isAlphabetic0(first) || first >= 128 || first === 92)
+        return true;
+      if (first === 35)
+        return t1.peekChar$1(1) === 123;
+      if (first !== 45)
+        return false;
+      second = t1.peekChar$1(1);
+      if (second == null)
+        return false;
+      if (second === 35)
+        return t1.peekChar$1(2) === 123;
+      return second === 95 || T.isAlphabetic0(second) || second >= 128 || second === 92 || second === 45;
+    },
+    _lookingAtInterpolatedIdentifierBody$0: function() {
+      var t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first == null)
+        return false;
+      if (first === 95 || T.isAlphabetic0(first) || first >= 128 || T.isDigit(first) || first === 45 || first === 92)
+        return true;
+      return first === 35 && t1.peekChar$1(1) === 123;
+    },
+    _lookingAtExpression$0: function() {
+      var next,
+        t1 = this.scanner,
+        character = t1.peekChar$0();
+      if (character == null)
+        return false;
+      if (character === 46)
+        return t1.peekChar$1(1) !== 46;
+      if (character === 33) {
+        next = t1.peekChar$1(1);
+        if (next != null)
+          if ((next | 32) !== 105)
+            t1 = next === 32 || next === 9 || T.isNewline(next);
+          else
+            t1 = true;
+        else
+          t1 = true;
+        return t1;
+      }
+      if (character !== 40)
+        if (character !== 47)
+          if (character !== 91)
+            if (character !== 39)
+              if (character !== 34)
+                if (character !== 35)
+                  if (character !== 43)
+                    if (character !== 45)
+                      if (character !== 92)
+                        if (character !== 36)
+                          if (character !== 38)
+                            t1 = character === 95 || T.isAlphabetic0(character) || character >= 128 || T.isDigit(character);
+                          else
+                            t1 = true;
+                        else
+                          t1 = true;
+                      else
+                        t1 = true;
+                    else
+                      t1 = true;
+                  else
+                    t1 = true;
+                else
+                  t1 = true;
+              else
+                t1 = true;
+            else
+              t1 = true;
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    _withChildren$1$3: function(child, start, create) {
+      var result = create.call$2(this.children$1(0, child), this.scanner.spanFrom$1(start));
+      this.whitespaceWithoutComments$0();
+      return result;
+    },
+    _withChildren$3: function(child, start, create) {
+      return this._withChildren$1$3(child, start, create, type$.dynamic);
+    },
+    _urlString$0: function() {
+      var innerError, t2, exception,
+        t1 = this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        url = this.string$0();
+      try {
+        t2 = P.Uri_parse(url);
+        return t2;
+      } catch (exception) {
+        t2 = H.unwrapException(exception);
+        if (type$.legacy_FormatException._is(t2)) {
+          innerError = t2;
+          this.error$2(0, "Invalid URL: " + H.S(J.get$message$x(innerError)), t1.spanFrom$1(start));
+        } else
+          throw exception;
+      }
+    },
+    _publicIdentifier$0: function() {
+      var _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        result = _this.identifier$1$normalize(true);
+      _this._assertPublic$2(result, new V.StylesheetParser__publicIdentifier_closure(_this, new S._SpanScannerState(t1, t2)));
+      return result;
+    },
+    _assertPublic$2: function(identifier, span) {
+      if (!T.isPrivate(identifier))
+        return;
+      this.error$2(0, string$.Privat, span.call$0());
+    },
+    get$plainCss: function() {
+      return false;
+    }
+  };
+  V.StylesheetParser_parse_closure.prototype = {
+    call$0: function() {
+      var statements, t4,
+        t1 = this.$this,
+        t2 = t1.scanner,
+        t3 = t2._string_scanner$_position;
+      t2.scanChar$1(65279);
+      statements = t1.statements$1(new V.StylesheetParser_parse__closure(t1));
+      t2.expectDone$0();
+      t4 = t1._globalVariables;
+      t4 = t4.get$values(t4);
+      C.JSArray_methods.addAll$1(statements, H.MappedIterable_MappedIterable(t4, new V.StylesheetParser_parse__closure0(), H._instanceType(t4)._eval$1("Iterable.E"), type$.legacy_Statement));
+      return V.Stylesheet$(statements, t2.spanFrom$1(new S._SpanScannerState(t2, t3)), t1.get$plainCss());
+    },
+    $signature: 59
+  };
+  V.StylesheetParser_parse__closure.prototype = {
+    call$0: function() {
+      return this.$this._statement$1$root(true);
+    },
+    $signature: 57
+  };
+  V.StylesheetParser_parse__closure0.prototype = {
+    call$1: function(declaration) {
+      return Z.VariableDeclaration$(declaration.name, new O.NullExpression(declaration.expression.get$span()), declaration.span, null, false, true, null);
+    },
+    $signature: 256
+  };
+  V.StylesheetParser_parseArgumentDeclaration_closure.prototype = {
+    call$0: function() {
+      var $arguments,
+        t1 = this.$this,
+        t2 = t1.scanner;
+      t2.expectChar$2$name(64, "@-rule");
+      t1.identifier$0();
+      t1.whitespace$0();
+      t1.identifier$0();
+      $arguments = t1._argumentDeclaration$0();
+      t1.whitespace$0();
+      t2.expectChar$1(123);
+      return $arguments;
+    },
+    $signature: 250
+  };
+  V.StylesheetParser_parseVariableDeclaration_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      return t1.lookingAtIdentifier$0() ? t1._variableDeclarationWithNamespace$0() : t1.variableDeclarationWithoutNamespace$0();
+    },
+    $signature: 187
+  };
+  V.StylesheetParser_parseUseRule_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1.scanner,
+        t3 = t2._string_scanner$_position;
+      t2.expectChar$2$name(64, "@-rule");
+      t1.expectIdentifier$1("use");
+      t1.whitespace$0();
+      return t1._useRule$1(new S._SpanScannerState(t2, t3));
+    },
+    $signature: 244
+  };
+  V.StylesheetParser__parseSingleProduction_closure.prototype = {
+    call$0: function() {
+      var result = this.production.call$0();
+      this.$this.scanner.expectDone$0();
+      return result;
+    },
+    $signature: function() {
+      return this.T._eval$1("0*()");
+    }
+  };
+  V.StylesheetParser__statement_closure.prototype = {
+    call$0: function() {
+      return this.$this._statement$0();
+    },
+    $signature: 57
+  };
+  V.StylesheetParser_variableDeclarationWithoutNamespace_closure.prototype = {
+    call$0: function() {
+      return this.$this.scanner.spanFrom$1(this._box_0.start);
+    },
+    $signature: 33
+  };
+  V.StylesheetParser_variableDeclarationWithoutNamespace_closure0.prototype = {
+    call$0: function() {
+      return this.declaration;
+    },
+    $signature: 187
+  };
+  V.StylesheetParser__declarationOrBuffer_closure.prototype = {
+    call$2: function(children, span) {
+      return L.Declaration$(this.name, span, children, null);
+    },
+    $signature: 67
+  };
+  V.StylesheetParser__declarationOrBuffer_closure0.prototype = {
+    call$2: function(children, span) {
+      return L.Declaration$(this.name, span, children, this._box_0.value);
+    },
+    $signature: 67
+  };
+  V.StylesheetParser__styleRule_closure.prototype = {
+    call$2: function(children, span) {
+      var t2, _this = this,
+        t1 = _this.$this;
+      if (t1.get$indented() && children.length === 0)
+        t1.logger.warn$2$span(0, string$.This_s, _this._box_0.interpolation.span);
+      t1._inStyleRule = _this.wasInStyleRule;
+      t2 = _this._box_0;
+      return X.StyleRule$(t2.interpolation, children, t1.scanner.spanFrom$1(t2.start));
+    },
+    $signature: 240
+  };
+  V.StylesheetParser__propertyOrVariableDeclaration_closure.prototype = {
+    call$2: function(children, span) {
+      return L.Declaration$(this._box_0.name, span, children, null);
+    },
+    $signature: 67
+  };
+  V.StylesheetParser__propertyOrVariableDeclaration_closure0.prototype = {
+    call$2: function(children, span) {
+      return L.Declaration$(this._box_0.name, span, children, this.value);
+    },
+    $signature: 67
+  };
+  V.StylesheetParser__atRootRule_closure.prototype = {
+    call$2: function(children, span) {
+      return V.AtRootRule$(children, span, this.query);
+    },
+    $signature: 192
+  };
+  V.StylesheetParser__atRootRule_closure0.prototype = {
+    call$2: function(children, span) {
+      return V.AtRootRule$(children, span, null);
+    },
+    $signature: 192
+  };
+  V.StylesheetParser__eachRule_closure.prototype = {
+    call$2: function(children, span) {
+      var _this = this;
+      _this.$this._inControlDirective = _this.wasInControlDirective;
+      return V.EachRule$(_this.variables, _this.list, children, span);
+    },
+    $signature: 236
+  };
+  V.StylesheetParser__functionRule_closure.prototype = {
+    call$2: function(children, span) {
+      return M.FunctionRule$(this.name, this.$arguments, children, span, this.precedingComment);
+    },
+    $signature: 235
+  };
+  V.StylesheetParser__forRule_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      if (!t1.lookingAtIdentifier$0())
+        return false;
+      if (t1.scanIdentifier$1("to"))
+        return this._box_0.exclusive = true;
+      else if (t1.scanIdentifier$1("through")) {
+        this._box_0.exclusive = false;
+        return true;
+      } else
+        return false;
+    },
+    $signature: 35
+  };
+  V.StylesheetParser__forRule_closure0.prototype = {
+    call$2: function(children, span) {
+      var _this = this;
+      _this.$this._inControlDirective = _this.wasInControlDirective;
+      return B.ForRule$(_this.variable, _this.from, _this.to, children, span, _this._box_0.exclusive);
+    },
+    $signature: 234
+  };
+  V.StylesheetParser__memberList_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      if (t1.scanner.peekChar$0() === 36)
+        this.variables.add$1(0, t1.variableName$0());
+      else
+        this.identifiers.add$1(0, t1.identifier$1$normalize(true));
+    },
+    $signature: 0
+  };
+  V.StylesheetParser__includeRule_closure.prototype = {
+    call$2: function(children, span) {
+      return Y.ContentBlock$(this._box_0.contentArguments, children, span);
+    },
+    $signature: 233
+  };
+  V.StylesheetParser_mediaRule_closure.prototype = {
+    call$2: function(children, span) {
+      return G.MediaRule$(this.query, children, span);
+    },
+    $signature: 231
+  };
+  V.StylesheetParser__mixinRule_closure.prototype = {
+    call$2: function(children, span) {
+      var _this = this,
+        t1 = _this.$this,
+        hadContent = t1._mixinHasContent;
+      t1._stylesheet$_inMixin = false;
+      t1._mixinHasContent = null;
+      return T.MixinRule$(_this.name, _this.$arguments, children, span, _this.precedingComment, hadContent);
+    },
+    $signature: 229
+  };
+  V.StylesheetParser_mozDocumentRule_closure.prototype = {
+    call$2: function(children, span) {
+      var _this = this;
+      if (_this._box_0.needsDeprecationWarning)
+        _this.$this.logger.warn$3$deprecation$span(0, string$.x40_moz_, true, span);
+      return U.AtRule$(_this.name, span, children, _this.value);
+    },
+    $signature: 199
+  };
+  V.StylesheetParser_supportsRule_closure.prototype = {
+    call$2: function(children, span) {
+      return B.SupportsRule$(this.condition, children, span);
+    },
+    $signature: 228
+  };
+  V.StylesheetParser__whileRule_closure.prototype = {
+    call$2: function(children, span) {
+      this.$this._inControlDirective = this.wasInControlDirective;
+      return G.WhileRule$(this.condition, children, span);
+    },
+    $signature: 227
+  };
+  V.StylesheetParser_unknownAtRule_closure.prototype = {
+    call$2: function(children, span) {
+      return U.AtRule$(this.name, span, children, this._box_0.value);
+    },
+    $signature: 199
+  };
+  V.StylesheetParser_expression_resetState.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this._box_0;
+      t1.operands = t1.operators = t1.spaceExpressions = t1.commaExpressions = null;
+      t2 = this.$this;
+      t2.scanner.set$state(this.start);
+      t1.allowSlash = t2.lookingAtNumber$0();
+      t1.singleExpression = t2._singleExpression$0();
+    },
+    $signature: 1
+  };
+  V.StylesheetParser_expression_resolveOneOperation.prototype = {
+    call$0: function() {
+      var t2, t3,
+        t1 = this._box_0,
+        operator = t1.operators.pop();
+      if (operator !== C.BinaryOperator_RTB)
+        t1.allowSlash = false;
+      t2 = t1.allowSlash && !this.$this._inParentheses;
+      t3 = t1.operands;
+      if (t2)
+        t1.singleExpression = new V.BinaryOperationExpression(C.BinaryOperator_RTB, t3.pop(), t1.singleExpression, true);
+      else
+        t1.singleExpression = new V.BinaryOperationExpression(operator, t3.pop(), t1.singleExpression, false);
+    },
+    $signature: 1
+  };
+  V.StylesheetParser_expression_resolveOperations.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this._box_0;
+      if (t1.operators == null)
+        return;
+      for (t2 = this.resolveOneOperation; t1.operators.length !== 0;)
+        t2.call$0();
+    },
+    $signature: 1
+  };
+  V.StylesheetParser_expression_addSingleExpression.prototype = {
+    call$2$number: function(expression, number) {
+      var t2, _this = this,
+        t1 = _this._box_0;
+      if (t1.singleExpression != null) {
+        t2 = _this.$this;
+        if (t2._inParentheses) {
+          t2._inParentheses = false;
+          if (t1.allowSlash) {
+            _this.resetState.call$0();
+            return;
+          }
+        }
+        if (t1.spaceExpressions == null)
+          t1.spaceExpressions = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression);
+        _this.resolveOperations.call$0();
+        t1.spaceExpressions.push(t1.singleExpression);
+        t1.allowSlash = number;
+      } else if (!number)
+        t1.allowSlash = false;
+      t1.singleExpression = expression;
+    },
+    call$1: function(expression) {
+      return this.call$2$number(expression, false);
+    },
+    $signature: 226
+  };
+  V.StylesheetParser_expression_addOperator.prototype = {
+    call$1: function(operator) {
+      var t2, t3, t4, t5, singleExpression,
+        t1 = this.$this;
+      if (t1.get$plainCss() && operator !== C.BinaryOperator_RTB && operator !== C.BinaryOperator_kjl) {
+        t2 = t1.scanner;
+        t3 = operator.operator.length;
+        t2.error$3$length$position(0, "Operators aren't allowed in plain CSS.", t3, t2._string_scanner$_position - t3);
+      }
+      t2 = this._box_0;
+      t2.allowSlash = t2.allowSlash && operator === C.BinaryOperator_RTB;
+      if (t2.operators == null)
+        t2.operators = H.setRuntimeTypeInfo([], type$.JSArray_legacy_BinaryOperator);
+      if (t2.operands == null)
+        t2.operands = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression);
+      t3 = this.resolveOneOperation;
+      t4 = operator.precedence;
+      while (true) {
+        t5 = t2.operators;
+        if (!(t5.length !== 0 && C.JSArray_methods.get$last(t5).precedence >= t4))
+          break;
+        t3.call$0();
+      }
+      t2.operators.push(operator);
+      t2.operands.push(t2.singleExpression);
+      t1.whitespace$0();
+      t2.allowSlash = t2.allowSlash && t1.lookingAtNumber$0();
+      singleExpression = t1._singleExpression$0();
+      t2.singleExpression = singleExpression;
+      t2.allowSlash = t2.allowSlash && singleExpression instanceof T.NumberExpression;
+    },
+    $signature: 225
+  };
+  V.StylesheetParser_expression_resolveSpaceExpressions.prototype = {
+    call$0: function() {
+      var t1, t2;
+      this.resolveOperations.call$0();
+      t1 = this._box_0;
+      t2 = t1.spaceExpressions;
+      if (t2 != null) {
+        t2.push(t1.singleExpression);
+        t1.singleExpression = D.ListExpression$(t1.spaceExpressions, C.ListSeparator_space, false, null);
+        t1.spaceExpressions = null;
+      }
+    },
+    $signature: 1
+  };
+  V.StylesheetParser__expressionUntilComma_closure.prototype = {
+    call$0: function() {
+      return this.$this.scanner.peekChar$0() === 44;
+    },
+    $signature: 35
+  };
+  V.StylesheetParser__unicodeRange_closure.prototype = {
+    call$1: function(char) {
+      return char != null && T.isHex(char);
+    },
+    $signature: 24
+  };
+  V.StylesheetParser__unicodeRange_closure0.prototype = {
+    call$1: function(char) {
+      return char != null && T.isHex(char);
+    },
+    $signature: 24
+  };
+  V.StylesheetParser_identifierLike_closure.prototype = {
+    call$0: function() {
+      return this.$this.scanner.spanFrom$1(this.start);
+    },
+    $signature: 33
+  };
+  V.StylesheetParser__expressionUntilComparison_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this.scanner,
+        next = t1.peekChar$0();
+      if (next === 61)
+        return t1.peekChar$1(1) !== 61;
+      return next === 60 || next === 62;
+    },
+    $signature: 35
+  };
+  V.StylesheetParser__publicIdentifier_closure.prototype = {
+    call$0: function() {
+      return this.$this.scanner.spanFrom$1(this.start);
+    },
+    $signature: 33
+  };
+  M.StylesheetGraph.prototype = {
+    modifiedSince$3: function(url, since, baseImporter) {
+      var node = this._stylesheet_graph$_add$3(url, baseImporter, null);
+      if (node == null)
+        return true;
+      return new M.StylesheetGraph_modifiedSince_transitiveModificationTime(this).call$1(node)._value > since._value;
+    },
+    _stylesheet_graph$_add$3: function(url, baseImporter, baseUrl) {
+      var t1, t2, _this = this,
+        tuple = _this._ignoreErrors$1(new M.StylesheetGraph__add_closure(_this, url, baseImporter, baseUrl));
+      if (tuple == null)
+        return null;
+      t1 = tuple.item1;
+      t2 = tuple.item2;
+      _this.addCanonical$3(t1, t2, tuple.item3);
+      return _this._nodes.$index(0, t2);
+    },
+    addCanonical$4$recanonicalize: function(importer, canonicalUrl, originalUrl, recanonicalize) {
+      var stylesheet, _this = this,
+        t1 = _this._nodes;
+      if (t1.$index(0, canonicalUrl) != null)
+        return C.Set_empty1;
+      stylesheet = _this._ignoreErrors$1(new M.StylesheetGraph_addCanonical_closure(_this, importer, canonicalUrl, originalUrl));
+      if (stylesheet == null)
+        return C.Set_empty1;
+      t1.$indexSet(0, canonicalUrl, M.StylesheetNode$_(stylesheet, importer, canonicalUrl, _this._upstreamNodes$3(stylesheet, importer, canonicalUrl)));
+      return recanonicalize ? _this._recanonicalizeImports$2(importer, canonicalUrl) : C.Set_empty1;
+    },
+    addCanonical$3: function(importer, canonicalUrl, originalUrl) {
+      return this.addCanonical$4$recanonicalize(importer, canonicalUrl, originalUrl, true);
+    },
+    _upstreamNodes$3: function(stylesheet, baseImporter, baseUrl) {
+      var t4, t5, t6, t7,
+        t1 = type$.legacy_Uri,
+        active = P.LinkedHashSet_LinkedHashSet$_literal([baseUrl], t1),
+        t2 = type$.JSArray_legacy_Uri,
+        t3 = H.setRuntimeTypeInfo([], t2);
+      t2 = H.setRuntimeTypeInfo([], t2);
+      new F._FindDependenciesVisitor(t3, t2).visitChildren$1(stylesheet);
+      t4 = type$.legacy_StylesheetNode;
+      t5 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t4);
+      for (t6 = C.JSArray_methods.get$iterator(t3); t6.moveNext$0();) {
+        t7 = t6.get$current(t6);
+        t5.$indexSet(0, t7, this._nodeFor$4(t7, baseImporter, baseUrl, active));
+      }
+      t1 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t4);
+      for (t2 = J.get$iterator$ax(new S.Tuple2(t3, t2, type$.Tuple2_of_legacy_List_legacy_Uri_and_legacy_List_legacy_Uri).item2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t1.$indexSet(0, t3, this._nodeFor$5$forImport(t3, baseImporter, baseUrl, active, true));
+      }
+      return new S.Tuple2(t5, t1, type$.Tuple2_of_legacy_Map_of_legacy_Uri_and_legacy_StylesheetNode_and_legacy_Map_of_legacy_Uri_and_legacy_StylesheetNode);
+    },
+    reload$1: function(canonicalUrl) {
+      var stylesheet, upstream, _this = this,
+        node = _this._nodes.$index(0, canonicalUrl);
+      if (node == null)
+        throw H.wrapException(P.StateError$(canonicalUrl.toString$0(0) + " is not in the dependency graph."));
+      _this._transitiveModificationTimes.clear$0(0);
+      _this.importCache.clearImport$1(canonicalUrl);
+      stylesheet = _this._ignoreErrors$1(new M.StylesheetGraph_reload_closure(_this, node, canonicalUrl));
+      if (stylesheet == null)
+        return false;
+      node._stylesheet_graph$_stylesheet = stylesheet;
+      upstream = _this._upstreamNodes$3(stylesheet, node.importer, canonicalUrl);
+      node._replaceUpstream$2(upstream.item1, upstream.item2);
+      return true;
+    },
+    _recanonicalizeImports$2: function(importer, canonicalUrl) {
+      var t2, t3, t4, t5, newUpstream, newUpstreamImports, _this = this,
+        t1 = type$.legacy_StylesheetNode,
+        changed = P.LinkedHashSet_LinkedHashSet$_empty(t1);
+      for (t2 = _this._nodes, t3 = type$.UnmodifiableMapView_of_legacy_Uri_and_legacy_StylesheetNode, t2 = t2.get$values(t2), t2 = t2.get$iterator(t2), t4 = type$.legacy_Uri; t2.moveNext$0();) {
+        t5 = t2.get$current(t2);
+        newUpstream = _this._recanonicalizeImportsForNode$4$forImport(t5, importer, canonicalUrl, false);
+        newUpstreamImports = _this._recanonicalizeImportsForNode$4$forImport(t5, importer, canonicalUrl, true);
+        if (newUpstream.get$isNotEmpty(newUpstream) || newUpstreamImports.get$isNotEmpty(newUpstreamImports)) {
+          changed.add$1(0, t5);
+          t5._replaceUpstream$2(Y.mergeMaps(new P.UnmodifiableMapView(t5._upstream, t3), newUpstream, t4, t1), Y.mergeMaps(new P.UnmodifiableMapView(t5._upstreamImports, t3), newUpstreamImports, t4, t1));
+        }
+      }
+      if (changed._collection$_length !== 0)
+        _this._transitiveModificationTimes.clear$0(0);
+      return changed;
+    },
+    _recanonicalizeImportsForNode$4$forImport: function(node, importer, canonicalUrl, forImport) {
+      var t1 = type$.UnmodifiableMapView_of_legacy_Uri_and_legacy_StylesheetNode,
+        map = forImport ? new P.UnmodifiableMapView(node._upstreamImports, t1) : new P.UnmodifiableMapView(node._upstream, t1),
+        newMap = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Uri, type$.legacy_StylesheetNode);
+      map._collection$_map.forEach$1(0, new M.StylesheetGraph__recanonicalizeImportsForNode_closure(this, importer, canonicalUrl, node, forImport, newMap));
+      return newMap;
+    },
+    _nodeFor$5$forImport: function(url, baseImporter, baseUrl, active, forImport) {
+      var importer, canonicalUrl, resolvedUrl, t1, stylesheet, node, _this = this,
+        tuple = _this._ignoreErrors$1(new M.StylesheetGraph__nodeFor_closure(_this, url, baseImporter, baseUrl, forImport));
+      if (tuple == null)
+        return null;
+      importer = tuple.item1;
+      canonicalUrl = tuple.item2;
+      resolvedUrl = tuple.item3;
+      t1 = _this._nodes;
+      if (t1.containsKey$1(canonicalUrl))
+        return t1.$index(0, canonicalUrl);
+      if (active.contains$1(0, canonicalUrl))
+        return null;
+      stylesheet = _this._ignoreErrors$1(new M.StylesheetGraph__nodeFor_closure0(_this, importer, canonicalUrl, resolvedUrl));
+      if (stylesheet == null)
+        return null;
+      active.add$1(0, canonicalUrl);
+      node = M.StylesheetNode$_(stylesheet, importer, canonicalUrl, _this._upstreamNodes$3(stylesheet, importer, canonicalUrl));
+      active.remove$1(0, canonicalUrl);
+      t1.$indexSet(0, canonicalUrl, node);
+      return node;
+    },
+    _nodeFor$4: function(url, baseImporter, baseUrl, active) {
+      return this._nodeFor$5$forImport(url, baseImporter, baseUrl, active, false);
+    },
+    _ignoreErrors$1$1: function(callback) {
+      var t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return null;
+      }
+    },
+    _ignoreErrors$1: function(callback) {
+      return this._ignoreErrors$1$1(callback, type$.dynamic);
+    }
+  };
+  M.StylesheetGraph_modifiedSince_transitiveModificationTime.prototype = {
+    call$1: function(node) {
+      return this.$this._transitiveModificationTimes.putIfAbsent$2(node.canonicalUrl, new M.StylesheetGraph_modifiedSince_transitiveModificationTime_closure(node, this));
+    },
+    $signature: 222
+  };
+  M.StylesheetGraph_modifiedSince_transitiveModificationTime_closure.prototype = {
+    call$0: function() {
+      var t2, t3, upstreamTime,
+        t1 = this.node,
+        latest = t1.importer.modificationTime$1(t1.canonicalUrl);
+      for (t2 = t1._upstream, t2 = t2.get$values(t2), t1 = t1._upstreamImports, t1 = t2.followedBy$1(0, t1.get$values(t1)), t1 = new H.FollowedByIterator(J.get$iterator$ax(t1.__internal$_first), t1._second), t2 = this.transitiveModificationTime; t1.moveNext$0();) {
+        t3 = t1._currentIterator;
+        t3 = t3.get$current(t3);
+        upstreamTime = t3 == null ? new P.DateTime(Date.now(), false) : t2.call$1(t3);
+        if (upstreamTime._value > latest._value)
+          latest = upstreamTime;
+      }
+      return latest;
+    },
+    $signature: 172
+  };
+  M.StylesheetGraph__add_closure.prototype = {
+    call$0: function() {
+      var _this = this;
+      return _this.$this.importCache.canonicalize$3$baseImporter$baseUrl(_this.url, _this.baseImporter, _this.baseUrl);
+    },
+    $signature: 109
+  };
+  M.StylesheetGraph_addCanonical_closure.prototype = {
+    call$0: function() {
+      var _this = this;
+      return _this.$this.importCache.importCanonical$3(_this.importer, _this.canonicalUrl, _this.originalUrl);
+    },
+    $signature: 59
+  };
+  M.StylesheetGraph_reload_closure.prototype = {
+    call$0: function() {
+      return this.$this.importCache.importCanonical$2(this.node.importer, this.canonicalUrl);
+    },
+    $signature: 59
+  };
+  M.StylesheetGraph__recanonicalizeImportsForNode_closure.prototype = {
+    call$2: function(url, upstream) {
+      var result, t1, t2, t3, t4, exception, newCanonicalUrl, _this = this;
+      if (!_this.importer.couldCanonicalize$2(url, _this.canonicalUrl))
+        return;
+      t1 = _this.$this;
+      t2 = t1.importCache;
+      t3 = t2._canonicalizeCache;
+      t4 = type$.Tuple2_of_legacy_Uri_and_legacy_bool;
+      t3.remove$1(0, new S.Tuple2(url, false, t4));
+      t3.remove$1(0, new S.Tuple2(url, true, t4));
+      result = null;
+      try {
+        t3 = _this.node;
+        result = t2.canonicalize$4$baseImporter$baseUrl$forImport(url, t3.importer, t3.canonicalUrl, _this.forImport);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+      t2 = result;
+      newCanonicalUrl = t2 == null ? null : t2.item2;
+      if (J.$eq$(newCanonicalUrl, upstream == null ? null : upstream.canonicalUrl))
+        return;
+      t1 = result == null ? null : t1._nodes.$index(0, result.item2);
+      _this.newMap.$indexSet(0, url, t1);
+    },
+    $signature: 221
+  };
+  M.StylesheetGraph__nodeFor_closure.prototype = {
+    call$0: function() {
+      var _this = this;
+      return _this.$this.importCache.canonicalize$4$baseImporter$baseUrl$forImport(_this.url, _this.baseImporter, _this.baseUrl, _this.forImport);
+    },
+    $signature: 109
+  };
+  M.StylesheetGraph__nodeFor_closure0.prototype = {
+    call$0: function() {
+      var _this = this;
+      return _this.$this.importCache.importCanonical$3(_this.importer, _this.canonicalUrl, _this.resolvedUrl);
+    },
+    $signature: 59
+  };
+  M.StylesheetNode.prototype = {
+    StylesheetNode$_$4: function(_stylesheet, importer, canonicalUrl, allUpstream) {
+      var t1, t2;
+      for (t1 = this._upstream, t1 = t1.get$values(t1), t2 = this._upstreamImports, t2 = t1.followedBy$1(0, t2.get$values(t2)), t2 = new H.FollowedByIterator(J.get$iterator$ax(t2.__internal$_first), t2._second); t2.moveNext$0();) {
+        t1 = t2._currentIterator;
+        t1 = t1.get$current(t1);
+        if (t1 != null)
+          t1._downstream.add$1(0, this);
+      }
+    },
+    _replaceUpstream$2: function(newUpstream, newUpstreamImports) {
+      var t3, _this = this,
+        t1 = type$.legacy_StylesheetNode,
+        t2 = P.LinkedHashSet_LinkedHashSet(t1);
+      for (t3 = _this._upstream, t3 = t3.get$values(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();)
+        t2.add$1(0, t3.get$current(t3));
+      for (t3 = _this._upstreamImports, t3 = t3.get$values(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();)
+        t2.add$1(0, t3.get$current(t3));
+      t2.remove$1(0, null);
+      t1 = P.LinkedHashSet_LinkedHashSet(t1);
+      for (t3 = newUpstream.get$values(newUpstream), t3 = t3.get$iterator(t3); t3.moveNext$0();)
+        t1.add$1(0, t3.get$current(t3));
+      for (t3 = newUpstreamImports.get$values(newUpstreamImports), t3 = t3.get$iterator(t3); t3.moveNext$0();)
+        t1.add$1(0, t3.get$current(t3));
+      t1.remove$1(0, null);
+      for (t3 = t2.difference$1(t1), t3 = P._LinkedHashSetIterator$(t3, t3._collection$_modifications); t3.moveNext$0();)
+        t3._collection$_current._downstream.remove$1(0, _this);
+      for (t1 = t1.difference$1(t2), t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();)
+        t1._collection$_current._downstream.add$1(0, _this);
+      _this._upstream = newUpstream;
+      _this._upstreamImports = newUpstreamImports;
+    },
+    _stylesheet_graph$_remove$0: function() {
+      var t2, t3, t4, _i, url, _this = this,
+        t1 = P.LinkedHashSet_LinkedHashSet(type$.legacy_StylesheetNode);
+      for (t2 = _this._upstream, t2 = t2.get$values(t2), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.add$1(0, t2.get$current(t2));
+      for (t2 = _this._upstreamImports, t2 = t2.get$values(t2), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.add$1(0, t2.get$current(t2));
+      t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications);
+      for (; t1.moveNext$0();) {
+        t2 = t1._collection$_current;
+        if (t2 == null)
+          continue;
+        t2._downstream.remove$1(0, _this);
+      }
+      for (t1 = _this._downstream, t1 = t1.get$iterator(t1); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        for (t3 = t2._upstream, t3 = J.toList$0$ax(t3.get$keys(t3)), t4 = t3.length, _i = 0; _i < t3.length; t3.length === t4 || (0, H.throwConcurrentModificationError)(t3), ++_i) {
+          url = t3[_i];
+          if (J.$eq$(t2._upstream.$index(0, url), _this)) {
+            t2._upstream.$indexSet(0, url, null);
+            break;
+          }
+        }
+        for (t3 = t2._upstreamImports, t3 = J.toList$0$ax(t3.get$keys(t3)), t4 = t3.length, _i = 0; _i < t3.length; t3.length === t4 || (0, H.throwConcurrentModificationError)(t3), ++_i) {
+          url = t3[_i];
+          if (J.$eq$(t2._upstreamImports.$index(0, url), _this)) {
+            t2._upstreamImports.$indexSet(0, url, null);
+            break;
+          }
+        }
+      }
+    },
+    toString$0: function(_) {
+      var t1 = this._stylesheet_graph$_stylesheet.span.file;
+      return $.$get$context().prettyUri$1(t1.url);
+    }
+  };
+  M.Syntax.prototype = {
+    toString$0: function(_) {
+      return this._syntax$_name;
+    }
+  };
+  G.FixedLengthListBuilder.prototype = {
+    add$1: function(_, element) {
+      var t1, _this = this;
+      _this._checkUnbuilt$0();
+      t1 = _this._fixed_length_list_builder$_index;
+      _this._list[t1] = element;
+      _this._fixed_length_list_builder$_index = t1 + 1;
+    },
+    addAll$1: function(_, elements) {
+      var _this = this;
+      _this._checkUnbuilt$0();
+      C.JSArray_methods.setAll$2(_this._list, _this._fixed_length_list_builder$_index, elements);
+      _this._fixed_length_list_builder$_index = _this._fixed_length_list_builder$_index + elements.length;
+    },
+    addRange$3: function(elements, start, end) {
+      var $length, t1, _this = this;
+      _this._checkUnbuilt$0();
+      $length = (end == null ? J.get$length$asx(elements._collection$_source) : end) - start;
+      t1 = _this._fixed_length_list_builder$_index;
+      C.JSArray_methods.setRange$4(_this._list, t1, t1 + $length, elements, start);
+      _this._fixed_length_list_builder$_index += $length;
+    },
+    addRange$2: function(elements, start) {
+      return this.addRange$3(elements, start, null);
+    },
+    build$0: function() {
+      this._checkUnbuilt$0();
+      this._fixed_length_list_builder$_index = -1;
+      return this._list;
+    },
+    _checkUnbuilt$0: function() {
+      if (this._fixed_length_list_builder$_index === -1)
+        throw H.wrapException(P.StateError$("build() has already been called."));
+    }
+  };
+  K.LimitedMapView.prototype = {
+    get$keys: function(_) {
+      return this._limited_map_view$_keys;
+    },
+    get$length: function(_) {
+      return this._limited_map_view$_keys._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._limited_map_view$_keys._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._limited_map_view$_keys._collection$_length !== 0;
+    },
+    $index: function(_, key) {
+      return this._limited_map_view$_keys.contains$1(0, key) ? this._limited_map_view$_map.$index(0, key) : null;
+    },
+    containsKey$1: function(key) {
+      return this._limited_map_view$_keys.contains$1(0, key);
+    },
+    remove$1: function(_, key) {
+      return this._limited_map_view$_keys.contains$1(0, key) ? this._limited_map_view$_map.remove$1(0, key) : null;
+    }
+  };
+  Z.MergedMapView.prototype = {
+    get$keys: function(_) {
+      var t1 = this._mapsByKey;
+      return t1.get$keys(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._mapsByKey;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._mapsByKey;
+      return t1.get$isEmpty(t1);
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._mapsByKey;
+      return t1.get$isNotEmpty(t1);
+    },
+    MergedMapView$1: function(maps, $K, $V) {
+      var t1, t2, t3, _i, map, t4, t5;
+      for (t1 = maps.length, t2 = this._mapsByKey, t3 = $K._eval$1("@<0>")._bind$1($V)._eval$1("MergedMapView<1*,2*>*"), _i = 0; _i < maps.length; maps.length === t1 || (0, H.throwConcurrentModificationError)(maps), ++_i) {
+        map = maps[_i];
+        if (t3._is(map))
+          for (t4 = map._mapsByKey, t4 = t4.get$values(t4), t4 = t4.get$iterator(t4); t4.moveNext$0();) {
+            t5 = t4.get$current(t4);
+            B.setAll(t2, t5.get$keys(t5), t5);
+          }
+        else
+          B.setAll(t2, map.get$keys(map), map);
+      }
+    },
+    $index: function(_, key) {
+      var child = this._mapsByKey.$index(0, key);
+      return child == null ? null : child.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      var child = this._mapsByKey.$index(0, key);
+      if (child == null)
+        throw H.wrapException(P.UnsupportedError$(string$.New_en));
+      child.$indexSet(0, key, value);
+    },
+    remove$1: function(_, key) {
+      throw H.wrapException(P.UnsupportedError$(string$.Entrie));
+    },
+    containsKey$1: function(key) {
+      return this._mapsByKey.containsKey$1(key);
+    }
+  };
+  U.MultiDirWatcher.prototype = {
+    watch$1: function(_, directory) {
+      var t1, t2, t3, t4, isParentOfExistingDir, _i, existingDir, t5, future, completer;
+      for (t1 = this._watchers, t2 = t1.get$keys(t1), t2 = P.List_List$from(t2, true, H._instanceType(t2)._eval$1("Iterable.E")), t3 = t2.length, t4 = this._group, isParentOfExistingDir = false, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i) {
+        existingDir = t2[_i];
+        if (!isParentOfExistingDir) {
+          t5 = $.$get$context();
+          t5 = t5._isWithinOrEquals$2(existingDir, directory) === C._PathRelation_equal || t5._isWithinOrEquals$2(existingDir, directory) === C._PathRelation_within;
+        } else
+          t5 = false;
+        if (t5) {
+          t1 = new P._Future($.Zone__current, type$._Future_void);
+          t1._asyncComplete$1(null);
+          return t1;
+        }
+        if ($.$get$context()._isWithinOrEquals$2(directory, existingDir) === C._PathRelation_within) {
+          t4.remove$1(0, t1.remove$1(0, existingDir));
+          isParentOfExistingDir = true;
+        }
+      }
+      future = B.watchDir(directory, this._poll);
+      t2 = new Y._CompleterStream(type$._CompleterStream_legacy_WatchEvent);
+      completer = new Y.StreamCompleter(t2, type$.StreamCompleter_legacy_WatchEvent);
+      future.then$1$2$onError(0, completer.get$setSourceStream(), completer.get$setError(), type$.void);
+      t1.$indexSet(0, directory, t2);
+      t4.add$1(0, t2);
+      return future;
+    }
+  };
+  N.NoSourceMapBuffer0.prototype = {
+    get$length: function(_) {
+      return this._no_source_map_buffer0$_buffer._contents.length;
+    },
+    get$sourceFiles: function() {
+      return C.Map_empty;
+    },
+    forSpan$1$2: function(span, callback) {
+      return callback.call$0();
+    },
+    forSpan$2: function(span, callback) {
+      return this.forSpan$1$2(span, callback, type$.dynamic);
+    },
+    write$1: function(_, object) {
+      this._no_source_map_buffer0$_buffer._contents += H.S(object);
+      return null;
+    },
+    writeCharCode$1: function(charCode) {
+      this._no_source_map_buffer0$_buffer._contents += H.Primitives_stringFromCharCode(charCode);
+      return null;
+    },
+    toString$0: function(_) {
+      var t1 = this._no_source_map_buffer0$_buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    buildSourceMap$1$prefix: function(prefix) {
+      return H.throwExpression(P.UnsupportedError$(string$.NoSour));
+    },
+    $isStringBuffer: 1
+  };
+  F.PrefixedMapView.prototype = {
+    get$keys: function(_) {
+      return new F._PrefixedKeys(this);
+    },
+    get$length: function(_) {
+      var t1 = this._prefixed_map_view$_map;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._prefixed_map_view$_map;
+      return t1.get$isEmpty(t1);
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._prefixed_map_view$_map;
+      return t1.get$isNotEmpty(t1);
+    },
+    $index: function(_, key) {
+      return typeof key == "string" && C.JSString_methods.startsWith$1(key, this._prefix) ? this._prefixed_map_view$_map.$index(0, J.substring$1$s(key, this._prefix.length)) : null;
+    },
+    containsKey$1: function(key) {
+      return typeof key == "string" && C.JSString_methods.startsWith$1(key, this._prefix) && this._prefixed_map_view$_map.containsKey$1(J.substring$1$s(key, this._prefix.length));
+    }
+  };
+  F._PrefixedKeys.prototype = {
+    get$length: function(_) {
+      var t1 = this._view._prefixed_map_view$_map;
+      return t1.get$length(t1);
+    },
+    get$iterator: function(_) {
+      var t1 = this._view._prefixed_map_view$_map;
+      t1 = J.map$1$1$ax(t1.get$keys(t1), new F._PrefixedKeys_iterator_closure(this), type$.legacy_String);
+      return t1.get$iterator(t1);
+    },
+    contains$1: function(_, key) {
+      return this._view.containsKey$1(key);
+    }
+  };
+  F._PrefixedKeys_iterator_closure.prototype = {
+    call$1: function(key) {
+      return this.$this._view._prefix + H.S(key);
+    },
+    $signature: 4
+  };
+  U.PublicMemberMapView.prototype = {
+    get$keys: function(_) {
+      var t1 = this._inner;
+      return J.where$1$ax(t1.get$keys(t1), B.utils__isPublic$closure());
+    },
+    containsKey$1: function(key) {
+      return typeof key == "string" && B.isPublic(key) && this._inner.containsKey$1(key);
+    },
+    $index: function(_, key) {
+      if (typeof key == "string" && B.isPublic(key))
+        return this._inner.$index(0, key);
+      return null;
+    }
+  };
+  D.SourceMapBuffer0.prototype = {
+    get$sourceFiles: function() {
+      var t2, t3,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_SourceFile);
+      for (t2 = this._sourceFiles, t2 = t2.get$entries(t2), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t1.$indexSet(0, J.toString$0$(t3.key), t3.value);
+      }
+      return new P.UnmodifiableMapView(t1, type$.UnmodifiableMapView_of_legacy_String_and_legacy_SourceFile);
+    },
+    get$_source_map_buffer0$_targetLocation: function() {
+      var t1 = this._source_map_buffer0$_buffer._contents,
+        t2 = this._source_map_buffer0$_line;
+      return V.SourceLocation$(t1.length, this._source_map_buffer0$_column, t2, null);
+    },
+    get$length: function(_) {
+      return this._source_map_buffer0$_buffer._contents.length;
+    },
+    forSpan$1$2: function(span, callback) {
+      var t1, _this = this,
+        wasInSpan = _this._source_map_buffer0$_inSpan;
+      _this._source_map_buffer0$_inSpan = true;
+      _this._addEntry$2(Y.FileLocation$_(span.file, span._file$_start), _this.get$_source_map_buffer0$_targetLocation());
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } finally {
+        _this._source_map_buffer0$_inSpan = wasInSpan;
+      }
+    },
+    forSpan$2: function(span, callback) {
+      return this.forSpan$1$2(span, callback, type$.dynamic);
+    },
+    _addEntry$2: function(source, target) {
+      var entry, t2,
+        t1 = this._source_map_buffer0$_entries;
+      if (t1.length !== 0) {
+        entry = C.JSArray_methods.get$last(t1);
+        t2 = entry.source;
+        if (t2.file.getLine$1(t2.offset) == source.file.getLine$1(source.offset) && entry.target.line === target.line)
+          return;
+        if (entry.target.offset === target.offset)
+          return;
+      }
+      this._sourceFiles.putIfAbsent$2(source.file.url, new D.SourceMapBuffer__addEntry_closure(source));
+      t1.push(new L.Entry(source, target, null));
+    },
+    write$1: function(_, object) {
+      var t1, i,
+        string = J.toString$0$(object);
+      this._source_map_buffer0$_buffer._contents += H.S(string);
+      for (t1 = string.length, i = 0; i < t1; ++i)
+        if (C.JSString_methods._codeUnitAt$1(string, i) === 10)
+          this._source_map_buffer0$_writeLine$0();
+        else
+          ++this._source_map_buffer0$_column;
+    },
+    writeCharCode$1: function(charCode) {
+      this._source_map_buffer0$_buffer._contents += H.Primitives_stringFromCharCode(charCode);
+      if (charCode === 10)
+        this._source_map_buffer0$_writeLine$0();
+      else
+        ++this._source_map_buffer0$_column;
+    },
+    _source_map_buffer0$_writeLine$0: function() {
+      var _this = this,
+        t1 = _this._source_map_buffer0$_entries;
+      if (C.JSArray_methods.get$last(t1).target.line === _this._source_map_buffer0$_line && C.JSArray_methods.get$last(t1).target.column === _this._source_map_buffer0$_column)
+        t1.pop();
+      ++_this._source_map_buffer0$_line;
+      _this._source_map_buffer0$_column = 0;
+      if (_this._source_map_buffer0$_inSpan)
+        t1.push(new L.Entry(C.JSArray_methods.get$last(t1).source, _this.get$_source_map_buffer0$_targetLocation(), null));
+    },
+    toString$0: function(_) {
+      var t1 = this._source_map_buffer0$_buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    buildSourceMap$1$prefix: function(prefix) {
+      var i, t2, prefixColumn, _box_0 = {},
+        t1 = prefix.length;
+      if (t1 === 0)
+        return T.SingleMapping_SingleMapping$fromEntries(this._source_map_buffer0$_entries);
+      _box_0.prefixColumn = _box_0.prefixLines = 0;
+      for (i = 0, t2 = 0; i < t1; ++i)
+        if (C.JSString_methods._codeUnitAt$1(prefix, i) === 10) {
+          ++_box_0.prefixLines;
+          _box_0.prefixColumn = 0;
+          t2 = 0;
+        } else {
+          prefixColumn = t2 + 1;
+          _box_0.prefixColumn = prefixColumn;
+          t2 = prefixColumn;
+        }
+      t2 = this._source_map_buffer0$_entries;
+      return T.SingleMapping_SingleMapping$fromEntries(new H.MappedListIterable(t2, new D.SourceMapBuffer_buildSourceMap_closure(_box_0, t1), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Entry*>")));
+    },
+    $isStringBuffer: 1
+  };
+  D.SourceMapBuffer__addEntry_closure.prototype = {
+    call$0: function() {
+      return this.source.file;
+    },
+    $signature: 124
+  };
+  D.SourceMapBuffer_buildSourceMap_closure.prototype = {
+    call$1: function(entry) {
+      var t1 = entry.source,
+        t2 = entry.target,
+        t3 = t2.line,
+        t4 = this._box_0,
+        t5 = t4.prefixLines;
+      t4 = t3 === 0 ? t4.prefixColumn : 0;
+      return new L.Entry(t1, V.SourceLocation$(t2.offset + this.prefixLength, t2.column + t4, t3 + t5, null), entry.identifierName);
+    },
+    $signature: 207
+  };
+  R.UnprefixedMapView.prototype = {
+    get$keys: function(_) {
+      return new R._UnprefixedKeys(this);
+    },
+    $index: function(_, key) {
+      return typeof key == "string" ? this._unprefixed_map_view$_map.$index(0, J.$add$ansx(this._unprefixed_map_view$_prefix, key)) : null;
+    },
+    containsKey$1: function(key) {
+      return typeof key == "string" && this._unprefixed_map_view$_map.containsKey$1(J.$add$ansx(this._unprefixed_map_view$_prefix, key));
+    },
+    remove$1: function(_, key) {
+      return typeof key == "string" ? this._unprefixed_map_view$_map.remove$1(0, J.$add$ansx(this._unprefixed_map_view$_prefix, key)) : null;
+    }
+  };
+  R._UnprefixedKeys.prototype = {
+    get$iterator: function(_) {
+      var t1 = this._unprefixed_map_view$_view._unprefixed_map_view$_map;
+      t1 = J.where$1$ax(t1.get$keys(t1), new R._UnprefixedKeys_iterator_closure(this)).map$1$1(0, new R._UnprefixedKeys_iterator_closure0(this), type$.legacy_String);
+      return t1.get$iterator(t1);
+    },
+    contains$1: function(_, key) {
+      return this._unprefixed_map_view$_view.containsKey$1(key);
+    }
+  };
+  R._UnprefixedKeys_iterator_closure.prototype = {
+    call$1: function(key) {
+      return J.startsWith$1$s(key, this.$this._unprefixed_map_view$_view._unprefixed_map_view$_prefix);
+    },
+    $signature: 6
+  };
+  R._UnprefixedKeys_iterator_closure0.prototype = {
+    call$1: function(key) {
+      return J.substring$1$s(key, this.$this._unprefixed_map_view$_view._unprefixed_map_view$_prefix.length);
+    },
+    $signature: 4
+  };
+  B.indent_closure.prototype = {
+    call$1: function(line) {
+      return C.JSString_methods.$add(C.JSString_methods.$mul(" ", this.indentation), line);
+    },
+    $signature: 4
+  };
+  B.flattenVertically_closure.prototype = {
+    call$1: function(inner) {
+      return Q.QueueList_QueueList$from(inner, this.T._eval$1("0*"));
+    },
+    $signature: function() {
+      return this.T._eval$1("QueueList<0*>*(Iterable<0*>*)");
+    }
+  };
+  B.flattenVertically_closure0.prototype = {
+    call$1: function(queue) {
+      this.result.push(queue.removeFirst$0());
+      return queue.get$length(queue) === 0;
+    },
+    $signature: function() {
+      return this.T._eval$1("bool*(QueueList<0*>*)");
+    }
+  };
+  B.longestCommonSubsequence_closure.prototype = {
+    call$2: function(element1, element2) {
+      return J.$eq$(element1, element2) ? element1 : null;
+    },
+    $signature: function() {
+      return this.T._eval$1("0*(0*,0*)");
+    }
+  };
+  B.longestCommonSubsequence_closure0.prototype = {
+    call$1: function(_) {
+      return P.List_List$filled(J.get$length$asx(this.list2) + 1, 0, false, type$.legacy_int);
+    },
+    $signature: 208
+  };
+  B.longestCommonSubsequence_closure1.prototype = {
+    call$1: function(_) {
+      var t1 = new Array(J.get$length$asx(this.list2));
+      t1.fixed$length = Array;
+      return H.setRuntimeTypeInfo(t1, this.T._eval$1("JSArray<0*>"));
+    },
+    $signature: function() {
+      return this.T._eval$1("List<0*>*(int*)");
+    }
+  };
+  B.longestCommonSubsequence_backtrack.prototype = {
+    call$2: function(i, j) {
+      var selection, t1, _this = this;
+      if (i === -1 || j === -1)
+        return H.setRuntimeTypeInfo([], _this.T._eval$1("JSArray<0*>"));
+      selection = J.$index$asx(_this.selections[i], j);
+      if (selection != null) {
+        t1 = _this.call$2(i - 1, j - 1);
+        J.add$1$ax(t1, selection);
+        return t1;
+      }
+      t1 = _this.lengths;
+      return J.$index$asx(t1[i + 1], j) > J.$index$asx(t1[i], j + 1) ? _this.call$2(i, j - 1) : _this.call$2(i - 1, j);
+    },
+    $signature: function() {
+      return this.T._eval$1("List<0*>*(int*,int*)");
+    }
+  };
+  B.mapAddAll2_closure.prototype = {
+    call$2: function(key, inner) {
+      var t1 = this.destination;
+      if (t1.containsKey$1(key))
+        t1.$index(0, key).addAll$1(0, inner);
+      else
+        t1.$indexSet(0, key, inner);
+    },
+    $signature: function() {
+      return this.K1._eval$1("@<0>")._bind$1(this.K2)._bind$1(this.V)._eval$1("Null(1*,Map<2*,3*>*)");
+    }
+  };
+  F.Value.prototype = {
+    get$isTruthy: function() {
+      return true;
+    },
+    get$separator: function() {
+      return C.ListSeparator_undecided;
+    },
+    get$hasBrackets: function() {
+      return false;
+    },
+    get$asList: function() {
+      return H.setRuntimeTypeInfo([this], type$.JSArray_legacy_Value);
+    },
+    get$lengthAsList: function() {
+      return 1;
+    },
+    get$isBlank: function() {
+      return false;
+    },
+    get$isSpecialNumber: function() {
+      return false;
+    },
+    get$isVar: function() {
+      return false;
+    },
+    get$realNull: function() {
+      return this;
+    },
+    sassIndexToListIndex$2: function(sassIndex, $name) {
+      var _this = this,
+        index = sassIndex.assertNumber$1($name).assertInt$1($name);
+      if (index === 0)
+        throw H.wrapException(_this._value$_exception$2("List index may not be 0.", $name));
+      if (Math.abs(index) > _this.get$lengthAsList())
+        throw H.wrapException(_this._value$_exception$2("Invalid index " + sassIndex.toString$0(0) + " for a list with " + _this.get$lengthAsList() + " elements.", $name));
+      return index < 0 ? _this.get$lengthAsList() + index : index - 1;
+    },
+    assertColor$1: function($name) {
+      return H.throwExpression(this._value$_exception$2(this.toString$0(0) + " is not a color.", $name));
+    },
+    assertFunction$1: function($name) {
+      return H.throwExpression(this._value$_exception$2(this.toString$0(0) + " is not a function reference.", $name));
+    },
+    assertMap$1: function($name) {
+      return H.throwExpression(this._value$_exception$2(this.toString$0(0) + " is not a map.", $name));
+    },
+    tryMap$0: function() {
+      return null;
+    },
+    assertNumber$1: function($name) {
+      return H.throwExpression(this._value$_exception$2(this.toString$0(0) + " is not a number.", $name));
+    },
+    assertNumber$0: function() {
+      return this.assertNumber$1(null);
+    },
+    assertString$1: function($name) {
+      return H.throwExpression(this._value$_exception$2(this.toString$0(0) + " is not a string.", $name));
+    },
+    assertSelector$2$allowParent$name: function(allowParent, $name) {
+      var error, t1, exception,
+        string = this._selectorString$1($name);
+      try {
+        t1 = D.SelectorList_SelectorList$parse(string, allowParent, true, null);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException) {
+          error = t1;
+          throw H.wrapException(this._value$_exception$2(C.JSString_methods.replaceFirst$2(J.toString$0$(error), "Error: ", ""), $name));
+        } else
+          throw exception;
+      }
+    },
+    assertSelector$1$name: function($name) {
+      return this.assertSelector$2$allowParent$name(false, $name);
+    },
+    assertSelector$0: function() {
+      return this.assertSelector$2$allowParent$name(false, null);
+    },
+    assertSelector$1$allowParent: function(allowParent) {
+      return this.assertSelector$2$allowParent$name(allowParent, null);
+    },
+    assertCompoundSelector$1$name: function($name) {
+      var error, t1, exception,
+        allowParent = false,
+        string = this._selectorString$1($name);
+      try {
+        t1 = T.SelectorParser$(string, allowParent, true, null, null).parseCompoundSelector$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException) {
+          error = t1;
+          throw H.wrapException(this._value$_exception$2(C.JSString_methods.replaceFirst$2(J.toString$0$(error), "Error: ", ""), $name));
+        } else
+          throw exception;
+      }
+    },
+    _selectorString$1: function($name) {
+      var string = this._selectorStringOrNull$0();
+      if (string != null)
+        return string;
+      throw H.wrapException(this._value$_exception$2(this.toString$0(0) + string$.x20is_no, $name));
+    },
+    _selectorString$0: function() {
+      return this._selectorString$1(null);
+    },
+    _selectorStringOrNull$0: function() {
+      var t1, t2, result, t3, _i, complex, string, compound, _this = this, _null = null;
+      if (_this instanceof D.SassString)
+        return _this.text;
+      if (!(_this instanceof D.SassList))
+        return _null;
+      t1 = _this._list$_contents;
+      t2 = t1.length;
+      if (t2 === 0)
+        return _null;
+      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      t3 = _this.separator === C.ListSeparator_comma;
+      if (t3)
+        for (_i = 0; _i < t2; ++_i) {
+          complex = t1[_i];
+          if (complex instanceof D.SassString)
+            result.push(complex.text);
+          else if (complex instanceof D.SassList && complex.separator === C.ListSeparator_space) {
+            string = complex._selectorString$0();
+            result.push(string);
+          } else
+            return _null;
+        }
+      else
+        for (_i = 0; _i < t2; ++_i) {
+          compound = t1[_i];
+          if (compound instanceof D.SassString)
+            result.push(compound.text);
+          else
+            return _null;
+        }
+      return C.JSArray_methods.join$1(result, t3 ? ", " : " ");
+    },
+    changeListContents$2$separator: function(contents, separator) {
+      var t1 = separator == null ? this.get$separator() : separator,
+        t2 = this.get$hasBrackets();
+      return D.SassList$(contents, t1, t2);
+    },
+    changeListContents$1: function(contents) {
+      return this.changeListContents$2$separator(contents, null);
+    },
+    greaterThan$1: function(other) {
+      return H.throwExpression(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " > " + H.S(other) + '".'));
+    },
+    greaterThanOrEquals$1: function(other) {
+      return H.throwExpression(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " >= " + H.S(other) + '".'));
+    },
+    lessThan$1: function(other) {
+      return H.throwExpression(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " < " + H.S(other) + '".'));
+    },
+    lessThanOrEquals$1: function(other) {
+      return H.throwExpression(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " <= " + H.S(other) + '".'));
+    },
+    times$1: function(other) {
+      return H.throwExpression(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " * " + H.S(other) + '".'));
+    },
+    modulo$1: function(other) {
+      return H.throwExpression(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " % " + H.S(other) + '".'));
+    },
+    plus$1: function(other) {
+      var t1;
+      if (other instanceof D.SassString)
+        return new D.SassString(C.JSString_methods.$add(N.serializeValue0(this, false, true), other.text), other.hasQuotes);
+      else {
+        t1 = N.serializeValue0(this, false, true);
+        other.toString;
+        return new D.SassString(t1 + N.serializeValue0(other, false, true), false);
+      }
+    },
+    minus$1: function(other) {
+      var t1 = N.serializeValue0(this, false, true) + "-";
+      other.toString;
+      return new D.SassString(t1 + N.serializeValue0(other, false, true), false);
+    },
+    dividedBy$1: function(other) {
+      var t1 = N.serializeValue0(this, false, true) + "/";
+      other.toString;
+      return new D.SassString(t1 + N.serializeValue0(other, false, true), false);
+    },
+    unaryPlus$0: function() {
+      return new D.SassString("+" + N.serializeValue0(this, false, true), false);
+    },
+    unaryMinus$0: function() {
+      return new D.SassString("-" + N.serializeValue0(this, false, true), false);
+    },
+    unaryNot$0: function() {
+      return C.SassBoolean_false0;
+    },
+    withoutSlash$0: function() {
+      return this;
+    },
+    toString$0: function(_) {
+      return N.serializeValue0(this, true, true);
+    },
+    _value$_exception$2: function(message, $name) {
+      return new E.SassScriptException($name == null ? message : "$" + $name + ": " + message);
+    }
+  };
+  D.SassArgumentList.prototype = {};
+  Z.SassBoolean.prototype = {
+    get$isTruthy: function() {
+      return this.value;
+    },
+    accept$1$1: function(visitor) {
+      return visitor._serialize$_buffer.write$1(0, String(this.value));
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unaryNot$0: function() {
+      return this.value ? C.SassBoolean_false0 : C.SassBoolean_true0;
+    }
+  };
+  K.SassColor.prototype = {
+    get$red: function() {
+      if (this._red == null)
+        this._hslToRgb$0();
+      return this._red;
+    },
+    get$green: function() {
+      if (this._green == null)
+        this._hslToRgb$0();
+      return this._green;
+    },
+    get$blue: function() {
+      if (this._blue == null)
+        this._hslToRgb$0();
+      return this._blue;
+    },
+    get$hue: function() {
+      if (this._hue == null)
+        this._rgbToHsl$0();
+      return this._hue;
+    },
+    get$saturation: function() {
+      if (this._saturation == null)
+        this._rgbToHsl$0();
+      return this._saturation;
+    },
+    get$lightness: function() {
+      if (this._lightness == null)
+        this._rgbToHsl$0();
+      return this._lightness;
+    },
+    get$whiteness: function() {
+      var t1 = this.get$red(),
+        t2 = this.get$green();
+      return Math.min(Math.min(H.checkNum(t1), H.checkNum(t2)), H.checkNum(this.get$blue())) / 255 * 100;
+    },
+    get$blackness: function() {
+      var t1 = this.get$red(),
+        t2 = this.get$green();
+      return 100 - Math.max(Math.max(H.checkNum(t1), H.checkNum(t2)), H.checkNum(this.get$blue())) / 255 * 100;
+    },
+    get$original: function() {
+      var t1 = this.originalSpan;
+      return t1 == null ? null : P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1.file._decodedChars, t1._file$_start, t1._end), 0, null);
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitColor$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertColor$1: function($name) {
+      return this;
+    },
+    changeRgb$4$alpha$blue$green$red: function(alpha, blue, green, red) {
+      return K.SassColor$rgb(red, green, blue, alpha == null ? this.alpha : alpha, null);
+    },
+    changeRgb$3$blue$green$red: function(blue, green, red) {
+      return this.changeRgb$4$alpha$blue$green$red(null, blue, green, red);
+    },
+    changeHsl$4$alpha$hue$lightness$saturation: function(alpha, hue, lightness, saturation) {
+      var _this = this,
+        t1 = hue == null ? _this.get$hue() : hue,
+        t2 = saturation == null ? _this.get$saturation() : saturation,
+        t3 = lightness == null ? _this.get$lightness() : lightness;
+      return K.SassColor$hsl(t1, t2, t3, alpha == null ? _this.alpha : alpha);
+    },
+    changeHsl$1$saturation: function(saturation) {
+      return this.changeHsl$4$alpha$hue$lightness$saturation(null, null, null, saturation);
+    },
+    changeHsl$1$lightness: function(lightness) {
+      return this.changeHsl$4$alpha$hue$lightness$saturation(null, null, lightness, null);
+    },
+    changeHsl$1$hue: function(hue) {
+      return this.changeHsl$4$alpha$hue$lightness$saturation(null, hue, null, null);
+    },
+    changeAlpha$1: function(alpha) {
+      var _this = this;
+      return new K.SassColor(_this._red, _this._green, _this._blue, _this._hue, _this._saturation, _this._lightness, T.fuzzyAssertRange(alpha, 0, 1, "alpha"), null);
+    },
+    plus$1: function(other) {
+      if (!(other instanceof T.SassNumber) && !(other instanceof K.SassColor))
+        return this.super$Value$plus(other);
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " + " + H.S(other) + '".'));
+    },
+    minus$1: function(other) {
+      if (!(other instanceof T.SassNumber) && !(other instanceof K.SassColor))
+        return this.super$Value$minus(other);
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " - " + H.S(other) + '".'));
+    },
+    dividedBy$1: function(other) {
+      if (!(other instanceof T.SassNumber) && !(other instanceof K.SassColor))
+        return this.super$Value$dividedBy(other);
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " / " + H.S(other) + '".'));
+    },
+    modulo$1: function(other) {
+      return H.throwExpression(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " % " + H.S(other) + '".'));
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      return other instanceof K.SassColor && other.get$red() == _this.get$red() && other.get$green() == _this.get$green() && other.get$blue() == _this.get$blue() && other.alpha === _this.alpha;
+    },
+    get$hashCode: function(_) {
+      var _this = this;
+      return J.get$hashCode$(_this.get$red()) ^ J.get$hashCode$(_this.get$green()) ^ J.get$hashCode$(_this.get$blue()) ^ C.JSNumber_methods.get$hashCode(_this.alpha);
+    },
+    _rgbToHsl$0: function() {
+      var t2, t3, _this = this,
+        scaledRed = _this.get$red() / 255,
+        scaledGreen = _this.get$green() / 255,
+        scaledBlue = _this.get$blue() / 255,
+        max = Math.max(Math.max(scaledRed, scaledGreen), scaledBlue),
+        min = Math.min(Math.min(scaledRed, scaledGreen), scaledBlue),
+        delta = max - min,
+        t1 = max === min;
+      if (t1)
+        _this._hue = 0;
+      else if (max === scaledRed)
+        _this._hue = C.JSDouble_methods.$mod(60 * (scaledGreen - scaledBlue) / delta, 360);
+      else if (max === scaledGreen)
+        _this._hue = C.JSNumber_methods.$mod(120 + 60 * (scaledBlue - scaledRed) / delta, 360);
+      else if (max === scaledBlue)
+        _this._hue = C.JSNumber_methods.$mod(240 + 60 * (scaledRed - scaledGreen) / delta, 360);
+      t2 = max + min;
+      t3 = 50 * t2;
+      _this._lightness = t3;
+      if (t1)
+        _this._saturation = 0;
+      else {
+        t1 = 100 * delta;
+        if (t3 < 50)
+          _this._saturation = t1 / t2;
+        else
+          _this._saturation = t1 / (2 - max - min);
+      }
+    },
+    _hslToRgb$0: function() {
+      var _this = this,
+        scaledHue = _this.get$hue() / 360,
+        scaledSaturation = _this.get$saturation() / 100,
+        scaledLightness = _this.get$lightness() / 100,
+        m2 = scaledLightness <= 0.5 ? scaledLightness * (scaledSaturation + 1) : scaledLightness + scaledSaturation - scaledLightness * scaledSaturation,
+        m1 = scaledLightness * 2 - m2;
+      _this._red = T.fuzzyRound(K.SassColor__hueToRgb(m1, m2, scaledHue + 0.3333333333333333) * 255);
+      _this._green = T.fuzzyRound(K.SassColor__hueToRgb(m1, m2, scaledHue) * 255);
+      _this._blue = T.fuzzyRound(K.SassColor__hueToRgb(m1, m2, scaledHue - 0.3333333333333333) * 255);
+    }
+  };
+  K.SassColor_SassColor$hwb_toRgb.prototype = {
+    call$1: function(hue) {
+      return T.fuzzyRound((K.SassColor__hueToRgb(0, 1, hue) * this.factor + this._box_0.scaledWhiteness) * 255);
+    },
+    $signature: 39
+  };
+  F.SassFunction.prototype = {
+    accept$1$1: function(visitor) {
+      var t1, t2;
+      if (!visitor._serialize$_inspect)
+        H.throwExpression(E.SassScriptException$(this.toString$0(0) + " isn't a valid CSS value."));
+      t1 = visitor._serialize$_buffer;
+      t1.write$1(0, "get-function(");
+      t2 = this.callable;
+      visitor._visitQuotedString$1(t2.get$name(t2));
+      t1.writeCharCode$1(41);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertFunction$1: function($name) {
+      return this;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof F.SassFunction && J.$eq$(this.callable, other.callable);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.callable);
+    }
+  };
+  D.SassList.prototype = {
+    get$isBlank: function() {
+      return C.JSArray_methods.every$1(this._list$_contents, new D.SassList_isBlank_closure());
+    },
+    get$asList: function() {
+      return this._list$_contents;
+    },
+    get$lengthAsList: function() {
+      return this._list$_contents.length;
+    },
+    SassList$3$brackets: function(contents, separator, brackets) {
+      if (this.separator === C.ListSeparator_undecided && this._list$_contents.length > 1)
+        throw H.wrapException(P.ArgumentError$(string$.A_list));
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitList$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertMap$1: function($name) {
+      return this._list$_contents.length === 0 ? C.SassMap_Map_empty : this.super$Value$assertMap($name);
+    },
+    tryMap$0: function() {
+      return this._list$_contents.length === 0 ? C.SassMap_Map_empty : null;
+    },
+    $eq: function(_, other) {
+      var t1, _this = this;
+      if (other == null)
+        return false;
+      if (!(other instanceof D.SassList && other.separator === _this.separator && other.hasBrackets === _this.hasBrackets && C.C_ListEquality.equals$2(0, other._list$_contents, _this._list$_contents)))
+        t1 = _this._list$_contents.length === 0 && other instanceof A.SassMap && other.get$asList().length === 0;
+      else
+        t1 = true;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      return C.C_ListEquality.hash$1(this._list$_contents);
+    },
+    get$separator: function() {
+      return this.separator;
+    },
+    get$hasBrackets: function() {
+      return this.hasBrackets;
+    }
+  };
+  D.SassList_isBlank_closure.prototype = {
+    call$1: function(element) {
+      return element.get$isBlank();
+    },
+    $signature: 53
+  };
+  D.ListSeparator.prototype = {
+    toString$0: function(_) {
+      return this._list$_name;
+    }
+  };
+  A.SassMap.prototype = {
+    get$separator: function() {
+      var t1 = this.contents;
+      return t1.get$isEmpty(t1) ? C.ListSeparator_undecided : C.ListSeparator_comma;
+    },
+    get$asList: function() {
+      var result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+      this.contents.forEach$1(0, new A.SassMap_asList_closure(result));
+      return result;
+    },
+    get$lengthAsList: function() {
+      var t1 = this.contents;
+      return t1.get$length(t1);
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitMap$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertMap$1: function($name) {
+      return this;
+    },
+    tryMap$0: function() {
+      return this;
+    },
+    $eq: function(_, other) {
+      var t1;
+      if (other == null)
+        return false;
+      if (!(other instanceof A.SassMap && C.C_MapEquality.equals$2(0, other.contents, this.contents))) {
+        t1 = this.contents;
+        t1 = t1.get$isEmpty(t1) && other instanceof D.SassList && other._list$_contents.length === 0;
+      } else
+        t1 = true;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.contents;
+      return t1.get$isEmpty(t1) ? C.C_ListEquality.hash$1(C.List_empty5) : C.C_MapEquality.hash$1(t1);
+    }
+  };
+  A.SassMap_asList_closure.prototype = {
+    call$2: function(key, value) {
+      this.result.push(D.SassList$(H.setRuntimeTypeInfo([key, value], type$.JSArray_legacy_Value), C.ListSeparator_space, false));
+    },
+    $signature: 46
+  };
+  O.SassNull.prototype = {
+    get$isTruthy: function() {
+      return false;
+    },
+    get$isBlank: function() {
+      return true;
+    },
+    get$realNull: function() {
+      return null;
+    },
+    accept$1$1: function(visitor) {
+      if (visitor._serialize$_inspect)
+        visitor._serialize$_buffer.write$1(0, "null");
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unaryNot$0: function() {
+      return C.SassBoolean_true0;
+    }
+  };
+  T.SassNumber.prototype = {
+    get$unitString: function() {
+      var _this = this;
+      return _this.get$hasUnits() ? _this._unitString$2(_this.get$numeratorUnits(), _this.get$denominatorUnits()) : "";
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitNumber$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    withoutSlash$0: function() {
+      var _this = this;
+      return _this.asSlash == null ? _this : _this.withValue$1(_this.value);
+    },
+    assertNumber$1: function($name) {
+      return this;
+    },
+    assertNumber$0: function() {
+      return this.assertNumber$1(null);
+    },
+    assertInt$1: function($name) {
+      var t1 = this.value,
+        integer = T.fuzzyIsInt(t1) ? J.round$0$n(t1) : null;
+      if (integer != null)
+        return integer;
+      throw H.wrapException(this._number$_exception$2(this.toString$0(0) + " is not an int.", $name));
+    },
+    assertInt$0: function() {
+      return this.assertInt$1(null);
+    },
+    valueInRange$3: function(min, max, $name) {
+      var _this = this,
+        result = T.fuzzyCheckRange(_this.value, min, max);
+      if (result != null)
+        return result;
+      throw H.wrapException(_this._number$_exception$2("Expected " + _this.toString$0(0) + " to be within " + min + _this.get$unitString() + " and " + max + _this.get$unitString() + ".", $name));
+    },
+    assertUnit$2: function(unit, $name) {
+      if (this.hasUnit$1(unit))
+        return;
+      throw H.wrapException(this._number$_exception$2("Expected " + this.toString$0(0) + ' to have unit "' + unit + '".', $name));
+    },
+    assertNoUnits$1: function($name) {
+      if (!this.get$hasUnits())
+        return;
+      throw H.wrapException(this._number$_exception$2("Expected " + this.toString$0(0) + " to have no units.", $name));
+    },
+    coerceValueToMatch$1: function(other) {
+      return this._coerceOrConvertValue$6$coerceUnitless$name$other$otherName(other.get$numeratorUnits(), other.get$denominatorUnits(), true, null, other, null);
+    },
+    convertValueToMatch$3: function(other, $name, otherName) {
+      return this._coerceOrConvertValue$6$coerceUnitless$name$other$otherName(other.get$numeratorUnits(), other.get$denominatorUnits(), false, $name, other, otherName);
+    },
+    coerce$3: function(newNumerators, newDenominators, $name) {
+      return T.SassNumber_SassNumber$withUnits(this.coerceValue$3(newNumerators, newDenominators, $name), newDenominators, newNumerators);
+    },
+    coerce$2: function(newNumerators, newDenominators) {
+      return this.coerce$3(newNumerators, newDenominators, null);
+    },
+    coerceValue$3: function(newNumerators, newDenominators, $name) {
+      return this._coerceOrConvertValue$4$coerceUnitless$name(newNumerators, newDenominators, true, $name);
+    },
+    coerceValueToUnit$2: function(unit, $name) {
+      var t1 = type$.JSArray_legacy_String;
+      return this.coerceValue$3(H.setRuntimeTypeInfo([unit], t1), H.setRuntimeTypeInfo([], t1), $name);
+    },
+    _coerceOrConvertValue$6$coerceUnitless$name$other$otherName: function(newNumerators, newDenominators, coerceUnitless, $name, other, otherName) {
+      var t1, otherHasUnits, t2, _compatibilityException, oldNumerators, oldDenominators, _i, _this = this, _box_0 = {};
+      if (C.C_ListEquality.equals$2(0, _this.get$numeratorUnits(), newNumerators) && C.C_ListEquality.equals$2(0, _this.get$denominatorUnits(), newDenominators))
+        return _this.value;
+      t1 = J.getInterceptor$asx(newNumerators);
+      otherHasUnits = t1.get$isNotEmpty(newNumerators) || newDenominators.length !== 0;
+      if (coerceUnitless)
+        t2 = !_this.get$hasUnits() || !otherHasUnits;
+      else
+        t2 = false;
+      if (t2)
+        return _this.value;
+      _compatibilityException = new T.SassNumber__coerceOrConvertValue__compatibilityException(_this, other, otherName, otherHasUnits, $name, newNumerators, newDenominators);
+      _box_0.value = _this.value;
+      oldNumerators = J.toList$0$ax(_this.get$numeratorUnits());
+      for (t1 = t1.get$iterator(newNumerators); t1.moveNext$0();)
+        B.removeFirstWhere(oldNumerators, new T.SassNumber__coerceOrConvertValue_closure(_box_0, _this, t1.get$current(t1)), new T.SassNumber__coerceOrConvertValue_closure0(_compatibilityException));
+      t1 = _this.get$denominatorUnits();
+      oldDenominators = H.setRuntimeTypeInfo(t1.slice(0), H._arrayInstanceType(t1)._eval$1("JSArray<1>"));
+      for (t1 = newDenominators.length, _i = 0; _i < newDenominators.length; newDenominators.length === t1 || (0, H.throwConcurrentModificationError)(newDenominators), ++_i)
+        B.removeFirstWhere(oldDenominators, new T.SassNumber__coerceOrConvertValue_closure1(_box_0, _this, newDenominators[_i]), new T.SassNumber__coerceOrConvertValue_closure2(_compatibilityException));
+      if (oldNumerators.length !== 0 || oldDenominators.length !== 0)
+        throw H.wrapException(_compatibilityException.call$0());
+      return _box_0.value;
+    },
+    _coerceOrConvertValue$4$coerceUnitless$name: function(newNumerators, newDenominators, coerceUnitless, $name) {
+      return this._coerceOrConvertValue$6$coerceUnitless$name$other$otherName(newNumerators, newDenominators, coerceUnitless, $name, null, null);
+    },
+    isComparableTo$1: function(other) {
+      var exception;
+      if (!this.get$hasUnits() || !other.get$hasUnits())
+        return true;
+      try {
+        this.greaterThan$1(other);
+        return true;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof E.SassScriptException)
+          return false;
+        else
+          throw exception;
+      }
+    },
+    greaterThan$1: function(other) {
+      if (other instanceof T.SassNumber)
+        return this._coerceUnits$2(other, T.number0__fuzzyGreaterThan$closure()) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " > " + H.S(other) + '".'));
+    },
+    greaterThanOrEquals$1: function(other) {
+      if (other instanceof T.SassNumber)
+        return this._coerceUnits$2(other, T.number0__fuzzyGreaterThanOrEquals$closure()) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " >= " + H.S(other) + '".'));
+    },
+    lessThan$1: function(other) {
+      if (other instanceof T.SassNumber)
+        return this._coerceUnits$2(other, T.number0__fuzzyLessThan$closure()) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " < " + H.S(other) + '".'));
+    },
+    lessThanOrEquals$1: function(other) {
+      if (other instanceof T.SassNumber)
+        return this._coerceUnits$2(other, T.number0__fuzzyLessThanOrEquals$closure()) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + this.toString$0(0) + " <= " + H.S(other) + '".'));
+    },
+    modulo$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber)
+        return _this.withValue$1(_this._coerceUnits$2(other, _this.get$moduloLikeSass()));
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + _this.toString$0(0) + " % " + H.S(other) + '".'));
+    },
+    moduloLikeSass$2: function(num1, num2) {
+      var t1;
+      if (num2 > 0)
+        return C.JSNumber_methods.$mod(num1, num2);
+      if (num2 === 0)
+        return 0 / 0;
+      t1 = C.JSNumber_methods.$mod(num1, num2);
+      return t1 === 0 ? 0 : t1 + num2;
+    },
+    plus$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber)
+        return _this.withValue$1(_this._coerceUnits$2(other, new T.SassNumber_plus_closure()));
+      if (!(other instanceof K.SassColor))
+        return _this.super$Value$plus(other);
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + _this.toString$0(0) + " + " + other.toString$0(0) + '".'));
+    },
+    minus$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber)
+        return _this.withValue$1(_this._coerceUnits$2(other, new T.SassNumber_minus_closure()));
+      if (!(other instanceof K.SassColor))
+        return _this.super$Value$minus(other);
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + _this.toString$0(0) + " - " + other.toString$0(0) + '".'));
+    },
+    times$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber) {
+        if (!other.get$hasUnits())
+          return _this.withValue$1(_this.value * other.value);
+        return _this.multiplyUnits$3(_this.value * other.value, other.get$numeratorUnits(), other.get$denominatorUnits());
+      }
+      throw H.wrapException(E.SassScriptException$('Undefined operation "' + _this.toString$0(0) + " * " + H.S(other) + '".'));
+    },
+    dividedBy$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber) {
+        if (!other.get$hasUnits())
+          return _this.withValue$1(_this.value / other.value);
+        return _this.multiplyUnits$3(_this.value / other.value, other.get$denominatorUnits(), other.get$numeratorUnits());
+      }
+      return _this.super$Value$dividedBy(other);
+    },
+    unaryPlus$0: function() {
+      return this;
+    },
+    _coerceUnits$1$2: function(other, operation) {
+      var t1, exception;
+      try {
+        t1 = operation.call$2(this.value, other.coerceValueToMatch$1(this));
+        return t1;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof E.SassScriptException) {
+          this.coerceValueToMatch$1(other);
+          throw exception;
+        } else
+          throw exception;
+      }
+    },
+    _coerceUnits$2: function(other, operation) {
+      return this._coerceUnits$1$2(other, operation, type$.dynamic);
+    },
+    multiplyUnits$3: function(value, otherNumerators, otherDenominators) {
+      var newNumerators, mutableOtherDenominators, t1, t2, mutableDenominatorUnits, _this = this, _box_0 = {};
+      _box_0.value = value;
+      if (J.get$isEmpty$asx(_this.get$numeratorUnits())) {
+        if (J.get$isEmpty$asx(otherDenominators) && !_this._areAnyConvertible$2(_this.get$denominatorUnits(), otherNumerators))
+          return T.SassNumber_SassNumber$withUnits(value, _this.get$denominatorUnits(), otherNumerators);
+        else if (_this.get$denominatorUnits().length === 0)
+          return T.SassNumber_SassNumber$withUnits(value, otherDenominators, otherNumerators);
+      } else if (J.get$isEmpty$asx(otherNumerators))
+        if (J.get$isEmpty$asx(otherDenominators))
+          return T.SassNumber_SassNumber$withUnits(value, otherDenominators, _this.get$numeratorUnits());
+        else if (_this.get$denominatorUnits().length === 0 && !_this._areAnyConvertible$2(_this.get$numeratorUnits(), otherDenominators))
+          return T.SassNumber_SassNumber$withUnits(value, otherDenominators, _this.get$numeratorUnits());
+      newNumerators = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      mutableOtherDenominators = J.toList$0$ax(otherDenominators);
+      for (t1 = J.get$iterator$ax(_this.get$numeratorUnits()); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        B.removeFirstWhere(mutableOtherDenominators, new T.SassNumber_multiplyUnits_closure(_box_0, _this, t2), new T.SassNumber_multiplyUnits_closure0(newNumerators, t2));
+      }
+      t1 = _this.get$denominatorUnits();
+      mutableDenominatorUnits = H.setRuntimeTypeInfo(t1.slice(0), H._arrayInstanceType(t1)._eval$1("JSArray<1>"));
+      for (t1 = J.get$iterator$ax(otherNumerators); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        B.removeFirstWhere(mutableDenominatorUnits, new T.SassNumber_multiplyUnits_closure1(_box_0, _this, t2), new T.SassNumber_multiplyUnits_closure2(newNumerators, t2));
+      }
+      t1 = _box_0.value;
+      C.JSArray_methods.addAll$1(mutableDenominatorUnits, mutableOtherDenominators);
+      return T.SassNumber_SassNumber$withUnits(t1, mutableDenominatorUnits, newNumerators);
+    },
+    _areAnyConvertible$2: function(units1, units2) {
+      return J.any$1$ax(units1, new T.SassNumber__areAnyConvertible_closure(this, units2));
+    },
+    conversionFactor$2: function(unit1, unit2) {
+      var innerMap;
+      if (unit1 == unit2)
+        return 1;
+      innerMap = C.Map_K2BWj.$index(0, unit1);
+      if (innerMap == null)
+        return null;
+      return innerMap.$index(0, unit2);
+    },
+    _unitString$2: function(numerators, denominators) {
+      var t1 = J.getInterceptor$asx(numerators);
+      if (t1.get$isEmpty(numerators)) {
+        t1 = denominators.length;
+        if (t1 === 0)
+          return "no units";
+        if (t1 === 1)
+          return J.$add$ansx(C.JSArray_methods.get$single(denominators), "^-1");
+        return "(" + C.JSArray_methods.join$1(denominators, "*") + ")^-1";
+      }
+      if (denominators.length === 0)
+        return t1.join$1(numerators, "*");
+      return t1.join$1(numerators, "*") + "/" + C.JSArray_methods.join$1(denominators, "*");
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      if (other instanceof T.SassNumber) {
+        if (J.get$length$asx(_this.get$numeratorUnits()) !== J.get$length$asx(other.get$numeratorUnits()) || _this.get$denominatorUnits().length !== other.get$denominatorUnits().length)
+          return false;
+        if (!_this.get$hasUnits())
+          return Math.abs(_this.value - other.value) < $.$get$epsilon();
+        if (!C.C_ListEquality.equals$2(0, _this._canonicalizeUnitList$1(_this.get$numeratorUnits()), _this._canonicalizeUnitList$1(other.get$numeratorUnits())) || !C.C_ListEquality.equals$2(0, _this._canonicalizeUnitList$1(_this.get$denominatorUnits()), _this._canonicalizeUnitList$1(other.get$denominatorUnits())))
+          return false;
+        return Math.abs(_this.value * _this._canonicalMultiplier$1(_this.get$numeratorUnits()) / _this._canonicalMultiplier$1(_this.get$denominatorUnits()) - other.value * _this._canonicalMultiplier$1(other.get$numeratorUnits()) / _this._canonicalMultiplier$1(other.get$denominatorUnits())) < $.$get$epsilon();
+      } else
+        return false;
+    },
+    get$hashCode: function(_) {
+      var _this = this;
+      return T.fuzzyHashCode(_this.value * _this._canonicalMultiplier$1(_this.get$numeratorUnits()) / _this._canonicalMultiplier$1(_this.get$denominatorUnits()));
+    },
+    _canonicalizeUnitList$1: function(units) {
+      var type,
+        t1 = J.getInterceptor$asx(units);
+      if (t1.get$isEmpty(units))
+        return units;
+      if (t1.get$length(units) === 1) {
+        type = $.$get$_typesByUnit().$index(0, t1.get$first(units));
+        if (type == null)
+          t1 = units;
+        else {
+          t1 = C.Map_U8AHF.$index(0, type);
+          t1 = H.setRuntimeTypeInfo([(t1 && C.JSArray_methods).get$first(t1)], type$.JSArray_legacy_String);
+        }
+        return t1;
+      }
+      t1 = t1.map$1$1(units, new T.SassNumber__canonicalizeUnitList_closure(), type$.legacy_String);
+      t1 = P.List_List$from(t1, true, t1.$ti._eval$1("ListIterable.E"));
+      C.JSArray_methods.sort$0(t1);
+      return t1;
+    },
+    _canonicalMultiplier$1: function(units) {
+      return J.fold$2$ax(units, 1, new T.SassNumber__canonicalMultiplier_closure(this));
+    },
+    canonicalMultiplierForUnit$1: function(unit) {
+      var t1,
+        innerMap = C.Map_K2BWj.$index(0, unit);
+      if (innerMap == null)
+        t1 = 1;
+      else {
+        t1 = innerMap.get$values(innerMap);
+        t1 = 1 / t1.get$first(t1);
+      }
+      return t1;
+    },
+    _number$_exception$2: function(message, $name) {
+      return new E.SassScriptException($name == null ? message : "$" + $name + ": " + message);
+    }
+  };
+  T.SassNumber__coerceOrConvertValue__compatibilityException.prototype = {
+    call$0: function() {
+      var t2, t3, message, t4, type, unit, _this = this,
+        t1 = _this.other;
+      if (t1 != null) {
+        t2 = _this.$this;
+        t3 = t2.toString$0(0) + " and";
+        message = new P.StringBuffer(t3);
+        t4 = _this.otherName;
+        if (t4 != null)
+          t3 = message._contents = t3 + (" $" + t4 + ":");
+        t1 = t3 + (" " + t1.toString$0(0) + " have incompatible units");
+        message._contents = t1;
+        if (!t2.get$hasUnits() || !_this.otherHasUnits)
+          message._contents = t1 + " (one has units and the other doesn't)";
+        t1 = message.toString$0(0) + ".";
+        t2 = _this.name;
+        return new E.SassScriptException(t2 == null ? t1 : "$" + t2 + ": " + t1);
+      } else if (!_this.otherHasUnits) {
+        t1 = "Expected " + _this.$this.toString$0(0) + " to have no units.";
+        t2 = _this.name;
+        return new E.SassScriptException(t2 == null ? t1 : "$" + t2 + ": " + t1);
+      } else {
+        t1 = _this.newNumerators;
+        t2 = J.getInterceptor$asx(t1);
+        if (t2.get$length(t1) === 1 && _this.newDenominators.length === 0) {
+          type = $.$get$_typesByUnit().$index(0, t2.get$first(t1));
+          if (type != null) {
+            t1 = "Expected " + _this.$this.toString$0(0) + " to have ";
+            t1 = t1 + (C.JSArray_methods.contains$1(H.setRuntimeTypeInfo([97, 101, 105, 111, 117], type$.JSArray_legacy_int), C.JSString_methods._codeUnitAt$1(type, 0)) ? "an " + type : "a " + type) + " unit (";
+            t2 = C.Map_U8AHF.$index(0, type);
+            t2 = t1 + (t2 && C.JSArray_methods).join$1(t2, ", ") + ").";
+            t1 = _this.name;
+            return new E.SassScriptException(t1 == null ? t2 : "$" + t1 + ": " + t2);
+          }
+        }
+        t3 = _this.newDenominators;
+        unit = B.pluralize("unit", t2.get$length(t1) + t3.length, null);
+        t2 = _this.$this;
+        t3 = "Expected " + t2.toString$0(0) + " to have " + unit + " " + t2._unitString$2(t1, t3) + ".";
+        t1 = _this.name;
+        return new E.SassScriptException(t1 == null ? t3 : "$" + t1 + ": " + t3);
+      }
+    },
+    $signature: 219
+  };
+  T.SassNumber__coerceOrConvertValue_closure.prototype = {
+    call$1: function(oldNumerator) {
+      var t1,
+        factor = this.$this.conversionFactor$2(this.newNumerator, oldNumerator);
+      if (factor == null)
+        return false;
+      t1 = this._box_0;
+      t1.value = t1.value * factor;
+      return true;
+    },
+    $signature: 6
+  };
+  T.SassNumber__coerceOrConvertValue_closure0.prototype = {
+    call$0: function() {
+      return H.throwExpression(this._compatibilityException.call$0());
+    },
+    $signature: 0
+  };
+  T.SassNumber__coerceOrConvertValue_closure1.prototype = {
+    call$1: function(oldDenominator) {
+      var t1,
+        factor = this.$this.conversionFactor$2(this.newDenominator, oldDenominator);
+      if (factor == null)
+        return false;
+      t1 = this._box_0;
+      t1.value = t1.value / factor;
+      return true;
+    },
+    $signature: 6
+  };
+  T.SassNumber__coerceOrConvertValue_closure2.prototype = {
+    call$0: function() {
+      return H.throwExpression(this._compatibilityException.call$0());
+    },
+    $signature: 0
+  };
+  T.SassNumber_plus_closure.prototype = {
+    call$2: function(num1, num2) {
+      return num1 + num2;
+    },
+    $signature: 50
+  };
+  T.SassNumber_minus_closure.prototype = {
+    call$2: function(num1, num2) {
+      return num1 - num2;
+    },
+    $signature: 50
+  };
+  T.SassNumber_multiplyUnits_closure.prototype = {
+    call$1: function(denominator) {
+      var factor = this.$this.conversionFactor$2(this.numerator, denominator);
+      if (factor == null)
+        return false;
+      this._box_0.value /= factor;
+      return true;
+    },
+    $signature: 6
+  };
+  T.SassNumber_multiplyUnits_closure0.prototype = {
+    call$0: function() {
+      this.newNumerators.push(this.numerator);
+      return null;
+    },
+    $signature: 0
+  };
+  T.SassNumber_multiplyUnits_closure1.prototype = {
+    call$1: function(denominator) {
+      var factor = this.$this.conversionFactor$2(this.numerator, denominator);
+      if (factor == null)
+        return false;
+      this._box_0.value /= factor;
+      return true;
+    },
+    $signature: 6
+  };
+  T.SassNumber_multiplyUnits_closure2.prototype = {
+    call$0: function() {
+      this.newNumerators.push(this.numerator);
+      return null;
+    },
+    $signature: 0
+  };
+  T.SassNumber__areAnyConvertible_closure.prototype = {
+    call$1: function(unit1) {
+      if (!C.Map_K2BWj.containsKey$1(unit1))
+        return J.contains$1$asx(this.units2, unit1);
+      return J.any$1$ax(this.units2, C.Map_K2BWj.$index(0, unit1).get$containsKey());
+    },
+    $signature: 6
+  };
+  T.SassNumber__canonicalizeUnitList_closure.prototype = {
+    call$1: function(unit) {
+      var t1,
+        type = $.$get$_typesByUnit().$index(0, unit);
+      if (type == null)
+        t1 = unit;
+      else {
+        t1 = C.Map_U8AHF.$index(0, type);
+        t1 = (t1 && C.JSArray_methods).get$first(t1);
+      }
+      return t1;
+    },
+    $signature: 4
+  };
+  T.SassNumber__canonicalMultiplier_closure.prototype = {
+    call$2: function(multiplier, unit) {
+      return multiplier * this.$this.canonicalMultiplierForUnit$1(unit);
+    },
+    $signature: 211
+  };
+  S.ComplexSassNumber.prototype = {
+    get$hasUnits: function() {
+      return true;
+    },
+    hasUnit$1: function(unit) {
+      return false;
+    },
+    compatibleWithUnit$1: function(unit) {
+      return false;
+    },
+    withValue$1: function(value) {
+      return new S.ComplexSassNumber(this.numeratorUnits, this.denominatorUnits, value, null);
+    },
+    withSlash$2: function(numerator, denominator) {
+      return new S.ComplexSassNumber(this.numeratorUnits, this.denominatorUnits, this.value, new S.Tuple2(numerator, denominator, type$.Tuple2_of_legacy_SassNumber_and_legacy_SassNumber));
+    },
+    get$numeratorUnits: function() {
+      return this.numeratorUnits;
+    },
+    get$denominatorUnits: function() {
+      return this.denominatorUnits;
+    }
+  };
+  L.SingleUnitSassNumber.prototype = {
+    get$numeratorUnits: function() {
+      return new P.UnmodifiableListView(H.setRuntimeTypeInfo([this._unit], type$.JSArray_legacy_String), type$.UnmodifiableListView_legacy_String);
+    },
+    get$denominatorUnits: function() {
+      return C.List_empty;
+    },
+    get$hasUnits: function() {
+      return true;
+    },
+    withValue$1: function(value) {
+      return new L.SingleUnitSassNumber(this._unit, value, null);
+    },
+    withSlash$2: function(numerator, denominator) {
+      return new L.SingleUnitSassNumber(this._unit, this.value, new S.Tuple2(numerator, denominator, type$.Tuple2_of_legacy_SassNumber_and_legacy_SassNumber));
+    },
+    hasUnit$1: function(unit) {
+      return unit === this._unit;
+    },
+    compatibleWithUnit$1: function(unit) {
+      return this.conversionFactor$2(this._unit, unit) != null;
+    },
+    coerceValueToMatch$1: function(other) {
+      return this.convertValueToMatch$3(other, null, null);
+    },
+    convertValueToMatch$3: function(other, $name, otherName) {
+      var t1 = other instanceof L.SingleUnitSassNumber ? this._coerceValueToUnit$1(other._unit) : null;
+      return t1 == null ? this.super$SassNumber$convertValueToMatch(other, $name, otherName) : t1;
+    },
+    coerce$2: function(newNumerators, newDenominators) {
+      var t1 = J.getInterceptor$asx(newNumerators);
+      t1 = t1.get$length(newNumerators) === 1 && newDenominators.length === 0 ? this._coerceToUnit$1(t1.$index(newNumerators, 0)) : null;
+      return t1 == null ? this.super$SassNumber$coerce(newNumerators, newDenominators, null) : t1;
+    },
+    coerceValue$3: function(newNumerators, newDenominators, $name) {
+      var t1 = J.getInterceptor$asx(newNumerators);
+      t1 = t1.get$length(newNumerators) === 1 && newDenominators.length === 0 ? this._coerceValueToUnit$1(t1.$index(newNumerators, 0)) : null;
+      return t1 == null ? this.super$SassNumber$coerceValue(newNumerators, newDenominators, $name) : t1;
+    },
+    coerceValueToUnit$2: function(unit, $name) {
+      var t1 = this._coerceValueToUnit$1(unit);
+      return t1 == null ? this.super$SassNumber$coerceValueToUnit(unit, $name) : t1;
+    },
+    _coerceToUnit$1: function(unit) {
+      var factor, _this = this,
+        t1 = _this._unit;
+      if (t1 == unit)
+        return _this;
+      factor = _this.conversionFactor$2(unit, t1);
+      return factor == null ? null : new L.SingleUnitSassNumber(unit, _this.value * factor, null);
+    },
+    _coerceValueToUnit$1: function(unit) {
+      var factor = this.conversionFactor$2(unit, this._unit);
+      return factor == null ? null : this.value * factor;
+    },
+    multiplyUnits$3: function(value, otherNumerators, otherDenominators) {
+      var mutableOtherDenominators, t1 = {};
+      t1.value = value;
+      t1.newNumerators = otherNumerators;
+      mutableOtherDenominators = J.toList$0$ax(otherDenominators);
+      B.removeFirstWhere(mutableOtherDenominators, new L.SingleUnitSassNumber_multiplyUnits_closure(t1, this), new L.SingleUnitSassNumber_multiplyUnits_closure0(t1, this));
+      return T.SassNumber_SassNumber$withUnits(t1.value, mutableOtherDenominators, t1.newNumerators);
+    },
+    unaryMinus$0: function() {
+      return new L.SingleUnitSassNumber(this._unit, -this.value, null);
+    },
+    $eq: function(_, other) {
+      var factor;
+      if (other == null)
+        return false;
+      if (other instanceof L.SingleUnitSassNumber) {
+        factor = this.conversionFactor$2(other._unit, this._unit);
+        return factor != null && Math.abs(this.value * factor - other.value) < $.$get$epsilon();
+      } else
+        return false;
+    },
+    get$hashCode: function(_) {
+      return T.fuzzyHashCode(this.value * this.canonicalMultiplierForUnit$1(this._unit));
+    }
+  };
+  L.SingleUnitSassNumber_multiplyUnits_closure.prototype = {
+    call$1: function(denominator) {
+      var t1 = this.$this,
+        factor = t1.conversionFactor$2(denominator, t1._unit);
+      if (factor == null)
+        return false;
+      this._box_0.value *= factor;
+      return true;
+    },
+    $signature: 6
+  };
+  L.SingleUnitSassNumber_multiplyUnits_closure0.prototype = {
+    call$0: function() {
+      var t2, t3,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      t1.push(this.$this._unit);
+      for (t2 = this._box_0, t3 = J.get$iterator$ax(t2.newNumerators); t3.moveNext$0();)
+        t1.push(t3.get$current(t3));
+      t2.newNumerators = t1;
+      return null;
+    },
+    $signature: 0
+  };
+  N.UnitlessSassNumber.prototype = {
+    get$numeratorUnits: function() {
+      return C.List_empty;
+    },
+    get$denominatorUnits: function() {
+      return C.List_empty;
+    },
+    get$hasUnits: function() {
+      return false;
+    },
+    withValue$1: function(value) {
+      return new N.UnitlessSassNumber(value, null);
+    },
+    withSlash$2: function(numerator, denominator) {
+      return new N.UnitlessSassNumber(this.value, new S.Tuple2(numerator, denominator, type$.Tuple2_of_legacy_SassNumber_and_legacy_SassNumber));
+    },
+    hasUnit$1: function(unit) {
+      return false;
+    },
+    compatibleWithUnit$1: function(unit) {
+      return true;
+    },
+    coerceValueToMatch$1: function(other) {
+      return this.value;
+    },
+    convertValueToMatch$3: function(other, $name, otherName) {
+      return other.get$hasUnits() ? this.super$SassNumber$convertValueToMatch(other, $name, otherName) : this.value;
+    },
+    coerce$2: function(newNumerators, newDenominators) {
+      return T.SassNumber_SassNumber$withUnits(this.value, newDenominators, newNumerators);
+    },
+    coerceValue$3: function(newNumerators, newDenominators, $name) {
+      return this.value;
+    },
+    coerceValueToUnit$2: function(unit, $name) {
+      return this.value;
+    },
+    greaterThan$1: function(other) {
+      var t1, t2;
+      if (other instanceof T.SassNumber) {
+        t1 = this.value;
+        t2 = other.value;
+        return t1 > t2 && !(Math.abs(t1 - t2) < $.$get$epsilon()) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+      }
+      return this.super$SassNumber$greaterThan(other);
+    },
+    greaterThanOrEquals$1: function(other) {
+      var t1, t2;
+      if (other instanceof T.SassNumber) {
+        t1 = this.value;
+        t2 = other.value;
+        return t1 > t2 || Math.abs(t1 - t2) < $.$get$epsilon() ? C.SassBoolean_true0 : C.SassBoolean_false0;
+      }
+      return this.super$SassNumber$greaterThanOrEquals(other);
+    },
+    lessThan$1: function(other) {
+      var t1, t2;
+      if (other instanceof T.SassNumber) {
+        t1 = this.value;
+        t2 = other.value;
+        return t1 < t2 && !(Math.abs(t1 - t2) < $.$get$epsilon()) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+      }
+      return this.super$SassNumber$lessThan(other);
+    },
+    lessThanOrEquals$1: function(other) {
+      var t1, t2;
+      if (other instanceof T.SassNumber) {
+        t1 = this.value;
+        t2 = other.value;
+        return t1 < t2 || Math.abs(t1 - t2) < $.$get$epsilon() ? C.SassBoolean_true0 : C.SassBoolean_false0;
+      }
+      return this.super$SassNumber$lessThanOrEquals(other);
+    },
+    modulo$1: function(other) {
+      if (other instanceof T.SassNumber)
+        return other.withValue$1(this.moduloLikeSass$2(this.value, other.value));
+      return this.super$SassNumber$modulo(other);
+    },
+    plus$1: function(other) {
+      if (other instanceof T.SassNumber)
+        return other.withValue$1(this.value + other.value);
+      return this.super$SassNumber$plus(other);
+    },
+    minus$1: function(other) {
+      if (other instanceof T.SassNumber)
+        return other.withValue$1(this.value - other.value);
+      return this.super$SassNumber$minus(other);
+    },
+    times$1: function(other) {
+      if (other instanceof T.SassNumber)
+        return other.withValue$1(this.value * other.value);
+      return this.super$SassNumber$times(other);
+    },
+    dividedBy$1: function(other) {
+      var t1, t2, t3;
+      if (other instanceof T.SassNumber) {
+        t1 = other.get$hasUnits();
+        t2 = this.value;
+        t3 = other.value;
+        if (t1) {
+          t1 = other.get$denominatorUnits();
+          t1 = T.SassNumber_SassNumber$withUnits(t2 / t3, other.get$numeratorUnits(), t1);
+        } else
+          t1 = new N.UnitlessSassNumber(t2 / t3, null);
+        return t1;
+      }
+      return this.super$SassNumber$dividedBy(other);
+    },
+    unaryMinus$0: function() {
+      return new N.UnitlessSassNumber(-this.value, null);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof N.UnitlessSassNumber && Math.abs(this.value - other.value) < $.$get$epsilon();
+    },
+    get$hashCode: function(_) {
+      return T.fuzzyHashCode(this.value);
+    }
+  };
+  D.SassString.prototype = {
+    get$sassLength: function() {
+      var t1 = this._sassLength;
+      if (t1 == null) {
+        t1 = this.text;
+        t1.toString;
+        t1 = new P.Runes(t1);
+        t1 = this._sassLength = t1.get$length(t1);
+      }
+      return t1;
+    },
+    get$isSpecialNumber: function() {
+      var t1, t2;
+      if (this.hasQuotes)
+        return false;
+      t1 = this.text;
+      if (t1.length < 6)
+        return false;
+      t2 = J.getInterceptor$s(t1)._codeUnitAt$1(t1, 0) | 32;
+      if (t2 === 99) {
+        t2 = C.JSString_methods._codeUnitAt$1(t1, 1) | 32;
+        if (t2 === 108) {
+          if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 97)
+            return false;
+          if ((C.JSString_methods._codeUnitAt$1(t1, 3) | 32) !== 109)
+            return false;
+          if ((C.JSString_methods._codeUnitAt$1(t1, 4) | 32) !== 112)
+            return false;
+          return C.JSString_methods._codeUnitAt$1(t1, 5) === 40;
+        } else if (t2 === 97) {
+          if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 108)
+            return false;
+          if ((C.JSString_methods._codeUnitAt$1(t1, 3) | 32) !== 99)
+            return false;
+          return C.JSString_methods._codeUnitAt$1(t1, 4) === 40;
+        } else
+          return false;
+      } else if (t2 === 118) {
+        if ((C.JSString_methods._codeUnitAt$1(t1, 1) | 32) !== 97)
+          return false;
+        if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 114)
+          return false;
+        return C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+      } else if (t2 === 101) {
+        if ((C.JSString_methods._codeUnitAt$1(t1, 1) | 32) !== 110)
+          return false;
+        if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 118)
+          return false;
+        return C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+      } else if (t2 === 109) {
+        t2 = C.JSString_methods._codeUnitAt$1(t1, 1) | 32;
+        if (t2 === 97) {
+          if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 120)
+            return false;
+          return C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+        } else if (t2 === 105) {
+          if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 110)
+            return false;
+          return C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+        } else
+          return false;
+      } else
+        return false;
+    },
+    get$isVar: function() {
+      if (this.hasQuotes)
+        return false;
+      var t1 = this.text;
+      if (t1.length < 8)
+        return false;
+      return (J.getInterceptor$s(t1)._codeUnitAt$1(t1, 0) | 32) === 118 && (C.JSString_methods._codeUnitAt$1(t1, 1) | 32) === 97 && (C.JSString_methods._codeUnitAt$1(t1, 2) | 32) === 114 && C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+    },
+    get$isBlank: function() {
+      return !this.hasQuotes && this.text.length === 0;
+    },
+    accept$1$1: function(visitor) {
+      var t1 = visitor._quote && this.hasQuotes,
+        t2 = this.text;
+      if (t1)
+        visitor._visitQuotedString$1(t2);
+      else
+        visitor._visitUnquotedString$1(t2);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertString$1: function($name) {
+      return this;
+    },
+    plus$1: function(other) {
+      var t1 = this.text,
+        t2 = this.hasQuotes;
+      if (other instanceof D.SassString)
+        return new D.SassString(J.$add$ansx(t1, other.text), t2);
+      else {
+        other.toString;
+        return new D.SassString(J.$add$ansx(t1, N.serializeValue0(other, false, true)), t2);
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof D.SassString && this.text == other.text;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.text);
+    }
+  };
+  E._EvaluateVisitor0.prototype = {
+    _EvaluateVisitor$5$functions$importCache$logger$nodeImporter$sourceMap0: function(functions, importCache, logger, nodeImporter, sourceMap) {
+      var t2, cur, _i, metaModule, t3, module, $function, t4, _this = this,
+        _s20_ = "$name, $module: null",
+        _s9_ = "sass:meta",
+        metaFunctions = [Q.BuiltInCallable$function("global-variable-exists", _s20_, new E._EvaluateVisitor_closure9(_this), _s9_), Q.BuiltInCallable$function("variable-exists", "$name", new E._EvaluateVisitor_closure10(_this), _s9_), Q.BuiltInCallable$function("function-exists", _s20_, new E._EvaluateVisitor_closure11(_this), _s9_), Q.BuiltInCallable$function("mixin-exists", _s20_, new E._EvaluateVisitor_closure12(_this), _s9_), Q.BuiltInCallable$function("content-exists", "", new E._EvaluateVisitor_closure13(_this), _s9_), Q.BuiltInCallable$function("module-variables", "$module", new E._EvaluateVisitor_closure14(_this), _s9_), Q.BuiltInCallable$function("module-functions", "$module", new E._EvaluateVisitor_closure15(_this), _s9_), Q.BuiltInCallable$function("get-function", "$name, $css: false, $module: null", new E._EvaluateVisitor_closure16(_this), _s9_), new S.AsyncBuiltInCallable("call", L.ScssParser$("@function call($function, $args...) {", null, _s9_).parseArgumentDeclaration$0(), new E._EvaluateVisitor_closure17(_this))],
+        t1 = type$.JSArray_legacy_AsyncBuiltInCallable,
+        metaMixins = H.setRuntimeTypeInfo([S.AsyncBuiltInCallable$mixin("load-css", "$url, $with: null", new E._EvaluateVisitor_closure18(_this), _s9_)], t1);
+      t1 = H.setRuntimeTypeInfo([], t1);
+      for (t2 = $.$get$global(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (_i = 0; _i < 9; ++_i)
+        t1.push(metaFunctions[_i]);
+      metaModule = Q.BuiltInModule$("meta", t1, metaMixins, null, type$.legacy_AsyncBuiltInCallable);
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_BuiltInModule_legacy_AsyncBuiltInCallable);
+      for (t2 = $.$get$coreModules(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      t1.push(metaModule);
+      t2 = t1.length;
+      t3 = _this._async_evaluate$_builtInModules;
+      _i = 0;
+      for (; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        module = t1[_i];
+        t3.$indexSet(0, module.url, module);
+      }
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AsyncCallable_2);
+      for (t2 = $.$get$globalFunctions(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (_i = 0; _i < 9; ++_i)
+        t1.push(metaFunctions[_i]);
+      for (t2 = t1.length, t3 = _this._async_evaluate$_builtInFunctions, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        $function = t1[_i];
+        t4 = $function.get$name($function);
+        t4.toString;
+        t3.$indexSet(0, H.stringReplaceAllUnchecked(t4, "_", "-"), $function);
+      }
+    },
+    run$2: function(_, importer, node) {
+      return this.run$body$_EvaluateVisitor(_, importer, node);
+    },
+    run$body$_EvaluateVisitor: function(_, importer, node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_EvaluateResult),
+        $async$returnValue, $async$self = this;
+      var $async$run$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = $async$self._async_evaluate$_withWarnCallback$1$1(new E._EvaluateVisitor_run_closure0($async$self, node, importer), type$.legacy_FutureOr_legacy_EvaluateResult);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$run$2, $async$completer);
+    },
+    _async_evaluate$_withWarnCallback$1$1: function(callback, $T) {
+      return N.withWarnCallback(new E._EvaluateVisitor__withWarnCallback_closure0(this), callback, $T._eval$1("0*"));
+    },
+    _async_evaluate$_loadModule$7$baseUrl$configuration$namesInErrors: function(url, stackFrame, nodeWithSpan, callback, baseUrl, configuration, namesInErrors) {
+      return this._loadModule$body$_EvaluateVisitor(url, stackFrame, nodeWithSpan, callback, baseUrl, configuration, namesInErrors);
+    },
+    _async_evaluate$_loadModule$5$configuration: function(url, stackFrame, nodeWithSpan, callback, configuration) {
+      return this._async_evaluate$_loadModule$7$baseUrl$configuration$namesInErrors(url, stackFrame, nodeWithSpan, callback, null, configuration, false);
+    },
+    _async_evaluate$_loadModule$4: function(url, stackFrame, nodeWithSpan, callback) {
+      return this._async_evaluate$_loadModule$7$baseUrl$configuration$namesInErrors(url, stackFrame, nodeWithSpan, callback, null, null, false);
+    },
+    _loadModule$body$_EvaluateVisitor: function(url, stackFrame, nodeWithSpan, callback, baseUrl, configuration, namesInErrors) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$self = this, t1, builtInModule;
+      var $async$_async_evaluate$_loadModule$7$baseUrl$configuration$namesInErrors = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              builtInModule = $async$self._async_evaluate$_builtInModules.$index(0, url);
+              if (builtInModule != null) {
+                if (configuration != null && !configuration.isImplicit) {
+                  t1 = namesInErrors ? "Built-in module " + H.S(url) + " can't be configured." : "Built-in modules can't be configured.";
+                  throw H.wrapException($async$self._async_evaluate$_exception$2(t1, nodeWithSpan.get$span()));
+                }
+                $async$self._async_evaluate$_addExceptionSpan$2(nodeWithSpan, new E._EvaluateVisitor__loadModule_closure1(callback, builtInModule));
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_withStackFrame$1$3(stackFrame, nodeWithSpan, new E._EvaluateVisitor__loadModule_closure2($async$self, url, nodeWithSpan, baseUrl, namesInErrors, configuration, callback), type$.Null), $async$_async_evaluate$_loadModule$7$baseUrl$configuration$namesInErrors);
+            case 3:
+              // returning from await.
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_loadModule$7$baseUrl$configuration$namesInErrors, $async$completer);
+    },
+    _async_evaluate$_execute$5$configuration$namesInErrors$nodeWithSpan: function(importer, stylesheet, configuration, namesInErrors, nodeWithSpan) {
+      return this._execute$body$_EvaluateVisitor(importer, stylesheet, configuration, namesInErrors, nodeWithSpan);
+    },
+    _async_evaluate$_execute$2: function(importer, stylesheet) {
+      return this._async_evaluate$_execute$5$configuration$namesInErrors$nodeWithSpan(importer, stylesheet, null, false, null);
+    },
+    _execute$body$_EvaluateVisitor: function(importer, stylesheet, configuration, namesInErrors, nodeWithSpan) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Module_legacy_AsyncCallable),
+        $async$returnValue, $async$self = this, message, existingNode, environment, extender, module, t1, url, t2, alreadyLoaded;
+      var $async$_async_evaluate$_execute$5$configuration$namesInErrors$nodeWithSpan = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              url = stylesheet.span.file.url;
+              t2 = $async$self._async_evaluate$_modules;
+              alreadyLoaded = t2.$index(0, url);
+              if (alreadyLoaded != null) {
+                t1 = configuration == null;
+                if (!(t1 ? $async$self._async_evaluate$_configuration : configuration).isImplicit) {
+                  message = namesInErrors ? H.S($.$get$context().prettyUri$1(url)) + string$.x20was_a : string$.This_mw;
+                  existingNode = $async$self._async_evaluate$_moduleNodes.$index(0, url);
+                  t2 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_FileSpan, type$.legacy_String);
+                  if (existingNode != null)
+                    t2.$indexSet(0, existingNode.get$span(), "original load");
+                  if (t1)
+                    t2.$indexSet(0, $async$self._async_evaluate$_configuration.nodeWithSpan.get$span(), "configuration");
+                  throw H.wrapException(t2.get$isEmpty(t2) ? $async$self._async_evaluate$_exception$1(message) : $async$self._async_evaluate$_multiSpanException$3(message, "new load", t2));
+                }
+                $async$returnValue = alreadyLoaded;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              environment = Q.AsyncEnvironment$($async$self._async_evaluate$_sourceMap);
+              t1.css = null;
+              extender = F.Extender$();
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_withEnvironment$1$2(environment, new E._EvaluateVisitor__execute_closure0(t1, $async$self, importer, stylesheet, extender, configuration), type$.Null), $async$_async_evaluate$_execute$5$configuration$namesInErrors$nodeWithSpan);
+            case 3:
+              // returning from await.
+              module = Q._EnvironmentModule__EnvironmentModule0(environment, t1.css, extender, environment._async_environment$_forwardedModules);
+              t2.$indexSet(0, url, module);
+              $async$self._async_evaluate$_moduleNodes.$indexSet(0, url, nodeWithSpan);
+              $async$returnValue = module;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_execute$5$configuration$namesInErrors$nodeWithSpan, $async$completer);
+    },
+    _async_evaluate$_addOutOfOrderImports$0: function() {
+      var t1, statements, _this = this;
+      if (_this._async_evaluate$_outOfOrderImports == null)
+        return _this._async_evaluate$_root.children;
+      t1 = new Array(J.get$length$asx(_this._async_evaluate$_root.children._collection$_source) + _this._async_evaluate$_outOfOrderImports.length);
+      t1.fixed$length = Array;
+      statements = new G.FixedLengthListBuilder(H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_ModifiableCssNode), type$.FixedLengthListBuilder_legacy_ModifiableCssNode);
+      statements.addRange$3(_this._async_evaluate$_root.children, 0, _this._async_evaluate$_endOfImports);
+      statements.addAll$1(0, _this._async_evaluate$_outOfOrderImports);
+      statements.addRange$2(_this._async_evaluate$_root.children, _this._async_evaluate$_endOfImports);
+      return statements.build$0();
+    },
+    _async_evaluate$_combineCss$2$clone: function(root, clone) {
+      var selectors, unsatisfiedExtension, sortedModules, t1, imports, css, cur, t2, statements, index, _this = this;
+      if (!C.JSArray_methods.any$1(root.get$upstream(), new E._EvaluateVisitor__combineCss_closure2())) {
+        selectors = root.get$extender().get$simpleSelectors();
+        unsatisfiedExtension = B.firstOrNull(root.get$extender().extensionsWhereTarget$1(new E._EvaluateVisitor__combineCss_closure3(selectors)));
+        if (unsatisfiedExtension != null)
+          _this._async_evaluate$_throwForUnsatisfiedExtension$1(unsatisfiedExtension);
+        return root.get$css(root);
+      }
+      sortedModules = _this._async_evaluate$_topologicalModules$1(root);
+      if (clone) {
+        t1 = sortedModules.$ti._eval$1("MappedListIterable<ListMixin.E,Module<AsyncCallable*>*>");
+        sortedModules = P.List_List$from(new H.MappedListIterable(sortedModules, new E._EvaluateVisitor__combineCss_closure4(), t1), true, t1._eval$1("ListIterable.E"));
+      }
+      _this._async_evaluate$_extendModules$1(sortedModules);
+      t1 = type$.JSArray_legacy_CssNode;
+      imports = H.setRuntimeTypeInfo([], t1);
+      css = H.setRuntimeTypeInfo([], t1);
+      for (t1 = J.get$reversed$ax(sortedModules), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        t2 = cur.get$css(cur);
+        statements = t2.get$children(t2);
+        index = _this._async_evaluate$_indexAfterImports$1(statements);
+        t2 = J.getInterceptor$ax(statements);
+        C.JSArray_methods.addAll$1(imports, t2.getRange$2(statements, 0, index));
+        C.JSArray_methods.addAll$1(css, t2.getRange$2(statements, index, t2.get$length(statements)));
+      }
+      return new V.CssStylesheet(new P.UnmodifiableListView(C.JSArray_methods.$add(imports, css), type$.UnmodifiableListView_legacy_CssNode), root.get$css(root).get$span());
+    },
+    _async_evaluate$_combineCss$1: function(root) {
+      return this._async_evaluate$_combineCss$2$clone(root, false);
+    },
+    _async_evaluate$_extendModules$1: function(sortedModules) {
+      var t1, t2, originalSelectors, extenders, t3, t4, _i,
+        downstreamExtenders = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Uri, type$.legacy_List_legacy_Extender),
+        unsatisfiedExtensions = new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_Extension);
+      for (t1 = J.get$iterator$ax(sortedModules); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        originalSelectors = t2.get$extender().get$simpleSelectors().toSet$0(0);
+        unsatisfiedExtensions.addAll$1(0, t2.get$extender().extensionsWhereTarget$1(new E._EvaluateVisitor__extendModules_closure1(originalSelectors)));
+        extenders = downstreamExtenders.$index(0, t2.get$url());
+        if (extenders != null)
+          t2.get$extender().addExtensions$1(extenders);
+        t3 = t2.get$extender();
+        if (t3.get$isEmpty(t3))
+          continue;
+        for (t3 = t2.get$upstream(), t4 = t3.length, _i = 0; _i < t3.length; t3.length === t4 || (0, H.throwConcurrentModificationError)(t3), ++_i)
+          J.add$1$ax(downstreamExtenders.putIfAbsent$2(t3[_i].get$url(), new E._EvaluateVisitor__extendModules_closure2()), t2.get$extender());
+        unsatisfiedExtensions.removeAll$1(t2.get$extender().extensionsWhereTarget$1(originalSelectors.get$contains(originalSelectors)));
+      }
+      if (unsatisfiedExtensions._collection$_length !== 0)
+        this._async_evaluate$_throwForUnsatisfiedExtension$1(unsatisfiedExtensions.get$first(unsatisfiedExtensions));
+    },
+    _async_evaluate$_throwForUnsatisfiedExtension$1: function(extension) {
+      throw H.wrapException(E.SassException$(string$.The_ta + H.S(extension.target) + ' !optional" to avoid this error.', extension.span));
+    },
+    _async_evaluate$_topologicalModules$1: function(root) {
+      var t1 = type$.legacy_Module_legacy_AsyncCallable,
+        sorted = Q.QueueList$(null, t1);
+      new E._EvaluateVisitor__topologicalModules_visitModule0(P.LinkedHashSet_LinkedHashSet$_empty(t1), sorted).call$1(root);
+      return sorted;
+    },
+    _async_evaluate$_indexAfterImports$1: function(statements) {
+      var t1, t2, t3, lastImport, i, statement;
+      for (t1 = J.getInterceptor$asx(statements), t2 = type$.legacy_CssComment, t3 = type$.legacy_CssImport, lastImport = -1, i = 0; i < t1.get$length(statements); ++i) {
+        statement = t1.$index(statements, i);
+        if (t3._is(statement))
+          lastImport = i;
+        else if (!t2._is(statement))
+          break;
+      }
+      return lastImport + 1;
+    },
+    visitStylesheet$1: function(node) {
+      return this.visitStylesheet$body$_EvaluateVisitor(node);
+    },
+    visitStylesheet$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, _i;
+      var $async$visitStylesheet$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.children, t2 = t1.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(t1[_i].accept$1($async$self), $async$visitStylesheet$1);
+            case 6:
+              // returning from await.
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitStylesheet$1, $async$completer);
+    },
+    visitAtRootRule$1: function(node) {
+      return this.visitAtRootRule$body$_EvaluateVisitor(node);
+    },
+    visitAtRootRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, root, innerCopy, outerCopy, cur, copy, t1, query, $parent, included, $async$temp1, $async$temp2;
+      var $async$visitAtRootRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.query;
+              $async$goto = t1 != null ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$temp1 = t1;
+              $async$temp2 = E;
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate$_performInterpolation$2$warnForColor(t1, true), $async$visitAtRootRule$1);
+            case 6:
+              // returning from await.
+              $async$result = $async$self._async_evaluate$_adjustParseError$2($async$temp1, new $async$temp2._EvaluateVisitor_visitAtRootRule_closure2($async$self, $async$result));
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$result = C.AtRootQuery_UsS;
+            case 4:
+              // join
+              query = $async$result;
+              $parent = $async$self._async_evaluate$_parent;
+              included = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssParentNode);
+              for (t1 = type$.legacy_CssStylesheet; !t1._is($parent);) {
+                if (!query.excludes$1($parent))
+                  included.push($parent);
+                $parent = $parent._parent;
+              }
+              root = $async$self._async_evaluate$_trimIncluded$1(included);
+              $async$goto = root == $async$self._async_evaluate$_parent ? 7 : 8;
+              break;
+            case 7:
+              // then
+              $async$goto = 9;
+              return P._asyncAwait($async$self._async_evaluate$_environment.scope$1$2$when(new E._EvaluateVisitor_visitAtRootRule_closure3($async$self, node), node.hasDeclarations, type$.Null), $async$visitAtRootRule$1);
+            case 9:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 8:
+              // join
+              innerCopy = included.length === 0 ? null : C.JSArray_methods.get$first(included).copyWithoutChildren$0();
+              for (t1 = H.SubListIterable$(included, 1, null, type$.legacy_ModifiableCssParentNode), t1 = new H.ListIterator(t1, t1.get$length(t1)), outerCopy = innerCopy; t1.moveNext$0(); outerCopy = copy) {
+                cur = t1.__internal$_current;
+                copy = cur.copyWithoutChildren$0();
+                copy.addChild$1(outerCopy);
+              }
+              if (outerCopy != null)
+                root.addChild$1(outerCopy);
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate$_scopeForAtRoot$4(node, innerCopy == null ? root : innerCopy, query, included).call$1(new E._EvaluateVisitor_visitAtRootRule_closure4($async$self, node)), $async$visitAtRootRule$1);
+            case 10:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitAtRootRule$1, $async$completer);
+    },
+    _async_evaluate$_trimIncluded$1: function(nodes) {
+      var $parent, innermostContiguous, i, t2, root,
+        t1 = nodes.length;
+      if (t1 === 0)
+        return this._async_evaluate$_root;
+      $parent = this._async_evaluate$_parent;
+      for (innermostContiguous = null, i = 0; i < t1; ++i) {
+        for (; $parent != nodes[i]; innermostContiguous = null)
+          $parent = $parent._parent;
+        if (innermostContiguous == null)
+          innermostContiguous = i;
+        $parent = $parent._parent;
+      }
+      t2 = this._async_evaluate$_root;
+      if ($parent != t2)
+        return t2;
+      root = nodes[innermostContiguous];
+      C.JSArray_methods.removeRange$2(nodes, innermostContiguous, t1);
+      return root;
+    },
+    _async_evaluate$_scopeForAtRoot$4: function(node, newParent, query, included) {
+      var _this = this,
+        scope = new E._EvaluateVisitor__scopeForAtRoot_closure5(_this, newParent, node),
+        t1 = query._all || query._at_root_query$_rule;
+      if (t1 !== query.include)
+        scope = new E._EvaluateVisitor__scopeForAtRoot_closure6(_this, scope);
+      if (_this._async_evaluate$_mediaQueries != null && query.excludesName$1("media"))
+        scope = new E._EvaluateVisitor__scopeForAtRoot_closure7(_this, scope);
+      if (_this._async_evaluate$_inKeyframes && query.excludesName$1("keyframes"))
+        scope = new E._EvaluateVisitor__scopeForAtRoot_closure8(_this, scope);
+      return _this._async_evaluate$_inUnknownAtRule && !C.JSArray_methods.any$1(included, new E._EvaluateVisitor__scopeForAtRoot_closure9()) ? new E._EvaluateVisitor__scopeForAtRoot_closure10(_this, scope) : scope;
+    },
+    visitContentBlock$1: function(node) {
+      return H.throwExpression(P.UnsupportedError$(string$.Evalua));
+    },
+    visitContentRule$1: function(node) {
+      return this.visitContentRule$body$_EvaluateVisitor(node);
+    },
+    visitContentRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, $content;
+      var $async$visitContentRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $content = $async$self._async_evaluate$_environment._async_environment$_content;
+              if ($content == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_runUserDefinedCallable$4(node.$arguments, $content, node, new E._EvaluateVisitor_visitContentRule_closure0($async$self, $content)), $async$visitContentRule$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitContentRule$1, $async$completer);
+    },
+    visitDebugRule$1: function(node) {
+      return this.visitDebugRule$body$_EvaluateVisitor(node);
+    },
+    visitDebugRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, value, t1;
+      var $async$visitDebugRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(node.expression.accept$1($async$self), $async$visitDebugRule$1);
+            case 3:
+              // returning from await.
+              value = $async$result;
+              t1 = value instanceof D.SassString ? value.text : J.toString$0$(value);
+              $async$self._async_evaluate$_logger.debug$2(0, t1, node.span);
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitDebugRule$1, $async$completer);
+    },
+    visitDeclaration$1: function(node) {
+      return this.visitDeclaration$body$_EvaluateVisitor(node);
+    },
+    visitDeclaration$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, $name, t2, cssValue, t3, oldDeclarationName, $async$temp1;
+      var $async$visitDeclaration$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (!($async$self._async_evaluate$_styleRule != null && !$async$self._async_evaluate$_atRootExcludingStyleRule) && !$async$self._async_evaluate$_inUnknownAtRule && !$async$self._async_evaluate$_inKeyframes)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Declarm, node.span));
+              t1 = node.name;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_interpolationToValue$2$warnForColor(t1, true), $async$visitDeclaration$1);
+            case 3:
+              // returning from await.
+              $name = $async$result;
+              t2 = $async$self._async_evaluate$_declarationName;
+              if (t2 != null)
+                $name = new F.CssValue(t2 + "-" + H.S($name.get$value($name)), $name.get$span(), type$.CssValue_legacy_String);
+              t2 = node.value;
+              $async$goto = t2 == null ? 4 : 6;
+              break;
+            case 4:
+              // then
+              $async$result = null;
+              // goto join
+              $async$goto = 5;
+              break;
+            case 6:
+              // else
+              $async$temp1 = F;
+              $async$goto = 7;
+              return P._asyncAwait(t2.accept$1($async$self), $async$visitDeclaration$1);
+            case 7:
+              // returning from await.
+              $async$result = new $async$temp1.CssValue($async$result, t2.get$span(), type$.CssValue_legacy_Value);
+            case 5:
+              // join
+              cssValue = $async$result;
+              if (cssValue != null) {
+                t3 = cssValue.value;
+                t3 = !t3.get$isBlank() || t3.get$asList().length === 0;
+              } else
+                t3 = false;
+              if (t3) {
+                t3 = $async$self._async_evaluate$_parent;
+                t1 = C.JSString_methods.startsWith$1(t1.get$initialPlain(), "--");
+                t2 = $async$self._async_evaluate$_expressionNode$1(t2);
+                t2 = t2 == null ? null : t2.get$span();
+                t3.addChild$1(L.ModifiableCssDeclaration$($name, cssValue, node.span, t1, t2));
+              } else if (J.startsWith$1$s($name.get$value($name), "--") && node.children == null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2("Custom property values may not be empty.", t2.get$span()));
+              $async$goto = node.children != null ? 8 : 9;
+              break;
+            case 8:
+              // then
+              oldDeclarationName = $async$self._async_evaluate$_declarationName;
+              $async$self._async_evaluate$_declarationName = $name.get$value($name);
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate$_environment.scope$1$2$when(new E._EvaluateVisitor_visitDeclaration_closure0($async$self, node), node.hasDeclarations, type$.Null), $async$visitDeclaration$1);
+            case 10:
+              // returning from await.
+              $async$self._async_evaluate$_declarationName = oldDeclarationName;
+            case 9:
+              // join
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitDeclaration$1, $async$completer);
+    },
+    visitEachRule$1: function(node) {
+      return this.visitEachRule$body$_EvaluateVisitor(node);
+    },
+    visitEachRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, list, nodeWithSpan, setVariables;
+      var $async$visitEachRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.list;
+              $async$goto = 3;
+              return P._asyncAwait(t1.accept$1($async$self), $async$visitEachRule$1);
+            case 3:
+              // returning from await.
+              list = $async$result;
+              nodeWithSpan = $async$self._async_evaluate$_expressionNode$1(t1);
+              setVariables = node.variables.length === 1 ? new E._EvaluateVisitor_visitEachRule_closure2($async$self, node, nodeWithSpan) : new E._EvaluateVisitor_visitEachRule_closure3($async$self, node, nodeWithSpan);
+              $async$returnValue = $async$self._async_evaluate$_environment.scope$1$2$semiGlobal(new E._EvaluateVisitor_visitEachRule_closure4($async$self, list, setVariables, node), true, type$.legacy_Value);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitEachRule$1, $async$completer);
+    },
+    _async_evaluate$_setMultipleVariables$3: function(variables, value, nodeWithSpan) {
+      var i,
+        list = value.get$asList(),
+        t1 = variables.length,
+        minLength = Math.min(t1, list.length);
+      for (i = 0; i < minLength; ++i)
+        this._async_evaluate$_environment.setLocalVariable$3(variables[i], list[i].withoutSlash$0(), nodeWithSpan);
+      for (i = minLength; i < t1; ++i)
+        this._async_evaluate$_environment.setLocalVariable$3(variables[i], C.C_SassNull0, nodeWithSpan);
+    },
+    visitErrorRule$1: function(node) {
+      return this.visitErrorRule$body$_EvaluateVisitor(node);
+    },
+    visitErrorRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$self = this, $async$temp1, $async$temp2;
+      var $async$visitErrorRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = H;
+              $async$temp2 = J;
+              $async$goto = 2;
+              return P._asyncAwait(node.expression.accept$1($async$self), $async$visitErrorRule$1);
+            case 2:
+              // returning from await.
+              throw $async$temp1.wrapException($async$self._async_evaluate$_exception$2($async$temp2.toString$0$($async$result), node.span));
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitErrorRule$1, $async$completer);
+    },
+    visitExtendRule$1: function(node) {
+      return this.visitExtendRule$body$_EvaluateVisitor(node);
+    },
+    visitExtendRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, targetText, t1, t2, t3, _i, t4;
+      var $async$visitExtendRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (!($async$self._async_evaluate$_styleRule != null && !$async$self._async_evaluate$_atRootExcludingStyleRule) || $async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.x40exten, node.span));
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_interpolationToValue$2$warnForColor(node.selector, true), $async$visitExtendRule$1);
+            case 3:
+              // returning from await.
+              targetText = $async$result;
+              for (t1 = $async$self._async_evaluate$_adjustParseError$2(targetText, new E._EvaluateVisitor_visitExtendRule_closure0($async$self, targetText)).components, t2 = t1.length, t3 = type$.legacy_CompoundSelector, _i = 0; _i < t2; ++_i) {
+                t4 = t1[_i].components;
+                if (t4.length !== 1 || !(C.JSArray_methods.get$first(t4) instanceof X.CompoundSelector))
+                  throw H.wrapException(E.SassFormatException$("complex selectors may not be extended.", targetText.get$span()));
+                t4 = t3._as(C.JSArray_methods.get$first(t4)).components;
+                if (t4.length !== 1)
+                  throw H.wrapException(E.SassFormatException$(string$.compou + C.JSArray_methods.join$1(t4, ", ") + string$.x60_inst, targetText.get$span()));
+                $async$self._async_evaluate$_extender.addExtension$4($async$self._async_evaluate$_styleRule.selector, C.JSArray_methods.get$first(t4), node, $async$self._async_evaluate$_mediaQueries);
+              }
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitExtendRule$1, $async$completer);
+    },
+    visitAtRule$1: function(node) {
+      return this.visitAtRule$body$_EvaluateVisitor(node);
+    },
+    visitAtRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, $name, t1, value, wasInKeyframes, wasInUnknownAtRule;
+      var $async$visitAtRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.At_rul, node.span));
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_interpolationToValue$1(node.name), $async$visitAtRule$1);
+            case 3:
+              // returning from await.
+              $name = $async$result;
+              t1 = node.value;
+              $async$goto = t1 == null ? 4 : 6;
+              break;
+            case 4:
+              // then
+              $async$result = null;
+              // goto join
+              $async$goto = 5;
+              break;
+            case 6:
+              // else
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate$_interpolationToValue$3$trim$warnForColor(t1, true, true), $async$visitAtRule$1);
+            case 7:
+              // returning from await.
+            case 5:
+              // join
+              value = $async$result;
+              if (node.children == null) {
+                $async$self._async_evaluate$_parent.addChild$1(U.ModifiableCssAtRule$($name, node.span, true, value));
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              wasInKeyframes = $async$self._async_evaluate$_inKeyframes;
+              wasInUnknownAtRule = $async$self._async_evaluate$_inUnknownAtRule;
+              if (B.unvendor($name.get$value($name)) === "keyframes")
+                $async$self._async_evaluate$_inKeyframes = true;
+              else
+                $async$self._async_evaluate$_inUnknownAtRule = true;
+              $async$goto = 8;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(U.ModifiableCssAtRule$($name, node.span, false, value), new E._EvaluateVisitor_visitAtRule_closure1($async$self, node), node.hasDeclarations, new E._EvaluateVisitor_visitAtRule_closure2(), type$.legacy_ModifiableCssAtRule, type$.Null), $async$visitAtRule$1);
+            case 8:
+              // returning from await.
+              $async$self._async_evaluate$_inUnknownAtRule = wasInUnknownAtRule;
+              $async$self._async_evaluate$_inKeyframes = wasInKeyframes;
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitAtRule$1, $async$completer);
+    },
+    visitForRule$1: function(node) {
+      return this.visitForRule$body$_EvaluateVisitor(node);
+    },
+    visitForRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, t3, fromNumber, t4, toNumber, from, to, direction;
+      var $async$visitForRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              t2 = node.from;
+              t3 = type$.legacy_SassNumber;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._addExceptionSpanAsync$1$2(t2, new E._EvaluateVisitor_visitForRule_closure4($async$self, node), t3), $async$visitForRule$1);
+            case 3:
+              // returning from await.
+              fromNumber = $async$result;
+              t4 = node.to;
+              $async$goto = 4;
+              return P._asyncAwait($async$self._addExceptionSpanAsync$1$2(t4, new E._EvaluateVisitor_visitForRule_closure5($async$self, node), t3), $async$visitForRule$1);
+            case 4:
+              // returning from await.
+              toNumber = $async$result;
+              from = $async$self._async_evaluate$_addExceptionSpan$2(t2, new E._EvaluateVisitor_visitForRule_closure6(fromNumber));
+              to = t1.to = $async$self._async_evaluate$_addExceptionSpan$2(t4, new E._EvaluateVisitor_visitForRule_closure7(toNumber, fromNumber));
+              direction = from > to ? -1 : 1;
+              if (from === (!node.isExclusive ? t1.to = to + direction : to)) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$returnValue = $async$self._async_evaluate$_environment.scope$1$2$semiGlobal(new E._EvaluateVisitor_visitForRule_closure8(t1, $async$self, node, from, direction, fromNumber), true, type$.legacy_Value);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitForRule$1, $async$completer);
+    },
+    visitForwardRule$1: function(node) {
+      return this.visitForwardRule$body$_EvaluateVisitor(node);
+    },
+    visitForwardRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, newConfiguration, t4, _i, variable, oldConfiguration, adjustedConfiguration, t1, t2, t3;
+      var $async$visitForwardRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldConfiguration = $async$self._async_evaluate$_configuration;
+              adjustedConfiguration = oldConfiguration.throughForward$1(node);
+              t1 = node.configuration;
+              t2 = t1.length;
+              t3 = node.url;
+              $async$goto = t2 !== 0 ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate$_addForwardConfiguration$2(adjustedConfiguration, node), $async$visitForwardRule$1);
+            case 6:
+              // returning from await.
+              newConfiguration = $async$result;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate$_loadModule$5$configuration(t3, "@forward", node, new E._EvaluateVisitor_visitForwardRule_closure1($async$self, node), newConfiguration), $async$visitForwardRule$1);
+            case 7:
+              // returning from await.
+              t3 = type$.legacy_String;
+              t4 = P.LinkedHashSet_LinkedHashSet(t3);
+              for (_i = 0; _i < t2; ++_i) {
+                variable = t1[_i];
+                if (!variable.isGuarded)
+                  t4.add$1(0, variable.name);
+              }
+              $async$self._async_evaluate$_removeUsedConfiguration$3$except(adjustedConfiguration, newConfiguration, t4);
+              t3 = P.LinkedHashSet_LinkedHashSet(t3);
+              for (_i = 0; _i < t2; ++_i)
+                t3.add$1(0, t1[_i].name);
+              $async$self._async_evaluate$_assertConfigurationIsEmpty$2$only(newConfiguration, t3);
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$self._async_evaluate$_configuration = adjustedConfiguration;
+              $async$goto = 8;
+              return P._asyncAwait($async$self._async_evaluate$_loadModule$4(t3, "@forward", node, new E._EvaluateVisitor_visitForwardRule_closure2($async$self, node)), $async$visitForwardRule$1);
+            case 8:
+              // returning from await.
+              $async$self._async_evaluate$_configuration = oldConfiguration;
+            case 4:
+              // join
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitForwardRule$1, $async$completer);
+    },
+    _async_evaluate$_addForwardConfiguration$2: function(configuration, node) {
+      return this._addForwardConfiguration$body$_EvaluateVisitor(configuration, node);
+    },
+    _addForwardConfiguration$body$_EvaluateVisitor: function(configuration, node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Configuration),
+        $async$returnValue, $async$self = this, t2, t3, _i, variable, t4, t5, t1, newValues, $async$temp1, $async$temp2, $async$temp3;
+      var $async$_async_evaluate$_addForwardConfiguration$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = configuration._values;
+              newValues = P.LinkedHashMap_LinkedHashMap$of(new P.UnmodifiableMapView(t1, type$.UnmodifiableMapView_of_legacy_String_and_legacy_ConfiguredValue), type$.legacy_String, type$.legacy_ConfiguredValue);
+              t2 = node.configuration, t3 = t2.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              variable = t2[_i];
+              if (variable.isGuarded) {
+                t4 = variable.name;
+                t5 = t1.get$isEmpty(t1) ? null : t1.remove$1(0, t4);
+                if (t5 != null && !J.$eq$(t5.value, C.C_SassNull0)) {
+                  newValues.$indexSet(0, t4, t5);
+                  // goto for update
+                  $async$goto = 4;
+                  break;
+                }
+              }
+              t4 = variable.name;
+              t5 = variable.expression;
+              $async$temp1 = newValues;
+              $async$temp2 = t4;
+              $async$temp3 = Z;
+              $async$goto = 6;
+              return P._asyncAwait(t5.accept$1($async$self), $async$_async_evaluate$_addForwardConfiguration$2);
+            case 6:
+              // returning from await.
+              $async$temp1.$indexSet(0, $async$temp2, new $async$temp3.ConfiguredValue($async$result.withoutSlash$0(), variable.span, $async$self._async_evaluate$_expressionNode$1(t5)));
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = new A.Configuration(newValues, node, false);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_addForwardConfiguration$2, $async$completer);
+    },
+    _async_evaluate$_removeUsedConfiguration$3$except: function(upstream, downstream, except) {
+      var t1, t2, t3, _i, $name;
+      for (t1 = upstream._values, t2 = J.toList$0$ax(t1.get$keys(t1)), t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i) {
+        $name = t2[_i];
+        if (except.contains$1(0, $name))
+          continue;
+        if (!downstream._values.containsKey$1($name))
+          if (!t1.get$isEmpty(t1))
+            t1.remove$1(0, $name);
+      }
+    },
+    _async_evaluate$_assertConfigurationIsEmpty$3$nameInError$only: function(configuration, nameInError, only) {
+      configuration._values.forEach$1(0, new E._EvaluateVisitor__assertConfigurationIsEmpty_closure0(this, only, nameInError));
+    },
+    _async_evaluate$_assertConfigurationIsEmpty$1: function(configuration) {
+      return this._async_evaluate$_assertConfigurationIsEmpty$3$nameInError$only(configuration, false, null);
+    },
+    _async_evaluate$_assertConfigurationIsEmpty$2$only: function(configuration, only) {
+      return this._async_evaluate$_assertConfigurationIsEmpty$3$nameInError$only(configuration, false, only);
+    },
+    _async_evaluate$_assertConfigurationIsEmpty$2$nameInError: function(configuration, nameInError) {
+      return this._async_evaluate$_assertConfigurationIsEmpty$3$nameInError$only(configuration, nameInError, null);
+    },
+    visitFunctionRule$1: function(node) {
+      return this.visitFunctionRule$body$_EvaluateVisitor(node);
+    },
+    visitFunctionRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, t3, index, t4;
+      var $async$visitFunctionRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate$_environment;
+              t2 = t1.closure$0();
+              t3 = t1._async_environment$_functions;
+              index = t3.length - 1;
+              t4 = node.name;
+              t1._async_environment$_functionIndices.$indexSet(0, t4, index);
+              J.$indexSet$ax(t3[index], t4, new E.UserDefinedCallable(node, t2, type$.UserDefinedCallable_legacy_AsyncEnvironment));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitFunctionRule$1, $async$completer);
+    },
+    visitIfRule$1: function(node) {
+      return this.visitIfRule$body$_EvaluateVisitor(node);
+    },
+    visitIfRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, _i, clauseToCheck, _box_0;
+      var $async$visitIfRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              _box_0 = {};
+              _box_0.clause = node.lastClause;
+              t1 = node.clauses, t2 = t1.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              clauseToCheck = t1[_i];
+              $async$goto = 6;
+              return P._asyncAwait(clauseToCheck.expression.accept$1($async$self), $async$visitIfRule$1);
+            case 6:
+              // returning from await.
+              if ($async$result.get$isTruthy()) {
+                _box_0.clause = clauseToCheck;
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              t1 = _box_0.clause;
+              if (t1 == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate$_environment.scope$1$3$semiGlobal$when(new E._EvaluateVisitor_visitIfRule_closure0(_box_0, $async$self), true, t1.hasDeclarations, type$.legacy_Value), $async$visitIfRule$1);
+            case 7:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitIfRule$1, $async$completer);
+    },
+    visitImportRule$1: function(node) {
+      return this.visitImportRule$body$_EvaluateVisitor(node);
+    },
+    visitImportRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, t3, _i, $import;
+      var $async$visitImportRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.imports, t2 = t1.length, t3 = type$.legacy_StaticImport, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $import = t1[_i];
+              $async$goto = $import instanceof B.DynamicImport ? 6 : 8;
+              break;
+            case 6:
+              // then
+              $async$goto = 9;
+              return P._asyncAwait($async$self._async_evaluate$_visitDynamicImport$1($import), $async$visitImportRule$1);
+            case 9:
+              // returning from await.
+              // goto join
+              $async$goto = 7;
+              break;
+            case 8:
+              // else
+              $async$goto = 10;
+              return P._asyncAwait($async$self._visitStaticImport$1(t3._as($import)), $async$visitImportRule$1);
+            case 10:
+              // returning from await.
+            case 7:
+              // join
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitImportRule$1, $async$completer);
+    },
+    _async_evaluate$_visitDynamicImport$1: function($import) {
+      return this._async_evaluate$_withStackFrame$1$3("@import", $import, new E._EvaluateVisitor__visitDynamicImport_closure0(this, $import), type$.void);
+    },
+    _async_evaluate$_loadStylesheet$4$baseUrl$forImport: function(url, span, baseUrl, forImport) {
+      return this._loadStylesheet$body$_EvaluateVisitor(url, span, baseUrl, forImport);
+    },
+    _async_evaluate$_loadStylesheet$3$baseUrl: function(url, span, baseUrl) {
+      return this._async_evaluate$_loadStylesheet$4$baseUrl$forImport(url, span, baseUrl, false);
+    },
+    _async_evaluate$_loadStylesheet$3$forImport: function(url, span, forImport) {
+      return this._async_evaluate$_loadStylesheet$4$baseUrl$forImport(url, span, null, forImport);
+    },
+    _loadStylesheet$body$_EvaluateVisitor: function(url, span, baseUrl, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, tuple, error, error0, message, t1, t2, t3, exception, message0, $async$exception;
+      var $async$_async_evaluate$_loadStylesheet$4$baseUrl$forImport = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$handler = 4;
+              $async$self._async_evaluate$_importSpan = span;
+              t1 = P.Uri_parse(url);
+              t2 = $async$self._async_evaluate$_importer;
+              if (baseUrl == null) {
+                t3 = $async$self._async_evaluate$_stylesheet;
+                t3 = t3 == null ? null : t3.span;
+                t3 = t3 == null ? null : t3.file.url;
+              } else
+                t3 = baseUrl;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate$_importCache.import$4$baseImporter$baseUrl$forImport(t1, t2, t3, forImport), $async$_async_evaluate$_loadStylesheet$4$baseUrl$forImport);
+            case 7:
+              // returning from await.
+              tuple = $async$result;
+              if (tuple != null) {
+                $async$returnValue = tuple;
+                $async$next = [1];
+                // goto finally
+                $async$goto = 5;
+                break;
+              }
+              if (C.JSString_methods.startsWith$1(url, "package:") && true)
+                throw H.wrapException(string$.x22packa);
+              else
+                throw H.wrapException("Can't find stylesheet to import.");
+              $async$next.push(6);
+              // goto finally
+              $async$goto = 5;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (t1 instanceof E.SassException) {
+                error = t1;
+                t1 = $async$self._async_evaluate$_exception$2(error._span_exception$_message, error.get$span());
+                throw H.wrapException(t1);
+              } else {
+                error0 = t1;
+                message = null;
+                try {
+                  message = H._asStringS(J.get$message$x(error0));
+                } catch (exception) {
+                  H.unwrapException($async$exception);
+                  message0 = J.toString$0$(error0);
+                  message = message0;
+                }
+                t1 = $async$self._async_evaluate$_exception$1(message);
+                throw H.wrapException(t1);
+              }
+              $async$next.push(6);
+              // goto finally
+              $async$goto = 5;
+              break;
+            case 3:
+              // uncaught
+              $async$next = [2];
+            case 5:
+              // finally
+              $async$handler = 2;
+              $async$self._async_evaluate$_importSpan = null;
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 6:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_loadStylesheet$4$baseUrl$forImport, $async$completer);
+    },
+    _visitStaticImport$1: function($import) {
+      return this._visitStaticImport$body$_EvaluateVisitor($import);
+    },
+    _visitStaticImport$body$_EvaluateVisitor: function($import) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$self = this, resolvedSupports, t1, mediaQuery, node, t2, url, supports, $async$temp1, $async$temp2;
+      var $async$_visitStaticImport$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_interpolationToValue$1($import.url), $async$_visitStaticImport$1);
+            case 3:
+              // returning from await.
+              url = $async$result;
+              supports = $import.supports;
+              $async$goto = supports instanceof L.SupportsDeclaration ? 4 : 6;
+              break;
+            case 4:
+              // then
+              $async$temp1 = H;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._evaluateToCss$1(supports.name), $async$_visitStaticImport$1);
+            case 7:
+              // returning from await.
+              $async$temp1 = $async$temp1.S($async$result) + ": ";
+              $async$temp2 = H;
+              $async$goto = 8;
+              return P._asyncAwait($async$self._evaluateToCss$1(supports.value), $async$_visitStaticImport$1);
+            case 8:
+              // returning from await.
+              resolvedSupports = $async$temp1 + $async$temp2.S($async$result);
+              // goto join
+              $async$goto = 5;
+              break;
+            case 6:
+              // else
+              $async$goto = supports == null ? 9 : 11;
+              break;
+            case 9:
+              // then
+              $async$result = null;
+              // goto join
+              $async$goto = 10;
+              break;
+            case 11:
+              // else
+              $async$goto = 12;
+              return P._asyncAwait($async$self._async_evaluate$_visitSupportsCondition$1(supports), $async$_visitStaticImport$1);
+            case 12:
+              // returning from await.
+            case 10:
+              // join
+              resolvedSupports = $async$result;
+            case 5:
+              // join
+              t1 = $import.media;
+              $async$goto = t1 == null ? 13 : 15;
+              break;
+            case 13:
+              // then
+              $async$result = null;
+              // goto join
+              $async$goto = 14;
+              break;
+            case 15:
+              // else
+              $async$goto = 16;
+              return P._asyncAwait($async$self._async_evaluate$_visitMediaQueries$1(t1), $async$_visitStaticImport$1);
+            case 16:
+              // returning from await.
+            case 14:
+              // join
+              mediaQuery = $async$result;
+              t1 = $import.span;
+              node = F.ModifiableCssImport$(url, t1, mediaQuery, resolvedSupports == null ? null : new F.CssValue("supports(" + resolvedSupports + ")", supports.get$span(), type$.CssValue_legacy_String));
+              t1 = $async$self._async_evaluate$_parent;
+              t2 = $async$self._async_evaluate$_root;
+              if (t1 != t2)
+                t1.addChild$1(node);
+              else if ($async$self._async_evaluate$_endOfImports === J.get$length$asx(t2.children._collection$_source)) {
+                $async$self._async_evaluate$_root.addChild$1(node);
+                $async$self._async_evaluate$_endOfImports = $async$self._async_evaluate$_endOfImports + 1;
+              } else {
+                t1 = $async$self._async_evaluate$_outOfOrderImports;
+                (t1 == null ? $async$self._async_evaluate$_outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport) : t1).push(node);
+              }
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_visitStaticImport$1, $async$completer);
+    },
+    visitIncludeRule$1: function(node) {
+      return this.visitIncludeRule$body$_EvaluateVisitor(node);
+    },
+    visitIncludeRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, nodeWithSpan, t1, t2, contentCallable, mixin;
+      var $async$visitIncludeRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              mixin = $async$self._async_evaluate$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitIncludeRule_closure2($async$self, node));
+              if (mixin == null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2("Undefined mixin.", node.span));
+              nodeWithSpan = new B._FakeAstNode(new E._EvaluateVisitor_visitIncludeRule_closure3(node));
+              $async$goto = type$.legacy_AsyncBuiltInCallable._is(mixin) ? 3 : 5;
+              break;
+            case 3:
+              // then
+              if (node.content != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2("Mixin doesn't accept a content block.", node.span));
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate$_runBuiltInCallable$3(node.$arguments, mixin, nodeWithSpan), $async$visitIncludeRule$1);
+            case 6:
+              // returning from await.
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = type$.legacy_UserDefinedCallable_legacy_AsyncEnvironment._is(mixin) ? 7 : 9;
+              break;
+            case 7:
+              // then
+              t1 = node.content;
+              t2 = t1 == null;
+              if (!t2 && !type$.legacy_MixinRule._as(mixin.declaration).hasContent)
+                throw H.wrapException(E.MultiSpanSassRuntimeException$("Mixin doesn't accept a content block.", node.get$spanWithoutContent(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([mixin.declaration.$arguments.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), $async$self._async_evaluate$_stackTrace$1(node.get$spanWithoutContent())));
+              contentCallable = t2 ? null : new E.UserDefinedCallable(t1, $async$self._async_evaluate$_environment.closure$0(), type$.UserDefinedCallable_legacy_AsyncEnvironment);
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate$_runUserDefinedCallable$4(node.$arguments, mixin, nodeWithSpan, new E._EvaluateVisitor_visitIncludeRule_closure4($async$self, contentCallable, mixin, nodeWithSpan)), $async$visitIncludeRule$1);
+            case 10:
+              // returning from await.
+              // goto join
+              $async$goto = 8;
+              break;
+            case 9:
+              // else
+              throw H.wrapException(P.UnsupportedError$("Unknown callable type " + mixin.toString$0(0) + "."));
+            case 8:
+              // join
+            case 4:
+              // join
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitIncludeRule$1, $async$completer);
+    },
+    visitMixinRule$1: function(node) {
+      return this.visitMixinRule$body$_EvaluateVisitor(node);
+    },
+    visitMixinRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, t3, index, t4;
+      var $async$visitMixinRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate$_environment;
+              t2 = t1.closure$0();
+              t3 = t1._async_environment$_mixins;
+              index = t3.length - 1;
+              t4 = node.name;
+              t1._async_environment$_mixinIndices.$indexSet(0, t4, index);
+              J.$indexSet$ax(t3[index], t4, new E.UserDefinedCallable(node, t2, type$.UserDefinedCallable_legacy_AsyncEnvironment));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitMixinRule$1, $async$completer);
+    },
+    visitLoudComment$1: function(node) {
+      return this.visitLoudComment$body$_EvaluateVisitor(node);
+    },
+    visitLoudComment$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, $async$temp1, $async$temp2;
+      var $async$visitLoudComment$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate$_inFunction) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = $async$self._async_evaluate$_parent;
+              t2 = $async$self._async_evaluate$_root;
+              if (t1 == t2 && $async$self._async_evaluate$_endOfImports === J.get$length$asx(t2.children._collection$_source))
+                $async$self._async_evaluate$_endOfImports = $async$self._async_evaluate$_endOfImports + 1;
+              t1 = node.text;
+              $async$temp1 = $async$self._async_evaluate$_parent;
+              $async$temp2 = R;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_performInterpolation$1(t1), $async$visitLoudComment$1);
+            case 3:
+              // returning from await.
+              $async$temp1.addChild$1(new $async$temp2.ModifiableCssComment($async$result, t1.span));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitLoudComment$1, $async$completer);
+    },
+    visitMediaRule$1: function(node) {
+      return this.visitMediaRule$body$_EvaluateVisitor(node);
+    },
+    visitMediaRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, queries, t1, mergedQueries;
+      var $async$visitMediaRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Media_, node.span));
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_visitMediaQueries$1(node.query), $async$visitMediaRule$1);
+            case 3:
+              // returning from await.
+              queries = $async$result;
+              t1 = $async$self._async_evaluate$_mediaQueries;
+              mergedQueries = t1 == null ? null : $async$self._async_evaluate$_mergeMediaQueries$2(t1, queries);
+              t1 = mergedQueries == null;
+              if (!t1 && mergedQueries.length === 0) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = t1 ? queries : mergedQueries;
+              $async$goto = 4;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(G.ModifiableCssMediaRule$(t1, node.span), new E._EvaluateVisitor_visitMediaRule_closure1($async$self, mergedQueries, queries, node), node.hasDeclarations, new E._EvaluateVisitor_visitMediaRule_closure2(mergedQueries), type$.legacy_ModifiableCssMediaRule, type$.Null), $async$visitMediaRule$1);
+            case 4:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitMediaRule$1, $async$completer);
+    },
+    _async_evaluate$_visitMediaQueries$1: function(interpolation) {
+      return this._visitMediaQueries$body$_EvaluateVisitor(interpolation);
+    },
+    _visitMediaQueries$body$_EvaluateVisitor: function(interpolation) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_List_legacy_CssMediaQuery),
+        $async$returnValue, $async$self = this, $async$temp1, $async$temp2;
+      var $async$_async_evaluate$_visitMediaQueries$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = interpolation;
+              $async$temp2 = E;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_performInterpolation$2$warnForColor(interpolation, true), $async$_async_evaluate$_visitMediaQueries$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$self._async_evaluate$_adjustParseError$2($async$temp1, new $async$temp2._EvaluateVisitor__visitMediaQueries_closure0($async$self, $async$result));
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_visitMediaQueries$1, $async$completer);
+    },
+    _async_evaluate$_mergeMediaQueries$2: function(queries1, queries2) {
+      var t1, t2, t3, t4, t5, result,
+        queries = H.setRuntimeTypeInfo([], type$.JSArray_legacy_CssMediaQuery);
+      for (t1 = J.get$iterator$ax(queries1), t2 = J.getInterceptor$ax(queries2), t3 = type$.legacy_MediaQuerySuccessfulMergeResult; t1.moveNext$0();) {
+        t4 = t1.get$current(t1);
+        for (t5 = t2.get$iterator(queries2); t5.moveNext$0();) {
+          result = t4.merge$1(t5.get$current(t5));
+          if (result === C._SingletonCssMediaQueryMergeResult_empty)
+            continue;
+          if (result === C._SingletonCssMediaQueryMergeResult_unrepresentable)
+            return null;
+          queries.push(t3._as(result).query);
+        }
+      }
+      return queries;
+    },
+    visitReturnRule$1: function(node) {
+      return node.expression.accept$1(this);
+    },
+    visitSilentComment$1: function(node) {
+      return this.visitSilentComment$body$_EvaluateVisitor(node);
+    },
+    visitSilentComment$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue;
+      var $async$visitSilentComment$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitSilentComment$1, $async$completer);
+    },
+    visitStyleRule$1: function(node) {
+      return this.visitStyleRule$body$_EvaluateVisitor(node);
+    },
+    visitStyleRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t2, selectorText, parsedSelector, rule, oldAtRootExcludingStyleRule, t1;
+      var $async$visitStyleRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              if ($async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Style_, node.span));
+              t2 = node.selector;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_interpolationToValue$3$trim$warnForColor(t2, true, true), $async$visitStyleRule$1);
+            case 3:
+              // returning from await.
+              selectorText = $async$result;
+              $async$goto = $async$self._async_evaluate$_inKeyframes ? 4 : 5;
+              break;
+            case 4:
+              // then
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(U.ModifiableCssKeyframeBlock$(new F.CssValue(P.List_List$unmodifiable($async$self._async_evaluate$_adjustParseError$2(t2, new E._EvaluateVisitor_visitStyleRule_closure6($async$self, selectorText)), type$.legacy_String), t2.span, type$.CssValue_legacy_List_legacy_String), node.span), new E._EvaluateVisitor_visitStyleRule_closure7($async$self, node), node.hasDeclarations, new E._EvaluateVisitor_visitStyleRule_closure8(), type$.legacy_ModifiableCssKeyframeBlock, type$.Null), $async$visitStyleRule$1);
+            case 6:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 5:
+              // join
+              t1.parsedSelector = $async$self._async_evaluate$_adjustParseError$2(t2, new E._EvaluateVisitor_visitStyleRule_closure9($async$self, selectorText));
+              parsedSelector = $async$self._async_evaluate$_addExceptionSpan$2(t2, new E._EvaluateVisitor_visitStyleRule_closure10(t1, $async$self));
+              t1.parsedSelector = parsedSelector;
+              rule = X.ModifiableCssStyleRule$($async$self._async_evaluate$_extender.addSelector$3(parsedSelector, t2.span, $async$self._async_evaluate$_mediaQueries), node.span, t1.parsedSelector);
+              oldAtRootExcludingStyleRule = $async$self._async_evaluate$_atRootExcludingStyleRule;
+              $async$self._async_evaluate$_atRootExcludingStyleRule = false;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(rule, new E._EvaluateVisitor_visitStyleRule_closure11($async$self, rule, node), node.hasDeclarations, new E._EvaluateVisitor_visitStyleRule_closure12(), type$.legacy_ModifiableCssStyleRule, type$.Null), $async$visitStyleRule$1);
+            case 7:
+              // returning from await.
+              $async$self._async_evaluate$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+              if (!($async$self._async_evaluate$_styleRule != null && !oldAtRootExcludingStyleRule)) {
+                t1 = $async$self._async_evaluate$_parent.children;
+                t1 = !t1.get$isEmpty(t1);
+              } else
+                t1 = false;
+              if (t1) {
+                t1 = $async$self._async_evaluate$_parent.children;
+                t1.get$last(t1).isGroupEnd = true;
+              }
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitStyleRule$1, $async$completer);
+    },
+    visitSupportsRule$1: function(node) {
+      return this.visitSupportsRule$body$_EvaluateVisitor(node);
+    },
+    visitSupportsRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, $async$temp1, $async$temp2;
+      var $async$visitSupportsRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Suppor, node.span));
+              t1 = node.condition;
+              $async$temp1 = B;
+              $async$temp2 = F;
+              $async$goto = 4;
+              return P._asyncAwait($async$self._async_evaluate$_visitSupportsCondition$1(t1), $async$visitSupportsRule$1);
+            case 4:
+              // returning from await.
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through($async$temp1.ModifiableCssSupportsRule$(new $async$temp2.CssValue($async$result, t1.get$span(), type$.CssValue_legacy_String), node.span), new E._EvaluateVisitor_visitSupportsRule_closure1($async$self, node), node.hasDeclarations, new E._EvaluateVisitor_visitSupportsRule_closure2(), type$.legacy_ModifiableCssSupportsRule, type$.Null), $async$visitSupportsRule$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitSupportsRule$1, $async$completer);
+    },
+    _async_evaluate$_visitSupportsCondition$1: function(condition) {
+      return this._visitSupportsCondition$body$_EvaluateVisitor(condition);
+    },
+    _visitSupportsCondition$body$_EvaluateVisitor: function(condition) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, t1, $async$temp1, $async$temp2;
+      var $async$_async_evaluate$_visitSupportsCondition$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = condition instanceof U.SupportsOperation ? 3 : 5;
+              break;
+            case 3:
+              // then
+              t1 = condition.operator;
+              $async$temp1 = H;
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate$_parenthesize$2(condition.left, t1), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 6:
+              // returning from await.
+              $async$temp1 = $async$temp1.S($async$result) + " " + t1 + " ";
+              $async$temp2 = H;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate$_parenthesize$2(condition.right, t1), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 7:
+              // returning from await.
+              $async$returnValue = $async$temp1 + $async$temp2.S($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = condition instanceof M.SupportsNegation ? 8 : 10;
+              break;
+            case 8:
+              // then
+              $async$temp1 = H;
+              $async$goto = 11;
+              return P._asyncAwait($async$self._async_evaluate$_parenthesize$1(condition.condition), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 11:
+              // returning from await.
+              $async$returnValue = "not " + $async$temp1.S($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 9;
+              break;
+            case 10:
+              // else
+              $async$goto = condition instanceof X.SupportsInterpolation ? 12 : 14;
+              break;
+            case 12:
+              // then
+              $async$goto = 15;
+              return P._asyncAwait($async$self._evaluateToCss$2$quote(condition.expression, false), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 15:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 13;
+              break;
+            case 14:
+              // else
+              $async$goto = condition instanceof L.SupportsDeclaration ? 16 : 18;
+              break;
+            case 16:
+              // then
+              $async$temp1 = H;
+              $async$goto = 19;
+              return P._asyncAwait($async$self._evaluateToCss$1(condition.name), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 19:
+              // returning from await.
+              $async$temp1 = "(" + $async$temp1.S($async$result) + ": ";
+              $async$temp2 = H;
+              $async$goto = 20;
+              return P._asyncAwait($async$self._evaluateToCss$1(condition.value), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 20:
+              // returning from await.
+              $async$returnValue = $async$temp1 + $async$temp2.S($async$result) + ")";
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 17;
+              break;
+            case 18:
+              // else
+              $async$goto = condition instanceof F.SupportsFunction ? 21 : 23;
+              break;
+            case 21:
+              // then
+              $async$temp1 = H;
+              $async$goto = 24;
+              return P._asyncAwait($async$self._async_evaluate$_performInterpolation$1(condition.name), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 24:
+              // returning from await.
+              $async$temp1 = $async$temp1.S($async$result) + "(";
+              $async$temp2 = H;
+              $async$goto = 25;
+              return P._asyncAwait($async$self._async_evaluate$_performInterpolation$1(condition.$arguments), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 25:
+              // returning from await.
+              $async$returnValue = $async$temp1 + $async$temp2.S($async$result) + ")";
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 22;
+              break;
+            case 23:
+              // else
+              $async$goto = condition instanceof Y.SupportsAnything ? 26 : 28;
+              break;
+            case 26:
+              // then
+              $async$temp1 = H;
+              $async$goto = 29;
+              return P._asyncAwait($async$self._async_evaluate$_performInterpolation$1(condition.contents), $async$_async_evaluate$_visitSupportsCondition$1);
+            case 29:
+              // returning from await.
+              $async$returnValue = "(" + $async$temp1.S($async$result) + ")";
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 27;
+              break;
+            case 28:
+              // else
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 27:
+              // join
+            case 22:
+              // join
+            case 17:
+              // join
+            case 13:
+              // join
+            case 9:
+              // join
+            case 4:
+              // join
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_visitSupportsCondition$1, $async$completer);
+    },
+    _async_evaluate$_parenthesize$2: function(condition, operator) {
+      return this._parenthesize$body$_EvaluateVisitor(condition, operator);
+    },
+    _async_evaluate$_parenthesize$1: function(condition) {
+      return this._async_evaluate$_parenthesize$2(condition, null);
+    },
+    _parenthesize$body$_EvaluateVisitor: function(condition, operator) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, t1, $async$temp1;
+      var $async$_async_evaluate$_parenthesize$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (!(condition instanceof M.SupportsNegation))
+                if (condition instanceof U.SupportsOperation)
+                  t1 = operator == null || operator !== condition.operator;
+                else
+                  t1 = false;
+              else
+                t1 = true;
+              $async$goto = t1 ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$temp1 = H;
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate$_visitSupportsCondition$1(condition), $async$_async_evaluate$_parenthesize$2);
+            case 6:
+              // returning from await.
+              $async$returnValue = "(" + $async$temp1.S($async$result) + ")";
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate$_visitSupportsCondition$1(condition), $async$_async_evaluate$_parenthesize$2);
+            case 7:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 4:
+              // join
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_parenthesize$2, $async$completer);
+    },
+    visitVariableDeclaration$1: function(node) {
+      return this.visitVariableDeclaration$body$_EvaluateVisitor(node);
+    },
+    visitVariableDeclaration$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, value, t2, $async$temp1, $async$temp2, $async$temp3;
+      var $async$visitVariableDeclaration$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (node.isGuarded) {
+                if (node.namespace == null && $async$self._async_evaluate$_environment._async_environment$_variables.length === 1) {
+                  t1 = $async$self._async_evaluate$_configuration._values;
+                  t1 = t1.get$isEmpty(t1) ? null : t1.remove$1(0, node.name);
+                  if (t1 != null) {
+                    $async$self._async_evaluate$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitVariableDeclaration_closure2($async$self, node, t1));
+                    $async$returnValue = null;
+                    // goto return
+                    $async$goto = 1;
+                    break;
+                  }
+                }
+                value = $async$self._async_evaluate$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitVariableDeclaration_closure3($async$self, node));
+                if (value != null && !value.$eq(0, C.C_SassNull0)) {
+                  $async$returnValue = null;
+                  // goto return
+                  $async$goto = 1;
+                  break;
+                }
+              }
+              if (node.isGlobal && !$async$self._async_evaluate$_environment.globalVariableExists$1(node.name)) {
+                t1 = $async$self._async_evaluate$_environment._async_environment$_variables.length === 1 ? string$.As_of_S : string$.As_of_C + B.declarationName(node.span) + ": null` at the root of the\nstylesheet.";
+                t2 = node.span;
+                $async$self._async_evaluate$_logger.warn$4$deprecation$span$trace(0, t1, true, t2, $async$self._async_evaluate$_stackTrace$1(t2));
+              }
+              $async$temp1 = node;
+              $async$temp2 = E;
+              $async$temp3 = node;
+              $async$goto = 3;
+              return P._asyncAwait(node.expression.accept$1($async$self), $async$visitVariableDeclaration$1);
+            case 3:
+              // returning from await.
+              $async$self._async_evaluate$_addExceptionSpan$2($async$temp1, new $async$temp2._EvaluateVisitor_visitVariableDeclaration_closure4($async$self, $async$temp3, $async$result.withoutSlash$0()));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitVariableDeclaration$1, $async$completer);
+    },
+    visitUseRule$1: function(node) {
+      return this.visitUseRule$body$_EvaluateVisitor(node);
+    },
+    visitUseRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, configuration, t3, _i, variable, t4, t5, t1, t2, $async$temp1, $async$temp2, $async$temp3;
+      var $async$visitUseRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.configuration;
+              t2 = t1.length;
+              $async$goto = t2 === 0 ? 3 : 5;
+              break;
+            case 3:
+              // then
+              configuration = C.Configuration_Map_empty_null_true;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_ConfiguredValue);
+              _i = 0;
+            case 6:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 8;
+                break;
+              }
+              variable = t1[_i];
+              t4 = variable.name;
+              t5 = variable.expression;
+              $async$temp1 = t3;
+              $async$temp2 = t4;
+              $async$temp3 = Z;
+              $async$goto = 9;
+              return P._asyncAwait(t5.accept$1($async$self), $async$visitUseRule$1);
+            case 9:
+              // returning from await.
+              $async$temp1.$indexSet(0, $async$temp2, new $async$temp3.ConfiguredValue($async$result.withoutSlash$0(), variable.span, $async$self._async_evaluate$_expressionNode$1(t5)));
+            case 7:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 6;
+              break;
+            case 8:
+              // after for
+              configuration = new A.Configuration(t3, node, false);
+            case 4:
+              // join
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate$_loadModule$5$configuration(node.url, "@use", node, new E._EvaluateVisitor_visitUseRule_closure0($async$self, node), configuration), $async$visitUseRule$1);
+            case 10:
+              // returning from await.
+              $async$self._async_evaluate$_assertConfigurationIsEmpty$1(configuration);
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitUseRule$1, $async$completer);
+    },
+    visitWarnRule$1: function(node) {
+      return this.visitWarnRule$body$_EvaluateVisitor(node);
+    },
+    visitWarnRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, value, t1;
+      var $async$visitWarnRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._addExceptionSpanAsync$1$2(node, new E._EvaluateVisitor_visitWarnRule_closure0($async$self, node), type$.legacy_Value), $async$visitWarnRule$1);
+            case 3:
+              // returning from await.
+              value = $async$result;
+              t1 = value instanceof D.SassString ? value.text : $async$self._async_evaluate$_serialize$2(value, node.expression);
+              $async$self._async_evaluate$_logger.warn$2$trace(0, t1, $async$self._async_evaluate$_stackTrace$1(node.span));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitWarnRule$1, $async$completer);
+    },
+    visitWhileRule$1: function(node) {
+      return this._async_evaluate$_environment.scope$1$3$semiGlobal$when(new E._EvaluateVisitor_visitWhileRule_closure0(this, node), true, node.hasDeclarations, type$.legacy_Value);
+    },
+    visitBinaryOperationExpression$1: function(node) {
+      return this._addExceptionSpanAsync$1$2(node, new E._EvaluateVisitor_visitBinaryOperationExpression_closure0(this, node), type$.legacy_Value);
+    },
+    visitValueExpression$1: function(node) {
+      return this.visitValueExpression$body$_EvaluateVisitor(node);
+    },
+    visitValueExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue;
+      var $async$visitValueExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = node.value;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitValueExpression$1, $async$completer);
+    },
+    visitVariableExpression$1: function(node) {
+      return this.visitVariableExpression$body$_EvaluateVisitor(node);
+    },
+    visitVariableExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, result;
+      var $async$visitVariableExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              result = $async$self._async_evaluate$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitVariableExpression_closure0($async$self, node));
+              if (result != null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              throw H.wrapException($async$self._async_evaluate$_exception$2("Undefined variable.", node.span));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitVariableExpression$1, $async$completer);
+    },
+    visitUnaryOperationExpression$1: function(node) {
+      return this.visitUnaryOperationExpression$body$_EvaluateVisitor(node);
+    },
+    visitUnaryOperationExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, operand, t1;
+      var $async$visitUnaryOperationExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          $async$outer:
+            switch ($async$goto) {
+              case 0:
+                // Function start
+                $async$goto = 3;
+                return P._asyncAwait(node.operand.accept$1($async$self), $async$visitUnaryOperationExpression$1);
+              case 3:
+                // returning from await.
+                operand = $async$result;
+                t1 = node.operator;
+                switch (t1) {
+                  case C.UnaryOperator_j2w:
+                    $async$returnValue = operand.unaryPlus$0();
+                    // goto return
+                    $async$goto = 1;
+                    break $async$outer;
+                  case C.UnaryOperator_U4G:
+                    $async$returnValue = operand.unaryMinus$0();
+                    // goto return
+                    $async$goto = 1;
+                    break $async$outer;
+                  case C.UnaryOperator_zDx:
+                    operand.toString;
+                    $async$returnValue = new D.SassString("/" + N.serializeValue0(operand, false, true), false);
+                    // goto return
+                    $async$goto = 1;
+                    break $async$outer;
+                  case C.UnaryOperator_not_not:
+                    $async$returnValue = operand.unaryNot$0();
+                    // goto return
+                    $async$goto = 1;
+                    break $async$outer;
+                  default:
+                    throw H.wrapException(P.StateError$("Unknown unary operator " + H.S(t1) + "."));
+                }
+              case 1:
+                // return
+                return P._asyncReturn($async$returnValue, $async$completer);
+            }
+      });
+      return P._asyncStartSync($async$visitUnaryOperationExpression$1, $async$completer);
+    },
+    visitBooleanExpression$1: function(node) {
+      return this.visitBooleanExpression$body$_EvaluateVisitor(node);
+    },
+    visitBooleanExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassBoolean),
+        $async$returnValue;
+      var $async$visitBooleanExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = node.value ? C.SassBoolean_true0 : C.SassBoolean_false0;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitBooleanExpression$1, $async$completer);
+    },
+    visitIfExpression$1: function(node) {
+      return this.visitIfExpression$body$_EvaluateVisitor(node);
+    },
+    visitIfExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, condition, ifTrue, ifFalse, pair, positional, named, t1;
+      var $async$visitIfExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_evaluateMacroArguments$1(node), $async$visitIfExpression$1);
+            case 3:
+              // returning from await.
+              pair = $async$result;
+              positional = pair.item1;
+              named = pair.item2;
+              t1 = J.getInterceptor$asx(positional);
+              $async$self._async_evaluate$_verifyArguments$4(t1.get$length(positional), named, $.$get$IfExpression_declaration(), node);
+              condition = t1.get$length(positional) > 0 ? t1.$index(positional, 0) : named.$index(0, "condition");
+              ifTrue = t1.get$length(positional) > 1 ? t1.$index(positional, 1) : named.$index(0, "if-true");
+              ifFalse = t1.get$length(positional) > 2 ? t1.$index(positional, 2) : named.$index(0, "if-false");
+              $async$goto = 5;
+              return P._asyncAwait(condition.accept$1($async$self), $async$visitIfExpression$1);
+            case 5:
+              // returning from await.
+              $async$goto = 4;
+              return P._asyncAwait(($async$result.get$isTruthy() ? ifTrue : ifFalse).accept$1($async$self), $async$visitIfExpression$1);
+            case 4:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitIfExpression$1, $async$completer);
+    },
+    visitNullExpression$1: function(node) {
+      return this.visitNullExpression$body$_EvaluateVisitor(node);
+    },
+    visitNullExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassNull),
+        $async$returnValue;
+      var $async$visitNullExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = C.C_SassNull0;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitNullExpression$1, $async$completer);
+    },
+    visitNumberExpression$1: function(node) {
+      return this.visitNumberExpression$body$_EvaluateVisitor(node);
+    },
+    visitNumberExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassNumber),
+        $async$returnValue, t1, t2;
+      var $async$visitNumberExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.value;
+              t2 = node.unit;
+              $async$returnValue = t2 == null ? new N.UnitlessSassNumber(t1, null) : new L.SingleUnitSassNumber(t2, t1, null);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitNumberExpression$1, $async$completer);
+    },
+    visitParenthesizedExpression$1: function(node) {
+      return node.expression.accept$1(this);
+    },
+    visitColorExpression$1: function(node) {
+      return this.visitColorExpression$body$_EvaluateVisitor(node);
+    },
+    visitColorExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassColor),
+        $async$returnValue;
+      var $async$visitColorExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = node.value;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitColorExpression$1, $async$completer);
+    },
+    visitListExpression$1: function(node) {
+      return this.visitListExpression$body$_EvaluateVisitor(node);
+    },
+    visitListExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassList),
+        $async$returnValue, $async$self = this, $async$temp1;
+      var $async$visitListExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = D;
+              $async$goto = 3;
+              return P._asyncAwait(B.mapAsync(node.contents, new E._EvaluateVisitor_visitListExpression_closure0($async$self), type$.legacy_Expression, type$.legacy_Value), $async$visitListExpression$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$temp1.SassList$($async$result, node.separator, node.hasBrackets);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitListExpression$1, $async$completer);
+    },
+    visitMapExpression$1: function(node) {
+      return this.visitMapExpression$body$_EvaluateVisitor(node);
+    },
+    visitMapExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassMap),
+        $async$returnValue, $async$self = this, t2, t3, _i, pair, t4, keyValue, valueValue, t1, map, keyNodes;
+      var $async$visitMapExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = type$.legacy_Value;
+              map = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+              keyNodes = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_AstNode);
+              t2 = node.pairs, t3 = t2.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              pair = t2[_i];
+              t4 = pair.item1;
+              $async$goto = 6;
+              return P._asyncAwait(t4.accept$1($async$self), $async$visitMapExpression$1);
+            case 6:
+              // returning from await.
+              keyValue = $async$result;
+              $async$goto = 7;
+              return P._asyncAwait(pair.item2.accept$1($async$self), $async$visitMapExpression$1);
+            case 7:
+              // returning from await.
+              valueValue = $async$result;
+              if (map.containsKey$1(keyValue))
+                throw H.wrapException(E.MultiSpanSassRuntimeException$("Duplicate key.", t4.get$span(), "second key", P.LinkedHashMap_LinkedHashMap$_literal([keyNodes.$index(0, keyValue).get$span(), "first key"], type$.legacy_FileSpan, type$.legacy_String), $async$self._async_evaluate$_stackTrace$1(t4.get$span())));
+              map.$indexSet(0, keyValue, valueValue);
+              keyNodes.$indexSet(0, keyValue, t4);
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = new A.SassMap(H.ConstantMap_ConstantMap$from(map, t1, t1));
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitMapExpression$1, $async$completer);
+    },
+    visitFunctionExpression$1: function(node) {
+      return this.visitFunctionExpression$body$_EvaluateVisitor(node);
+    },
+    visitFunctionExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, oldInFunction, result, t1, t2, plainName, $async$temp1, $async$temp2;
+      var $async$visitFunctionExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              t2 = node.name;
+              plainName = t2.get$asPlain();
+              t1.$function = null;
+              $async$goto = (plainName != null ? t1.$function = $async$self._async_evaluate$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitFunctionExpression_closure1($async$self, node, plainName)) : null) == null ? 3 : 4;
+              break;
+            case 3:
+              // then
+              if (node.namespace != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2("Undefined function.", node.span));
+              $async$temp1 = t1;
+              $async$temp2 = L;
+              $async$goto = 5;
+              return P._asyncAwait($async$self._async_evaluate$_performInterpolation$1(t2), $async$visitFunctionExpression$1);
+            case 5:
+              // returning from await.
+              $async$temp1.$function = new $async$temp2.PlainCssCallable($async$result);
+            case 4:
+              // join
+              oldInFunction = $async$self._async_evaluate$_inFunction;
+              $async$self._async_evaluate$_inFunction = true;
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate$_addErrorSpan$1$2(node, new E._EvaluateVisitor_visitFunctionExpression_closure2(t1, $async$self, node), type$.legacy_Value), $async$visitFunctionExpression$1);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate$_inFunction = oldInFunction;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitFunctionExpression$1, $async$completer);
+    },
+    _async_evaluate$_getFunction$2$namespace: function($name, namespace) {
+      var local = this._async_evaluate$_environment.getFunction$2$namespace($name, namespace);
+      if (local != null || namespace != null)
+        return local;
+      return this._async_evaluate$_builtInFunctions.$index(0, $name);
+    },
+    _async_evaluate$_runUserDefinedCallable$4: function($arguments, callable, nodeWithSpan, run) {
+      return this._runUserDefinedCallable$body$_EvaluateVisitor($arguments, callable, nodeWithSpan, run);
+    },
+    _runUserDefinedCallable$body$_EvaluateVisitor: function($arguments, callable, nodeWithSpan, run) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, evaluated, t1, $name;
+      var $async$_async_evaluate$_runUserDefinedCallable$4 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_evaluateArguments$1($arguments), $async$_async_evaluate$_runUserDefinedCallable$4);
+            case 3:
+              // returning from await.
+              evaluated = $async$result;
+              t1 = callable.declaration.name;
+              $name = t1 == null ? "@content" : t1 + "()";
+              $async$goto = 4;
+              return P._asyncAwait($async$self._async_evaluate$_withStackFrame$1$3($name, nodeWithSpan, new E._EvaluateVisitor__runUserDefinedCallable_closure0($async$self, callable, evaluated, nodeWithSpan, run), type$.legacy_Value), $async$_async_evaluate$_runUserDefinedCallable$4);
+            case 4:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_runUserDefinedCallable$4, $async$completer);
+    },
+    _async_evaluate$_runFunctionCallable$3: function($arguments, callable, nodeWithSpan) {
+      return this._runFunctionCallable$body$_EvaluateVisitor($arguments, callable, nodeWithSpan);
+    },
+    _runFunctionCallable$body$_EvaluateVisitor: function($arguments, callable, nodeWithSpan) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, result, t1, t2, t3, first, _i, argument, rest, $async$temp1;
+      var $async$_async_evaluate$_runFunctionCallable$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = type$.legacy_AsyncBuiltInCallable._is(callable) ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate$_runBuiltInCallable$3($arguments, callable, nodeWithSpan), $async$_async_evaluate$_runFunctionCallable$3);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              if (result == null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Custom, nodeWithSpan.get$span()));
+              $async$returnValue = result.withoutSlash$0();
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = type$.legacy_UserDefinedCallable_legacy_AsyncEnvironment._is(callable) ? 7 : 9;
+              break;
+            case 7:
+              // then
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate$_runUserDefinedCallable$4($arguments, callable, nodeWithSpan, new E._EvaluateVisitor__runFunctionCallable_closure0($async$self, callable)), $async$_async_evaluate$_runFunctionCallable$3);
+            case 10:
+              // returning from await.
+              $async$returnValue = $async$result.withoutSlash$0();
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 8;
+              break;
+            case 9:
+              // else
+              $async$goto = callable instanceof L.PlainCssCallable ? 11 : 13;
+              break;
+            case 11:
+              // then
+              t1 = $arguments.named;
+              if (t1.get$isNotEmpty(t1) || $arguments.keywordRest != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Plain_, nodeWithSpan.get$span()));
+              t1 = H.S(callable.name) + "(";
+              t2 = $arguments.positional, t3 = t2.length, first = true, _i = 0;
+            case 14:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 16;
+                break;
+              }
+              argument = t2[_i];
+              if (first)
+                first = false;
+              else
+                t1 += ", ";
+              $async$temp1 = H;
+              $async$goto = 17;
+              return P._asyncAwait($async$self._evaluateToCss$1(argument), $async$_async_evaluate$_runFunctionCallable$3);
+            case 17:
+              // returning from await.
+              t1 += $async$temp1.S($async$result);
+            case 15:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 14;
+              break;
+            case 16:
+              // after for
+              t2 = $arguments.rest;
+              $async$goto = 18;
+              return P._asyncAwait(t2 == null ? null : t2.accept$1($async$self), $async$_async_evaluate$_runFunctionCallable$3);
+            case 18:
+              // returning from await.
+              rest = $async$result;
+              if (rest != null) {
+                if (!first)
+                  t1 += ", ";
+                t2 = t1 + H.S($async$self._async_evaluate$_serialize$2(rest, t2));
+                t1 = t2;
+              }
+              t1 += H.Primitives_stringFromCharCode(41);
+              $async$returnValue = new D.SassString(t1.charCodeAt(0) == 0 ? t1 : t1, false);
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 12;
+              break;
+            case 13:
+              // else
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 12:
+              // join
+            case 8:
+              // join
+            case 4:
+              // join
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_runFunctionCallable$3, $async$completer);
+    },
+    _async_evaluate$_runBuiltInCallable$3: function($arguments, callable, nodeWithSpan) {
+      return this._runBuiltInCallable$body$_EvaluateVisitor($arguments, callable, nodeWithSpan);
+    },
+    _runBuiltInCallable$body$_EvaluateVisitor: function($arguments, callable, nodeWithSpan) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, callback, result, error, error0, error1, message, namedSet, tuple, overload, declaredArguments, i, t1, argument, t2, t3, rest, argumentList, exception, message0, evaluated, oldCallableNode, $async$exception;
+      var $async$_async_evaluate$_runBuiltInCallable$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_evaluateArguments$2$trackSpans($arguments, false), $async$_async_evaluate$_runBuiltInCallable$3);
+            case 3:
+              // returning from await.
+              evaluated = $async$result;
+              oldCallableNode = $async$self._async_evaluate$_callableNode;
+              $async$self._async_evaluate$_callableNode = nodeWithSpan;
+              namedSet = new M.MapKeySet(evaluated.named, type$.MapKeySet_legacy_String);
+              tuple = callable.callbackFor$2(evaluated.positional.length, namedSet);
+              overload = tuple.item1;
+              callback = tuple.item2;
+              $async$self._async_evaluate$_addExceptionSpan$2(nodeWithSpan, new E._EvaluateVisitor__runBuiltInCallable_closure1(overload, evaluated, namedSet));
+              declaredArguments = overload.$arguments;
+              i = evaluated.positional.length, t1 = declaredArguments.length;
+            case 4:
+              // for condition
+              if (!(i < t1)) {
+                // goto after for
+                $async$goto = 6;
+                break;
+              }
+              argument = declaredArguments[i];
+              t2 = evaluated.positional;
+              t3 = evaluated.named.remove$1(0, argument.name);
+              $async$goto = t3 == null ? 7 : 8;
+              break;
+            case 7:
+              // then
+              t3 = argument.defaultValue;
+              $async$goto = 9;
+              return P._asyncAwait(t3 == null ? null : t3.accept$1($async$self), $async$_async_evaluate$_runBuiltInCallable$3);
+            case 9:
+              // returning from await.
+              t3 = $async$result;
+            case 8:
+              // join
+              t2.push(t3);
+            case 5:
+              // for update
+              ++i;
+              // goto for condition
+              $async$goto = 4;
+              break;
+            case 6:
+              // after for
+              if (overload.restArgument != null) {
+                if (evaluated.positional.length > t1) {
+                  rest = C.JSArray_methods.sublist$1(evaluated.positional, t1);
+                  C.JSArray_methods.removeRange$2(evaluated.positional, t1, evaluated.positional.length);
+                } else
+                  rest = C.List_empty5;
+                t1 = evaluated.named;
+                argumentList = D.SassArgumentList$(rest, t1, evaluated.separator === C.ListSeparator_undecided ? C.ListSeparator_comma : evaluated.separator);
+                evaluated.positional.push(argumentList);
+              } else
+                argumentList = null;
+              result = null;
+              $async$handler = 11;
+              $async$goto = 14;
+              return P._asyncAwait(callback.call$1(evaluated.positional), $async$_async_evaluate$_runBuiltInCallable$3);
+            case 14:
+              // returning from await.
+              result = $async$result;
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 13;
+              break;
+            case 11:
+              // catch
+              $async$handler = 10;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (type$.legacy_SassRuntimeException._is(t1))
+                throw $async$exception;
+              else if (t1 instanceof E.MultiSpanSassScriptException) {
+                error = t1;
+                throw H.wrapException(E.MultiSpanSassRuntimeException$(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, $async$self._async_evaluate$_stackTrace$1(nodeWithSpan.get$span())));
+              } else if (t1 instanceof E.MultiSpanSassException) {
+                error0 = t1;
+                throw H.wrapException(E.MultiSpanSassRuntimeException$(error0._span_exception$_message, error0.get$span(), error0.primaryLabel, error0.secondarySpans, $async$self._async_evaluate$_stackTrace$1(error0.get$span())));
+              } else {
+                error1 = t1;
+                message = null;
+                try {
+                  message = H._asStringS(J.get$message$x(error1));
+                } catch (exception) {
+                  H.unwrapException($async$exception);
+                  message0 = J.toString$0$(error1);
+                  message = message0;
+                }
+                throw H.wrapException($async$self._async_evaluate$_exception$2(message, nodeWithSpan.get$span()));
+              }
+              // goto after finally
+              $async$goto = 13;
+              break;
+            case 10:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 13:
+              // after finally
+              $async$self._async_evaluate$_callableNode = oldCallableNode;
+              if (argumentList == null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = evaluated.named;
+              if (t1.get$isEmpty(t1)) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              if (argumentList._wereKeywordsAccessed) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = evaluated.named;
+              t1 = t1.get$keys(t1);
+              t1 = "No " + B.pluralize("argument", t1.get$length(t1), null) + " named ";
+              t2 = evaluated.named;
+              throw H.wrapException(E.MultiSpanSassRuntimeException$(t1 + H.S(B.toSentence(t2.get$keys(t2).map$1$1(0, new E._EvaluateVisitor__runBuiltInCallable_closure2(), type$.legacy_Object), "or")) + ".", nodeWithSpan.get$span(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([overload.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), $async$self._async_evaluate$_stackTrace$1(nodeWithSpan.get$span())));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_runBuiltInCallable$3, $async$completer);
+    },
+    _async_evaluate$_evaluateArguments$2$trackSpans: function($arguments, trackSpans) {
+      return this._evaluateArguments$body$_EvaluateVisitor($arguments, trackSpans);
+    },
+    _async_evaluate$_evaluateArguments$1: function($arguments) {
+      return this._async_evaluate$_evaluateArguments$2$trackSpans($arguments, null);
+    },
+    _evaluateArguments$body$_EvaluateVisitor: function($arguments, trackSpans) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy__ArgumentResults),
+        $async$returnValue, $async$self = this, t1, t2, t3, _i, t4, t5, t6, t7, t8, t9, positionalNodes, namedNodes, rest, restNodeForSpan, separator, keywordRest, keywordRestNodeForSpan, $async$temp1, $async$temp2;
+      var $async$_async_evaluate$_evaluateArguments$2$trackSpans = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (trackSpans == null)
+                trackSpans = $async$self._async_evaluate$_sourceMap;
+              t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+              t2 = $arguments.positional, t3 = t2.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$temp1 = t1;
+              $async$goto = 6;
+              return P._asyncAwait(t2[_i].accept$1($async$self), $async$_async_evaluate$_evaluateArguments$2$trackSpans);
+            case 6:
+              // returning from await.
+              $async$temp1.push($async$result);
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              t4 = type$.legacy_String;
+              t5 = type$.legacy_Value;
+              t6 = P.LinkedHashMap_LinkedHashMap$_empty(t4, t5);
+              t7 = $arguments.named, t8 = t7.get$entries(t7), t8 = t8.get$iterator(t8);
+            case 7:
+              // for condition
+              if (!t8.moveNext$0()) {
+                // goto after for
+                $async$goto = 8;
+                break;
+              }
+              t9 = t8.get$current(t8);
+              $async$temp1 = t6;
+              $async$temp2 = t9.key;
+              $async$goto = 9;
+              return P._asyncAwait(t9.value.accept$1($async$self), $async$_async_evaluate$_evaluateArguments$2$trackSpans);
+            case 9:
+              // returning from await.
+              $async$temp1.$indexSet(0, $async$temp2, $async$result);
+              // goto for condition
+              $async$goto = 7;
+              break;
+            case 8:
+              // after for
+              if (trackSpans) {
+                t8 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AstNode);
+                for (_i = 0; _i < t3; ++_i)
+                  t8.push($async$self._async_evaluate$_expressionNode$1(t2[_i]));
+                positionalNodes = t8;
+              } else
+                positionalNodes = null;
+              if (trackSpans) {
+                t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode);
+                for (t3 = t7.get$entries(t7), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+                  t7 = t3.get$current(t3);
+                  t2.$indexSet(0, t7.key, $async$self._async_evaluate$_expressionNode$1(t7.value));
+                }
+                namedNodes = t2;
+              } else
+                namedNodes = null;
+              t2 = $arguments.rest;
+              if (t2 == null) {
+                $async$returnValue = new E._ArgumentResults0(t1, positionalNodes, t6, namedNodes, C.ListSeparator_undecided);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 10;
+              return P._asyncAwait(t2.accept$1($async$self), $async$_async_evaluate$_evaluateArguments$2$trackSpans);
+            case 10:
+              // returning from await.
+              rest = $async$result;
+              restNodeForSpan = trackSpans ? $async$self._async_evaluate$_expressionNode$1(t2) : null;
+              if (rest instanceof A.SassMap) {
+                $async$self._async_evaluate$_addRestMap$1$3(t6, rest, t2, t5);
+                if (namedNodes != null) {
+                  t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode);
+                  for (t3 = rest.contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), t7 = type$.legacy_SassString; t3.moveNext$0();)
+                    t2.$indexSet(0, t7._as(t3.get$current(t3)).text, restNodeForSpan);
+                  namedNodes.addAll$1(0, t2);
+                }
+                separator = C.ListSeparator_undecided;
+              } else if (rest instanceof D.SassList) {
+                t2 = rest._list$_contents;
+                C.JSArray_methods.addAll$1(t1, t2);
+                if (positionalNodes != null)
+                  C.JSArray_methods.addAll$1(positionalNodes, P.List_List$filled(t2.length, restNodeForSpan, false, type$.legacy_AstNode));
+                separator = rest.separator;
+                if (rest instanceof D.SassArgumentList) {
+                  rest._wereKeywordsAccessed = true;
+                  rest._keywords.forEach$1(0, new E._EvaluateVisitor__evaluateArguments_closure0(t6, namedNodes, restNodeForSpan));
+                }
+              } else {
+                t1.push(rest);
+                if (positionalNodes != null)
+                  positionalNodes.push(restNodeForSpan);
+                separator = C.ListSeparator_undecided;
+              }
+              t2 = $arguments.keywordRest;
+              if (t2 == null) {
+                $async$returnValue = new E._ArgumentResults0(t1, positionalNodes, t6, namedNodes, separator);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 11;
+              return P._asyncAwait(t2.accept$1($async$self), $async$_async_evaluate$_evaluateArguments$2$trackSpans);
+            case 11:
+              // returning from await.
+              keywordRest = $async$result;
+              keywordRestNodeForSpan = trackSpans ? $async$self._async_evaluate$_expressionNode$1(t2) : null;
+              if (keywordRest instanceof A.SassMap) {
+                $async$self._async_evaluate$_addRestMap$1$3(t6, keywordRest, t2, t5);
+                if (namedNodes != null) {
+                  t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode);
+                  for (t3 = keywordRest.contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), t4 = type$.legacy_SassString; t3.moveNext$0();)
+                    t2.$indexSet(0, t4._as(t3.get$current(t3)).text, keywordRestNodeForSpan);
+                  namedNodes.addAll$1(0, t2);
+                }
+                $async$returnValue = new E._ArgumentResults0(t1, positionalNodes, t6, namedNodes, separator);
+                // goto return
+                $async$goto = 1;
+                break;
+              } else
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Variabs + H.S(keywordRest) + ").", t2.get$span()));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_evaluateArguments$2$trackSpans, $async$completer);
+    },
+    _async_evaluate$_evaluateMacroArguments$1: function(invocation) {
+      return this._evaluateMacroArguments$body$_EvaluateVisitor(invocation);
+    },
+    _evaluateMacroArguments$body$_EvaluateVisitor: function(invocation) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression),
+        $async$returnValue, $async$self = this, t3, positional, named, rest, keywordRest, t1, t2;
+      var $async$_async_evaluate$_evaluateMacroArguments$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = invocation.$arguments;
+              t2 = t1.rest;
+              if (t2 == null) {
+                $async$returnValue = new S.Tuple2(t1.positional, t1.named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t3 = t1.positional;
+              positional = H.setRuntimeTypeInfo(t3.slice(0), H._arrayInstanceType(t3)._eval$1("JSArray<1>"));
+              t3 = type$.legacy_Expression;
+              named = P.LinkedHashMap_LinkedHashMap$of(t1.named, type$.legacy_String, t3);
+              $async$goto = 3;
+              return P._asyncAwait(t2.accept$1($async$self), $async$_async_evaluate$_evaluateMacroArguments$1);
+            case 3:
+              // returning from await.
+              rest = $async$result;
+              if (rest instanceof A.SassMap)
+                $async$self._async_evaluate$_addRestMap$1$4(named, rest, invocation, new E._EvaluateVisitor__evaluateMacroArguments_closure3(), t3);
+              else if (rest instanceof D.SassList) {
+                t2 = rest._list$_contents;
+                C.JSArray_methods.addAll$1(positional, new H.MappedListIterable(t2, new E._EvaluateVisitor__evaluateMacroArguments_closure4(), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Expression*>")));
+                if (rest instanceof D.SassArgumentList) {
+                  rest._wereKeywordsAccessed = true;
+                  rest._keywords.forEach$1(0, new E._EvaluateVisitor__evaluateMacroArguments_closure5(named));
+                }
+              } else
+                positional.push(new F.ValueExpression(rest, null));
+              t1 = t1.keywordRest;
+              if (t1 == null) {
+                $async$returnValue = new S.Tuple2(positional, named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 4;
+              return P._asyncAwait(t1.accept$1($async$self), $async$_async_evaluate$_evaluateMacroArguments$1);
+            case 4:
+              // returning from await.
+              keywordRest = $async$result;
+              if (keywordRest instanceof A.SassMap) {
+                $async$self._async_evaluate$_addRestMap$1$4(named, keywordRest, invocation, new E._EvaluateVisitor__evaluateMacroArguments_closure6(), t3);
+                $async$returnValue = new S.Tuple2(positional, named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression);
+                // goto return
+                $async$goto = 1;
+                break;
+              } else
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Variabs + H.S(keywordRest) + ").", invocation.span));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_evaluateMacroArguments$1, $async$completer);
+    },
+    _async_evaluate$_addRestMap$1$4: function(values, map, nodeWithSpan, convert, $T) {
+      var t1 = {};
+      t1.convert = convert;
+      if (convert == null)
+        t1.convert = new E._EvaluateVisitor__addRestMap_closure1($T);
+      map.contents.forEach$1(0, new E._EvaluateVisitor__addRestMap_closure2(t1, this, values, map, nodeWithSpan));
+    },
+    _async_evaluate$_addRestMap$1$3: function(values, map, nodeWithSpan, $T) {
+      return this._async_evaluate$_addRestMap$1$4(values, map, nodeWithSpan, null, $T);
+    },
+    _async_evaluate$_verifyArguments$4: function(positional, named, $arguments, nodeWithSpan) {
+      return this._async_evaluate$_addExceptionSpan$2(nodeWithSpan, new E._EvaluateVisitor__verifyArguments_closure0($arguments, positional, named));
+    },
+    visitSelectorExpression$1: function(node) {
+      return this.visitSelectorExpression$body$_EvaluateVisitor(node);
+    },
+    visitSelectorExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1;
+      var $async$visitSelectorExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate$_styleRule;
+              if (t1 == null) {
+                $async$returnValue = C.C_SassNull0;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$returnValue = t1.originalSelector.get$asSassList();
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitSelectorExpression$1, $async$completer);
+    },
+    visitStringExpression$1: function(node) {
+      return this.visitStringExpression$body$_EvaluateVisitor(node);
+    },
+    visitStringExpression$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassString),
+        $async$returnValue, $async$self = this, $async$temp1, $async$temp2;
+      var $async$visitStringExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = D;
+              $async$temp2 = J;
+              $async$goto = 3;
+              return P._asyncAwait(B.mapAsync(node.text.contents, new E._EvaluateVisitor_visitStringExpression_closure0($async$self), type$.legacy_Object, type$.legacy_String), $async$visitStringExpression$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = new $async$temp1.SassString($async$temp2.join$0$ax($async$result), node.hasQuotes);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitStringExpression$1, $async$completer);
+    },
+    visitCssAtRule$1: function(node) {
+      return this.visitCssAtRule$body$_EvaluateVisitor(node);
+    },
+    visitCssAtRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$self = this, wasInKeyframes, wasInUnknownAtRule, t1;
+      var $async$visitCssAtRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.At_rul, node.span));
+              if (node.isChildless) {
+                $async$self._async_evaluate$_parent.addChild$1(U.ModifiableCssAtRule$(node.name, node.span, true, node.value));
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              wasInKeyframes = $async$self._async_evaluate$_inKeyframes;
+              wasInUnknownAtRule = $async$self._async_evaluate$_inUnknownAtRule;
+              t1 = node.name;
+              if (B.unvendor(t1.get$value(t1)) === "keyframes")
+                $async$self._async_evaluate$_inKeyframes = true;
+              else
+                $async$self._async_evaluate$_inUnknownAtRule = true;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(U.ModifiableCssAtRule$(t1, node.span, false, node.value), new E._EvaluateVisitor_visitCssAtRule_closure1($async$self, node), false, new E._EvaluateVisitor_visitCssAtRule_closure2(), type$.legacy_ModifiableCssAtRule, type$.Null), $async$visitCssAtRule$1);
+            case 3:
+              // returning from await.
+              $async$self._async_evaluate$_inUnknownAtRule = wasInUnknownAtRule;
+              $async$self._async_evaluate$_inKeyframes = wasInKeyframes;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssAtRule$1, $async$completer);
+    },
+    visitCssComment$1: function(node) {
+      return this.visitCssComment$body$_EvaluateVisitor(node);
+    },
+    visitCssComment$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, t1, t2;
+      var $async$visitCssComment$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate$_parent;
+              t2 = $async$self._async_evaluate$_root;
+              if (t1 == t2 && $async$self._async_evaluate$_endOfImports === J.get$length$asx(t2.children._collection$_source))
+                $async$self._async_evaluate$_endOfImports = $async$self._async_evaluate$_endOfImports + 1;
+              $async$self._async_evaluate$_parent.addChild$1(new R.ModifiableCssComment(node.text, node.span));
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssComment$1, $async$completer);
+    },
+    visitCssDeclaration$1: function(node) {
+      return this.visitCssDeclaration$body$_EvaluateVisitor(node);
+    },
+    visitCssDeclaration$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, t1;
+      var $async$visitCssDeclaration$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.name;
+              $async$self._async_evaluate$_parent.addChild$1(L.ModifiableCssDeclaration$(t1, node.value, node.span, J.startsWith$1$s(t1.get$value(t1), "--"), node.valueSpanForMap));
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssDeclaration$1, $async$completer);
+    },
+    visitCssImport$1: function(node) {
+      return this.visitCssImport$body$_EvaluateVisitor(node);
+    },
+    visitCssImport$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, modifiableNode, t1, t2;
+      var $async$visitCssImport$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              modifiableNode = F.ModifiableCssImport$(node.url, node.span, node.media, node.supports);
+              t1 = $async$self._async_evaluate$_parent;
+              t2 = $async$self._async_evaluate$_root;
+              if (t1 != t2)
+                t1.addChild$1(modifiableNode);
+              else if ($async$self._async_evaluate$_endOfImports === J.get$length$asx(t2.children._collection$_source)) {
+                $async$self._async_evaluate$_root.addChild$1(modifiableNode);
+                $async$self._async_evaluate$_endOfImports = $async$self._async_evaluate$_endOfImports + 1;
+              } else {
+                t1 = $async$self._async_evaluate$_outOfOrderImports;
+                (t1 == null ? $async$self._async_evaluate$_outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport) : t1).push(modifiableNode);
+              }
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssImport$1, $async$completer);
+    },
+    visitCssKeyframeBlock$1: function(node) {
+      return this.visitCssKeyframeBlock$body$_EvaluateVisitor(node);
+    },
+    visitCssKeyframeBlock$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this;
+      var $async$visitCssKeyframeBlock$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 2;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(U.ModifiableCssKeyframeBlock$(node.selector, node.span), new E._EvaluateVisitor_visitCssKeyframeBlock_closure1($async$self, node), false, new E._EvaluateVisitor_visitCssKeyframeBlock_closure2(), type$.legacy_ModifiableCssKeyframeBlock, type$.Null), $async$visitCssKeyframeBlock$1);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssKeyframeBlock$1, $async$completer);
+    },
+    visitCssMediaRule$1: function(node) {
+      return this.visitCssMediaRule$body$_EvaluateVisitor(node);
+    },
+    visitCssMediaRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$self = this, t1, mergedQueries;
+      var $async$visitCssMediaRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Media_, node.span));
+              t1 = $async$self._async_evaluate$_mediaQueries;
+              mergedQueries = t1 == null ? null : $async$self._async_evaluate$_mergeMediaQueries$2(t1, node.queries);
+              t1 = mergedQueries == null;
+              if (!t1 && mergedQueries.length === 0) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = t1 ? node.queries : mergedQueries;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(G.ModifiableCssMediaRule$(t1, node.span), new E._EvaluateVisitor_visitCssMediaRule_closure1($async$self, mergedQueries, node), false, new E._EvaluateVisitor_visitCssMediaRule_closure2(mergedQueries), type$.legacy_ModifiableCssMediaRule, type$.Null), $async$visitCssMediaRule$1);
+            case 3:
+              // returning from await.
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssMediaRule$1, $async$completer);
+    },
+    visitCssStyleRule$1: function(node) {
+      return this.visitCssStyleRule$body$_EvaluateVisitor(node);
+    },
+    visitCssStyleRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, t1, t2, t3, originalSelector, rule, oldAtRootExcludingStyleRule;
+      var $async$visitCssStyleRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Style_, node.span));
+              t1 = node.selector;
+              t2 = t1.value;
+              t3 = $async$self._async_evaluate$_styleRule;
+              t3 = t3 == null ? null : t3.originalSelector;
+              originalSelector = t2.resolveParentSelectors$2$implicitParent(t3, !$async$self._async_evaluate$_atRootExcludingStyleRule);
+              rule = X.ModifiableCssStyleRule$($async$self._async_evaluate$_extender.addSelector$3(originalSelector, t1.span, $async$self._async_evaluate$_mediaQueries), node.span, originalSelector);
+              oldAtRootExcludingStyleRule = $async$self._async_evaluate$_atRootExcludingStyleRule;
+              $async$self._async_evaluate$_atRootExcludingStyleRule = false;
+              $async$goto = 2;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(rule, new E._EvaluateVisitor_visitCssStyleRule_closure1($async$self, rule, node), false, new E._EvaluateVisitor_visitCssStyleRule_closure2(), type$.legacy_ModifiableCssStyleRule, type$.Null), $async$visitCssStyleRule$1);
+            case 2:
+              // returning from await.
+              $async$self._async_evaluate$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+              if (!($async$self._async_evaluate$_styleRule != null && !oldAtRootExcludingStyleRule)) {
+                t1 = $async$self._async_evaluate$_parent.children;
+                t1 = !t1.get$isEmpty(t1);
+              } else
+                t1 = false;
+              if (t1) {
+                t1 = $async$self._async_evaluate$_parent.children;
+                t1.get$last(t1).isGroupEnd = true;
+              }
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssStyleRule$1, $async$completer);
+    },
+    visitCssStylesheet$1: function(node) {
+      return this.visitCssStylesheet$body$_EvaluateVisitor(node);
+    },
+    visitCssStylesheet$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, t1;
+      var $async$visitCssStylesheet$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = J.get$iterator$ax(node.get$children(node));
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              $async$goto = 4;
+              return P._asyncAwait(t1.get$current(t1).accept$1($async$self), $async$visitCssStylesheet$1);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssStylesheet$1, $async$completer);
+    },
+    visitCssSupportsRule$1: function(node) {
+      return this.visitCssSupportsRule$body$_EvaluateVisitor(node);
+    },
+    visitCssSupportsRule$body$_EvaluateVisitor: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this;
+      var $async$visitCssSupportsRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate$_exception$2(string$.Suppor, node.span));
+              $async$goto = 2;
+              return P._asyncAwait($async$self._async_evaluate$_withParent$2$4$scopeWhen$through(B.ModifiableCssSupportsRule$(node.condition, node.span), new E._EvaluateVisitor_visitCssSupportsRule_closure1($async$self, node), false, new E._EvaluateVisitor_visitCssSupportsRule_closure2(), type$.legacy_ModifiableCssSupportsRule, type$.Null), $async$visitCssSupportsRule$1);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssSupportsRule$1, $async$completer);
+    },
+    _async_evaluate$_handleReturn$1$2: function(list, callback) {
+      return this._handleReturn$body$_EvaluateVisitor(list, callback);
+    },
+    _async_evaluate$_handleReturn$2: function(list, callback) {
+      return this._async_evaluate$_handleReturn$1$2(list, callback, type$.dynamic);
+    },
+    _handleReturn$body$_EvaluateVisitor: function(list, callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, t1, _i, result;
+      var $async$_async_evaluate$_handleReturn$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = list.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < list.length)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(callback.call$1(list[_i]), $async$_async_evaluate$_handleReturn$1$2);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              if (result != null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              list.length === t1 || (0, H.throwConcurrentModificationError)(list), ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_handleReturn$1$2, $async$completer);
+    },
+    _async_evaluate$_withEnvironment$1$2: function(environment, callback, $T) {
+      return this._withEnvironment$body$_EvaluateVisitor(environment, callback, $T, $T._eval$1("0*"));
+    },
+    _withEnvironment$body$_EvaluateVisitor: function(environment, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, result, oldEnvironment;
+      var $async$_async_evaluate$_withEnvironment$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldEnvironment = $async$self._async_evaluate$_environment;
+              $async$self._async_evaluate$_environment = environment;
+              $async$goto = 3;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate$_withEnvironment$1$2);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate$_environment = oldEnvironment;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_withEnvironment$1$2, $async$completer);
+    },
+    _async_evaluate$_interpolationToValue$3$trim$warnForColor: function(interpolation, trim, warnForColor) {
+      return this._interpolationToValue$body$_EvaluateVisitor(interpolation, trim, warnForColor);
+    },
+    _async_evaluate$_interpolationToValue$1: function(interpolation) {
+      return this._async_evaluate$_interpolationToValue$3$trim$warnForColor(interpolation, false, false);
+    },
+    _async_evaluate$_interpolationToValue$2$warnForColor: function(interpolation, warnForColor) {
+      return this._async_evaluate$_interpolationToValue$3$trim$warnForColor(interpolation, false, warnForColor);
+    },
+    _interpolationToValue$body$_EvaluateVisitor: function(interpolation, trim, warnForColor) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_CssValue_legacy_String),
+        $async$returnValue, $async$self = this, result, t1;
+      var $async$_async_evaluate$_interpolationToValue$3$trim$warnForColor = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_performInterpolation$2$warnForColor(interpolation, warnForColor), $async$_async_evaluate$_interpolationToValue$3$trim$warnForColor);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              t1 = trim ? B.trimAscii(result, true) : result;
+              $async$returnValue = new F.CssValue(t1, interpolation.span, type$.CssValue_legacy_String);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_interpolationToValue$3$trim$warnForColor, $async$completer);
+    },
+    _async_evaluate$_performInterpolation$2$warnForColor: function(interpolation, warnForColor) {
+      return this._performInterpolation$body$_EvaluateVisitor(interpolation, warnForColor);
+    },
+    _async_evaluate$_performInterpolation$1: function(interpolation) {
+      return this._async_evaluate$_performInterpolation$2$warnForColor(interpolation, false);
+    },
+    _performInterpolation$body$_EvaluateVisitor: function(interpolation, warnForColor) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, $async$temp1;
+      var $async$_async_evaluate$_performInterpolation$2$warnForColor = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = J;
+              $async$goto = 3;
+              return P._asyncAwait(B.mapAsync(interpolation.contents, new E._EvaluateVisitor__performInterpolation_closure0($async$self, warnForColor), type$.legacy_Object, type$.legacy_String), $async$_async_evaluate$_performInterpolation$2$warnForColor);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$temp1.join$0$ax($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_performInterpolation$2$warnForColor, $async$completer);
+    },
+    _evaluateToCss$2$quote: function(expression, quote) {
+      return this._evaluateToCss$body$_EvaluateVisitor(expression, quote);
+    },
+    _evaluateToCss$1: function(expression) {
+      return this._evaluateToCss$2$quote(expression, true);
+    },
+    _evaluateToCss$body$_EvaluateVisitor: function(expression, quote) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this;
+      var $async$_evaluateToCss$2$quote = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(expression.accept$1($async$self), $async$_evaluateToCss$2$quote);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$self._async_evaluate$_serialize$3$quote($async$result, expression, quote);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_evaluateToCss$2$quote, $async$completer);
+    },
+    _async_evaluate$_serialize$3$quote: function(value, nodeWithSpan, quote) {
+      return this._async_evaluate$_addExceptionSpan$2(nodeWithSpan, new E._EvaluateVisitor__serialize_closure0(value, quote));
+    },
+    _async_evaluate$_serialize$2: function(value, nodeWithSpan) {
+      return this._async_evaluate$_serialize$3$quote(value, nodeWithSpan, true);
+    },
+    _async_evaluate$_expressionNode$1: function(expression) {
+      var t1;
+      if (!this._async_evaluate$_sourceMap)
+        return null;
+      if (expression instanceof S.VariableExpression) {
+        t1 = this._async_evaluate$_environment.getVariableNode$2$namespace(expression.name, expression.namespace);
+        return t1 == null ? expression : t1;
+      } else
+        return expression;
+    },
+    _async_evaluate$_withParent$2$4$scopeWhen$through: function(node, callback, scopeWhen, through, $S, $T) {
+      return this._withParent$body$_EvaluateVisitor(node, callback, scopeWhen, through, $S, $T, $T._eval$1("0*"));
+    },
+    _async_evaluate$_withParent$2$2: function(node, callback, $S, $T) {
+      return this._async_evaluate$_withParent$2$4$scopeWhen$through(node, callback, true, null, $S, $T);
+    },
+    _async_evaluate$_withParent$2$3$scopeWhen: function(node, callback, scopeWhen, $S, $T) {
+      return this._async_evaluate$_withParent$2$4$scopeWhen$through(node, callback, scopeWhen, null, $S, $T);
+    },
+    _withParent$body$_EvaluateVisitor: function(node, callback, scopeWhen, through, $S, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, oldParent, result;
+      var $async$_async_evaluate$_withParent$2$4$scopeWhen$through = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$self._async_evaluate$_addChild$2$through(node, through);
+              oldParent = $async$self._async_evaluate$_parent;
+              $async$self._async_evaluate$_parent = node;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate$_environment.scope$1$2$when(callback, scopeWhen, $T._eval$1("0*")), $async$_async_evaluate$_withParent$2$4$scopeWhen$through);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate$_parent = oldParent;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_withParent$2$4$scopeWhen$through, $async$completer);
+    },
+    _async_evaluate$_addChild$2$through: function(node, through) {
+      var grandparent,
+        $parent = this._async_evaluate$_parent;
+      if (through != null) {
+        for (; through.call$1($parent);)
+          $parent = $parent._parent;
+        if ($parent.get$hasFollowingSibling()) {
+          grandparent = $parent._parent;
+          $parent = $parent.copyWithoutChildren$0();
+          grandparent.addChild$1($parent);
+        }
+      }
+      $parent.addChild$1(node);
+    },
+    _async_evaluate$_addChild$1: function(node) {
+      return this._async_evaluate$_addChild$2$through(node, null);
+    },
+    _async_evaluate$_withStyleRule$1$2: function(rule, callback, $T) {
+      return this._withStyleRule$body$_EvaluateVisitor(rule, callback, $T, $T._eval$1("0*"));
+    },
+    _withStyleRule$body$_EvaluateVisitor: function(rule, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, result, oldRule;
+      var $async$_async_evaluate$_withStyleRule$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldRule = $async$self._async_evaluate$_styleRule;
+              $async$self._async_evaluate$_styleRule = rule;
+              $async$goto = 3;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate$_withStyleRule$1$2);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate$_styleRule = oldRule;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_withStyleRule$1$2, $async$completer);
+    },
+    _async_evaluate$_withMediaQueries$1$2: function(queries, callback, $T) {
+      return this._withMediaQueries$body$_EvaluateVisitor(queries, callback, $T, $T._eval$1("0*"));
+    },
+    _withMediaQueries$body$_EvaluateVisitor: function(queries, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, result, oldMediaQueries;
+      var $async$_async_evaluate$_withMediaQueries$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldMediaQueries = $async$self._async_evaluate$_mediaQueries;
+              $async$self._async_evaluate$_mediaQueries = queries;
+              $async$goto = 3;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate$_withMediaQueries$1$2);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate$_mediaQueries = oldMediaQueries;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_withMediaQueries$1$2, $async$completer);
+    },
+    _async_evaluate$_withStackFrame$1$3: function(member, nodeWithSpan, callback, $T) {
+      return this._withStackFrame$body$_EvaluateVisitor(member, nodeWithSpan, callback, $T, $T._eval$1("0*"));
+    },
+    _withStackFrame$body$_EvaluateVisitor: function(member, nodeWithSpan, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, oldMember, result, t1;
+      var $async$_async_evaluate$_withStackFrame$1$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate$_stack;
+              t1.push(new S.Tuple2($async$self._async_evaluate$_member, nodeWithSpan, type$.Tuple2_of_legacy_String_and_legacy_AstNode));
+              oldMember = $async$self._async_evaluate$_member;
+              $async$self._async_evaluate$_member = member;
+              $async$goto = 3;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate$_withStackFrame$1$3);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate$_member = oldMember;
+              t1.pop();
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_withStackFrame$1$3, $async$completer);
+    },
+    _async_evaluate$_stackFrame$2: function(member, span) {
+      var url = span.file.url;
+      return B.frameForSpan(span, member, url != null && this._async_evaluate$_importCache != null ? this._async_evaluate$_importCache.humanize$1(url) : url);
+    },
+    _async_evaluate$_stackTrace$1: function(span) {
+      var t2, cur, _this = this,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Frame);
+      for (t2 = _this._async_evaluate$_stack, t2 = new H.MappedListIterable(t2, new E._EvaluateVisitor__stackTrace_closure0(_this), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Frame*>")), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      if (span != null)
+        t1.push(_this._async_evaluate$_stackFrame$2(_this._async_evaluate$_member, span));
+      return new Y.Trace(P.List_List$unmodifiable(new H.ReversedListIterable(t1, type$.ReversedListIterable_legacy_Frame), type$.legacy_Frame), new P._StringStackTrace(null));
+    },
+    _async_evaluate$_stackTrace$0: function() {
+      return this._async_evaluate$_stackTrace$1(null);
+    },
+    _async_evaluate$_warn$3$deprecation: function(message, span, deprecation) {
+      return this._async_evaluate$_logger.warn$4$deprecation$span$trace(0, message, deprecation, span, this._async_evaluate$_stackTrace$1(span));
+    },
+    _async_evaluate$_warn$2: function(message, span) {
+      return this._async_evaluate$_warn$3$deprecation(message, span, false);
+    },
+    _async_evaluate$_exception$2: function(message, span) {
+      var t1 = span == null ? C.JSArray_methods.get$last(this._async_evaluate$_stack).item2.get$span() : span;
+      return new E.SassRuntimeException(this._async_evaluate$_stackTrace$1(span), message, t1);
+    },
+    _async_evaluate$_exception$1: function(message) {
+      return this._async_evaluate$_exception$2(message, null);
+    },
+    _async_evaluate$_multiSpanException$3: function(message, primaryLabel, secondaryLabels) {
+      var t1 = C.JSArray_methods.get$last(this._async_evaluate$_stack).item2.get$span();
+      return new E.MultiSpanSassRuntimeException(this._async_evaluate$_stackTrace$0(), primaryLabel, H.ConstantMap_ConstantMap$from(secondaryLabels, type$.legacy_FileSpan, type$.legacy_String), message, t1);
+    },
+    _async_evaluate$_adjustParseError$1$2: function(nodeWithSpan, callback) {
+      var error, errorText, span, syntheticFile, syntheticSpan, t1, exception, t2, t3, t4, t5, _null = null;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException) {
+          error = t1;
+          t1 = error;
+          errorText = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(G.SourceSpanException.prototype.get$span.call(t1).file._decodedChars, 0, _null), 0, _null);
+          span = nodeWithSpan.get$span();
+          t1 = span;
+          t2 = span;
+          syntheticFile = C.JSString_methods.replaceRange$3(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(span.file._decodedChars, 0, _null), 0, _null), Y.FileLocation$_(t1.file, t1._file$_start).offset, Y.FileLocation$_(t2.file, t2._end).offset, errorText);
+          t2 = Y.SourceFile$fromString(syntheticFile, span.file.url);
+          t1 = span;
+          t1 = Y.FileLocation$_(t1.file, t1._file$_start);
+          t3 = error;
+          t3 = G.SourceSpanException.prototype.get$span.call(t3);
+          t3 = Y.FileLocation$_(t3.file, t3._file$_start);
+          t4 = span;
+          t4 = Y.FileLocation$_(t4.file, t4._file$_start);
+          t5 = error;
+          t5 = G.SourceSpanException.prototype.get$span.call(t5);
+          syntheticSpan = t2.span$2(t1.offset + t3.offset, t4.offset + Y.FileLocation$_(t5.file, t5._end).offset);
+          throw H.wrapException(this._async_evaluate$_exception$2(error._span_exception$_message, syntheticSpan));
+        } else
+          throw exception;
+      }
+    },
+    _async_evaluate$_adjustParseError$2: function(nodeWithSpan, callback) {
+      return this._async_evaluate$_adjustParseError$1$2(nodeWithSpan, callback, type$.dynamic);
+    },
+    _async_evaluate$_addExceptionSpan$1$2: function(nodeWithSpan, callback) {
+      var error, error0, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.MultiSpanSassScriptException) {
+          error = t1;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, this._async_evaluate$_stackTrace$1(nodeWithSpan.get$span())));
+        } else if (t1 instanceof E.SassScriptException) {
+          error0 = t1;
+          throw H.wrapException(this._async_evaluate$_exception$2(error0.message, nodeWithSpan.get$span()));
+        } else
+          throw exception;
+      }
+    },
+    _async_evaluate$_addExceptionSpan$2: function(nodeWithSpan, callback) {
+      return this._async_evaluate$_addExceptionSpan$1$2(nodeWithSpan, callback, type$.dynamic);
+    },
+    _addExceptionSpanAsync$1$2: function(nodeWithSpan, callback, $T) {
+      return this._addExceptionSpanAsync$body$_EvaluateVisitor(nodeWithSpan, callback, $T, $T._eval$1("0*"));
+    },
+    _addExceptionSpanAsync$body$_EvaluateVisitor: function(nodeWithSpan, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, error, error0, t1, exception, $async$exception;
+      var $async$_addExceptionSpanAsync$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$handler = 4;
+              $async$goto = 7;
+              return P._asyncAwait(callback.call$0(), $async$_addExceptionSpanAsync$1$2);
+            case 7:
+              // returning from await.
+              t1 = $async$result;
+              $async$returnValue = t1;
+              // goto return
+              $async$goto = 1;
+              break;
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (t1 instanceof E.MultiSpanSassScriptException) {
+                error = t1;
+                throw H.wrapException(E.MultiSpanSassRuntimeException$(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, $async$self._async_evaluate$_stackTrace$1(nodeWithSpan.get$span())));
+              } else if (t1 instanceof E.SassScriptException) {
+                error0 = t1;
+                throw H.wrapException($async$self._async_evaluate$_exception$2(error0.message, nodeWithSpan.get$span()));
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 3:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 6:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_addExceptionSpanAsync$1$2, $async$completer);
+    },
+    _async_evaluate$_addErrorSpan$1$2: function(nodeWithSpan, callback, $T) {
+      return this._addErrorSpan$body$_EvaluateVisitor(nodeWithSpan, callback, $T, $T._eval$1("0*"));
+    },
+    _addErrorSpan$body$_EvaluateVisitor: function(nodeWithSpan, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, error, t1, exception, $async$exception;
+      var $async$_async_evaluate$_addErrorSpan$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$handler = 4;
+              $async$goto = 7;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate$_addErrorSpan$1$2);
+            case 7:
+              // returning from await.
+              t1 = $async$result;
+              $async$returnValue = t1;
+              // goto return
+              $async$goto = 1;
+              break;
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (type$.legacy_SassRuntimeException._is(t1)) {
+                error = t1;
+                t1 = error.get$span();
+                if (!C.JSString_methods.startsWith$1(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1.file._decodedChars, t1._file$_start, t1._end), 0, null), "@error"))
+                  throw $async$exception;
+                throw H.wrapException(E.SassRuntimeException$(error._span_exception$_message, nodeWithSpan.get$span(), $async$self._async_evaluate$_stackTrace$0()));
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 3:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 6:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate$_addErrorSpan$1$2, $async$completer);
+    }
+  };
+  E._EvaluateVisitor_closure9.prototype = {
+    call$1: function($arguments) {
+      var module, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this._async_evaluate$_environment;
+      t2 = variable.text;
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return t1.globalVariableExists$2$namespace(t2, module == null ? null : module.text) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  E._EvaluateVisitor_closure10.prototype = {
+    call$1: function($arguments) {
+      var variable = J.$index$asx($arguments, 0).assertString$1("name"),
+        t1 = this.$this._async_evaluate$_environment,
+        t2 = variable.text;
+      t2.toString;
+      return t1.getVariable$1(H.stringReplaceAllUnchecked(t2, "_", "-")) != null ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  E._EvaluateVisitor_closure11.prototype = {
+    call$1: function($arguments) {
+      var module, t2, t3, t4,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this;
+      t2 = t1._async_evaluate$_environment;
+      t3 = variable.text;
+      t3.toString;
+      t4 = H.stringReplaceAllUnchecked(t3, "_", "-");
+      return t2.getFunction$2$namespace(t4, module == null ? null : module.text) != null || t1._async_evaluate$_builtInFunctions.containsKey$1(t3) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  E._EvaluateVisitor_closure12.prototype = {
+    call$1: function($arguments) {
+      var module, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this._async_evaluate$_environment;
+      t2 = variable.text;
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return t1.getMixin$2$namespace(t2, module == null ? null : module.text) != null ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  E._EvaluateVisitor_closure13.prototype = {
+    call$1: function($arguments) {
+      var t1 = this.$this._async_evaluate$_environment;
+      if (!t1._async_environment$_inMixin)
+        throw H.wrapException(E.SassScriptException$(string$.conten));
+      return t1._async_environment$_content != null ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  E._EvaluateVisitor_closure14.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.$index$asx($arguments, 0).assertString$1("module").text,
+        module = this.$this._async_evaluate$_environment._async_environment$_modules.$index(0, t1);
+      if (module == null)
+        throw H.wrapException('There is no module with namespace "' + H.S(t1) + '".');
+      t1 = type$.legacy_Value;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = module.get$variables(), t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, new D.SassString(t4.key, true), t4.value);
+      }
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 36
+  };
+  E._EvaluateVisitor_closure15.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.$index$asx($arguments, 0).assertString$1("module").text,
+        module = this.$this._async_evaluate$_environment._async_environment$_modules.$index(0, t1);
+      if (module == null)
+        throw H.wrapException('There is no module with namespace "' + H.S(t1) + '".');
+      t1 = type$.legacy_Value;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = module.get$functions(module), t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, new D.SassString(t4.key, true), new F.SassFunction(t4.value));
+      }
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 36
+  };
+  E._EvaluateVisitor_closure16.prototype = {
+    call$1: function($arguments) {
+      var module, callable,
+        t1 = J.getInterceptor$asx($arguments),
+        $name = t1.$index($arguments, 0).assertString$1("name"),
+        css = t1.$index($arguments, 1).get$isTruthy();
+      t1 = t1.$index($arguments, 2).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      if (css && module != null)
+        throw H.wrapException(string$.x24css_a);
+      if (css)
+        callable = new L.PlainCssCallable($name.text);
+      else {
+        t1 = this.$this;
+        callable = t1._async_evaluate$_addExceptionSpan$2(t1._async_evaluate$_callableNode, new E._EvaluateVisitor__closure4(t1, $name, module));
+      }
+      if (callable != null)
+        return new F.SassFunction(callable);
+      throw H.wrapException("Function not found: " + $name.toString$0(0));
+    },
+    $signature: 212
+  };
+  E._EvaluateVisitor__closure4.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this.name.text;
+      t1.toString;
+      t1 = H.stringReplaceAllUnchecked(t1, "_", "-");
+      t2 = this.module;
+      t2 = t2 == null ? null : t2.text;
+      return this.$this._async_evaluate$_getFunction$2$namespace(t1, t2);
+    },
+    $signature: 105
+  };
+  E._EvaluateVisitor_closure17.prototype = {
+    call$1: function($arguments) {
+      return this.$call$body$_EvaluateVisitor_closure0($arguments);
+    },
+    $call$body$_EvaluateVisitor_closure0: function($arguments) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t2, t3, t4, t5, t6, t7, t8, t9, t10, invocation, callable, t1, $function, args;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = J.getInterceptor$asx($arguments);
+              $function = t1.$index($arguments, 0);
+              args = type$.legacy_SassArgumentList._as(t1.$index($arguments, 1));
+              t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression);
+              t2 = type$.legacy_String;
+              t3 = type$.legacy_Expression;
+              t4 = $async$self.$this;
+              t5 = t4._async_evaluate$_callableNode.get$span();
+              t6 = t4._async_evaluate$_callableNode.get$span();
+              args._wereKeywordsAccessed = true;
+              t7 = args._keywords;
+              if (t7.get$isEmpty(t7))
+                t7 = null;
+              else {
+                t8 = type$.legacy_Value;
+                t9 = P.LinkedHashMap_LinkedHashMap$_empty(t8, t8);
+                for (args._wereKeywordsAccessed = true, t7 = t7.get$entries(t7), t7 = t7.get$iterator(t7); t7.moveNext$0();) {
+                  t10 = t7.get$current(t7);
+                  t9.$indexSet(0, new D.SassString(t10.key, false), t10.value);
+                }
+                t7 = new F.ValueExpression(new A.SassMap(H.ConstantMap_ConstantMap$from(t9, t8, t8)), t4._async_evaluate$_callableNode.get$span());
+              }
+              invocation = new X.ArgumentInvocation(P.List_List$unmodifiable(t1, t3), H.ConstantMap_ConstantMap$from(P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), t2, t3), new F.ValueExpression(args, t6), t7, t5);
+              $async$goto = $function instanceof D.SassString ? 3 : 4;
+              break;
+            case 3:
+              // then
+              N.warn(string$.Passin + $function.toString$0(0) + ")) instead.", true);
+              $async$goto = 5;
+              return P._asyncAwait(t4.visitFunctionExpression$1(new F.FunctionExpression(null, X.Interpolation$(H.setRuntimeTypeInfo([$function.text], type$.JSArray_legacy_Object), t4._async_evaluate$_callableNode.get$span()), invocation, t4._async_evaluate$_callableNode.get$span())), $async$call$1);
+            case 5:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 4:
+              // join
+              callable = $function.assertFunction$1("function").callable;
+              $async$goto = type$.legacy_AsyncCallable._is(callable) ? 6 : 8;
+              break;
+            case 6:
+              // then
+              $async$goto = 9;
+              return P._asyncAwait(t4._async_evaluate$_runFunctionCallable$3(invocation, callable, t4._async_evaluate$_callableNode), $async$call$1);
+            case 9:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 7;
+              break;
+            case 8:
+              // else
+              throw H.wrapException(E.SassScriptException$("The function " + H.S(callable.get$name(callable)) + string$.x20is_as));
+            case 7:
+              // join
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 217
+  };
+  E._EvaluateVisitor_closure18.prototype = {
+    call$1: function($arguments) {
+      return this.$call$body$_EvaluateVisitor_closure($arguments);
+    },
+    $call$body$_EvaluateVisitor_closure: function($arguments) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, withMap, values, configuration, t2, t3, t1, url;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = J.getInterceptor$asx($arguments);
+              url = P.Uri_parse(t1.$index($arguments, 0).assertString$1("url").text);
+              t1 = t1.$index($arguments, 1).get$realNull();
+              t1 = t1 == null ? null : t1.assertMap$1("with");
+              withMap = t1 == null ? null : t1.contents;
+              if (withMap != null) {
+                values = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_ConfiguredValue);
+                t1 = $async$self.$this;
+                withMap.forEach$1(0, new E._EvaluateVisitor__closure2(values, t1._async_evaluate$_callableNode.get$span()));
+                configuration = new A.Configuration(values, t1._async_evaluate$_callableNode, false);
+              } else
+                configuration = C.Configuration_Map_empty_null_true;
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate$_callableNode;
+              t3 = t2.get$span();
+              t3 = t3 == null ? null : t3.file.url;
+              $async$goto = 3;
+              return P._asyncAwait(t1._async_evaluate$_loadModule$7$baseUrl$configuration$namesInErrors(url, "load-css()", t2, new E._EvaluateVisitor__closure3(t1), t3, configuration, true), $async$call$1);
+            case 3:
+              // returning from await.
+              t1._async_evaluate$_assertConfigurationIsEmpty$2$nameInError(configuration, true);
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 126
+  };
+  E._EvaluateVisitor__closure2.prototype = {
+    call$2: function(variable, value) {
+      var $name,
+        t1 = variable.assertString$1("with key").text;
+      t1.toString;
+      $name = H.stringReplaceAllUnchecked(t1, "_", "-");
+      t1 = this.values;
+      if (t1.containsKey$1($name))
+        throw H.wrapException("The variable $" + $name + " was configured twice.");
+      t1.$indexSet(0, $name, new Z.ConfiguredValue(value, this.span, null));
+    },
+    $signature: 46
+  };
+  E._EvaluateVisitor__closure3.prototype = {
+    call$1: function(module) {
+      var t1 = this.$this;
+      return t1._async_evaluate$_combineCss$2$clone(module, true).accept$1(t1);
+    },
+    $signature: 165
+  };
+  E._EvaluateVisitor_run_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_EvaluateResult),
+        $async$returnValue, $async$self = this, t1, t2, url, $async$temp1, $async$temp2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node;
+              t2 = t1.span;
+              url = t2 == null ? null : t2.file.url;
+              if (url != null)
+                $async$self.$this._async_evaluate$_activeModules.$indexSet(0, url, null);
+              t2 = $async$self.$this;
+              $async$temp1 = E;
+              $async$temp2 = t2;
+              $async$goto = 3;
+              return P._asyncAwait(t2._async_evaluate$_execute$2($async$self.importer, t1), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = new $async$temp1.EvaluateResult($async$temp2._async_evaluate$_combineCss$1($async$result));
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 216
+  };
+  E._EvaluateVisitor__withWarnCallback_closure0.prototype = {
+    call$2: function(message, deprecation) {
+      var t1 = this.$this,
+        t2 = t1._async_evaluate$_importSpan;
+      return t1._async_evaluate$_warn$3$deprecation(message, t2 == null ? t1._async_evaluate$_callableNode.get$span() : t2, deprecation);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 72
+  };
+  E._EvaluateVisitor__loadModule_closure1.prototype = {
+    call$0: function() {
+      return this.callback.call$1(this.builtInModule);
+    },
+    $signature: 1
+  };
+  E._EvaluateVisitor__loadModule_closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$handler = 1, $async$currentError, $async$next = [], $async$self = this, module, error, error0, error1, error2, message, previousLoad, exception, t1, t2, result, importer, stylesheet, canonicalUrl, t3, $async$exception;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.nodeWithSpan;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate$_loadStylesheet$3$baseUrl(J.toString$0$($async$self.url), t2.get$span(), $async$self.baseUrl), $async$call$0);
+            case 2:
+              // returning from await.
+              result = $async$result;
+              importer = result.item1;
+              stylesheet = result.item2;
+              canonicalUrl = stylesheet.span.file.url;
+              t3 = t1._async_evaluate$_activeModules;
+              if (t3.containsKey$1(canonicalUrl)) {
+                message = $async$self.namesInErrors ? "Module loop: " + H.S($.$get$context().prettyUri$1(canonicalUrl)) + " is already being loaded." : string$.Module;
+                previousLoad = t3.$index(0, canonicalUrl);
+                throw H.wrapException(previousLoad == null ? t1._async_evaluate$_exception$1(message) : t1._async_evaluate$_multiSpanException$3(message, "new load", P.LinkedHashMap_LinkedHashMap$_literal([previousLoad.get$span(), "original load"], type$.legacy_FileSpan, type$.legacy_String)));
+              }
+              t3.$indexSet(0, canonicalUrl, t2);
+              module = null;
+              $async$handler = 3;
+              $async$goto = 6;
+              return P._asyncAwait(t1._async_evaluate$_execute$5$configuration$namesInErrors$nodeWithSpan(importer, stylesheet, $async$self.configuration, $async$self.namesInErrors, t2), $async$call$0);
+            case 6:
+              // returning from await.
+              module = $async$result;
+              $async$next.push(5);
+              // goto finally
+              $async$goto = 4;
+              break;
+            case 3:
+              // uncaught
+              $async$next = [1];
+            case 4:
+              // finally
+              $async$handler = 1;
+              t3.remove$1(0, canonicalUrl);
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 5:
+              // after finally
+              $async$handler = 8;
+              $async$goto = 11;
+              return P._asyncAwait($async$self.callback.call$1(module), $async$call$0);
+            case 11:
+              // returning from await.
+              $async$handler = 1;
+              // goto after finally
+              $async$goto = 10;
+              break;
+            case 8:
+              // catch
+              $async$handler = 7;
+              $async$exception = $async$currentError;
+              t2 = H.unwrapException($async$exception);
+              if (type$.legacy_SassRuntimeException._is(t2))
+                throw $async$exception;
+              else if (t2 instanceof E.MultiSpanSassException) {
+                error = t2;
+                throw H.wrapException(E.MultiSpanSassRuntimeException$(error._span_exception$_message, error.get$span(), error.primaryLabel, error.secondarySpans, t1._async_evaluate$_stackTrace$1(error.get$span())));
+              } else if (t2 instanceof E.SassException) {
+                error0 = t2;
+                throw H.wrapException(t1._async_evaluate$_exception$2(error0._span_exception$_message, error0.get$span()));
+              } else if (t2 instanceof E.MultiSpanSassScriptException) {
+                error1 = t2;
+                throw H.wrapException(t1._async_evaluate$_multiSpanException$3(error1.message, error1.primaryLabel, error1.secondarySpans));
+              } else if (t2 instanceof E.SassScriptException) {
+                error2 = t2;
+                throw H.wrapException(t1._async_evaluate$_exception$1(error2.message));
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 10;
+              break;
+            case 7:
+              // uncaught
+              // goto rethrow
+              $async$goto = 1;
+              break;
+            case 10:
+              // after finally
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+            case 1:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor__execute_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t2, t3, t4, css, t1, oldImporter, oldStylesheet, oldRoot, oldParent, oldEndOfImports, oldOutOfOrderImports, oldExtender, oldStyleRule, oldMediaQueries, oldDeclarationName, oldInUnknownAtRule, oldAtRootExcludingStyleRule, oldInKeyframes, oldConfiguration;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              oldImporter = t1._async_evaluate$_importer;
+              oldStylesheet = t1._async_evaluate$_stylesheet;
+              oldRoot = t1._async_evaluate$_root;
+              oldParent = t1._async_evaluate$_parent;
+              oldEndOfImports = t1._async_evaluate$_endOfImports;
+              oldOutOfOrderImports = t1._async_evaluate$_outOfOrderImports;
+              oldExtender = t1._async_evaluate$_extender;
+              oldStyleRule = t1._async_evaluate$_styleRule;
+              oldMediaQueries = t1._async_evaluate$_mediaQueries;
+              oldDeclarationName = t1._async_evaluate$_declarationName;
+              oldInUnknownAtRule = t1._async_evaluate$_inUnknownAtRule;
+              oldAtRootExcludingStyleRule = t1._async_evaluate$_atRootExcludingStyleRule;
+              oldInKeyframes = t1._async_evaluate$_inKeyframes;
+              oldConfiguration = t1._async_evaluate$_configuration;
+              t1._async_evaluate$_importer = $async$self.importer;
+              t2 = t1._async_evaluate$_stylesheet = $async$self.stylesheet;
+              t3 = t2.span;
+              t1._async_evaluate$_parent = t1._async_evaluate$_root = V.ModifiableCssStylesheet$(t3);
+              t1._async_evaluate$_endOfImports = 0;
+              t1._async_evaluate$_outOfOrderImports = null;
+              t1._async_evaluate$_extender = $async$self.extender;
+              t1._async_evaluate$_declarationName = t1._async_evaluate$_mediaQueries = t1._async_evaluate$_styleRule = null;
+              t1._async_evaluate$_inKeyframes = t1._async_evaluate$_atRootExcludingStyleRule = t1._async_evaluate$_inUnknownAtRule = false;
+              t4 = $async$self.configuration;
+              if (t4 != null)
+                t1._async_evaluate$_configuration = t4;
+              $async$goto = 2;
+              return P._asyncAwait(t1.visitStylesheet$1(t2), $async$call$0);
+            case 2:
+              // returning from await.
+              css = t1._async_evaluate$_outOfOrderImports == null ? t1._async_evaluate$_root : new V.CssStylesheet(new P.UnmodifiableListView(t1._async_evaluate$_addOutOfOrderImports$0(), type$.UnmodifiableListView_legacy_CssNode), t3);
+              $async$self._box_0.css = css;
+              t1._async_evaluate$_importer = oldImporter;
+              t1._async_evaluate$_stylesheet = oldStylesheet;
+              t1._async_evaluate$_root = oldRoot;
+              t1._async_evaluate$_parent = oldParent;
+              t1._async_evaluate$_endOfImports = oldEndOfImports;
+              t1._async_evaluate$_outOfOrderImports = oldOutOfOrderImports;
+              t1._async_evaluate$_extender = oldExtender;
+              t1._async_evaluate$_styleRule = oldStyleRule;
+              t1._async_evaluate$_mediaQueries = oldMediaQueries;
+              t1._async_evaluate$_declarationName = oldDeclarationName;
+              t1._async_evaluate$_inUnknownAtRule = oldInUnknownAtRule;
+              t1._async_evaluate$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+              t1._async_evaluate$_inKeyframes = oldInKeyframes;
+              t1._async_evaluate$_configuration = oldConfiguration;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor__combineCss_closure2.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsCss();
+    },
+    $signature: 94
+  };
+  E._EvaluateVisitor__combineCss_closure3.prototype = {
+    call$1: function(target) {
+      return !this.selectors.contains$1(0, target);
+    },
+    $signature: 18
+  };
+  E._EvaluateVisitor__combineCss_closure4.prototype = {
+    call$1: function(module) {
+      return module.cloneCss$0();
+    },
+    $signature: 140
+  };
+  E._EvaluateVisitor__extendModules_closure1.prototype = {
+    call$1: function(target) {
+      return !this.originalSelectors.contains$1(0, target);
+    },
+    $signature: 18
+  };
+  E._EvaluateVisitor__extendModules_closure2.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extender);
+    },
+    $signature: 210
+  };
+  E._EvaluateVisitor__topologicalModules_visitModule0.prototype = {
+    call$1: function(module) {
+      var t1, t2, t3, _i, upstream;
+      for (t1 = module.get$upstream(), t2 = t1.length, t3 = this.seen, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        upstream = t1[_i];
+        if (upstream.get$transitivelyContainsCss() && t3.add$1(0, upstream))
+          this.call$1(upstream);
+      }
+      this.sorted.addFirst$1(module);
+    },
+    $signature: 165
+  };
+  E._EvaluateVisitor_visitAtRootRule_closure2.prototype = {
+    call$0: function() {
+      return V.AtRootQueryParser$(this.resolved, this.$this._async_evaluate$_logger, null).parse$0();
+    },
+    $signature: 113
+  };
+  E._EvaluateVisitor_visitAtRootRule_closure3.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitAtRootRule_closure4.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 2
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure5.prototype = {
+    call$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, oldParent;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              oldParent = t1._async_evaluate$_parent;
+              t1._async_evaluate$_parent = $async$self.newParent;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate$_environment.scope$1$2$when(callback, $async$self.node.hasDeclarations, type$.void), $async$call$1);
+            case 2:
+              // returning from await.
+              t1._async_evaluate$_parent = oldParent;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure6.prototype = {
+    call$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, oldAtRootExcludingStyleRule;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              oldAtRootExcludingStyleRule = t1._async_evaluate$_atRootExcludingStyleRule;
+              t1._async_evaluate$_atRootExcludingStyleRule = true;
+              $async$goto = 2;
+              return P._asyncAwait($async$self.innerScope.call$1(callback), $async$call$1);
+            case 2:
+              // returning from await.
+              t1._async_evaluate$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure7.prototype = {
+    call$1: function(callback) {
+      return this.$this._async_evaluate$_withMediaQueries$1$2(null, new E._EvaluateVisitor__scopeForAtRoot__closure0(this.innerScope, callback), type$.Null);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor__scopeForAtRoot__closure0.prototype = {
+    call$0: function() {
+      return this.innerScope.call$1(this.callback);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure8.prototype = {
+    call$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, wasInKeyframes;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              wasInKeyframes = t1._async_evaluate$_inKeyframes;
+              t1._async_evaluate$_inKeyframes = false;
+              $async$goto = 2;
+              return P._asyncAwait($async$self.innerScope.call$1(callback), $async$call$1);
+            case 2:
+              // returning from await.
+              t1._async_evaluate$_inKeyframes = wasInKeyframes;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure9.prototype = {
+    call$1: function($parent) {
+      return type$.legacy_CssAtRule._is($parent);
+    },
+    $signature: 205
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure10.prototype = {
+    call$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, wasInUnknownAtRule;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              wasInUnknownAtRule = t1._async_evaluate$_inUnknownAtRule;
+              t1._async_evaluate$_inUnknownAtRule = false;
+              $async$goto = 2;
+              return P._asyncAwait($async$self.innerScope.call$1(callback), $async$call$1);
+            case 2:
+              // returning from await.
+              t1._async_evaluate$_inUnknownAtRule = wasInUnknownAtRule;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor_visitContentRule_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.content.declaration.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 6:
+              // returning from await.
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitDeclaration_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitEachRule_closure2.prototype = {
+    call$1: function(value) {
+      return this.$this._async_evaluate$_environment.setLocalVariable$3(C.JSArray_methods.get$first(this.node.variables), value.withoutSlash$0(), this.nodeWithSpan);
+    },
+    $signature: 68
+  };
+  E._EvaluateVisitor_visitEachRule_closure3.prototype = {
+    call$1: function(value) {
+      return this.$this._async_evaluate$_setMultipleVariables$3(this.node.variables, value, this.nodeWithSpan);
+    },
+    $signature: 68
+  };
+  E._EvaluateVisitor_visitEachRule_closure4.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this;
+      return t1._async_evaluate$_handleReturn$2(_this.list.get$asList(), new E._EvaluateVisitor_visitEachRule__closure0(t1, _this.setVariables, _this.node));
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor_visitEachRule__closure0.prototype = {
+    call$1: function(element) {
+      var t1;
+      this.setVariables.call$1(element);
+      t1 = this.$this;
+      return t1._async_evaluate$_handleReturn$2(this.node.children, new E._EvaluateVisitor_visitEachRule___closure0(t1));
+    },
+    $signature: 224
+  };
+  E._EvaluateVisitor_visitEachRule___closure0.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 81
+  };
+  E._EvaluateVisitor_visitExtendRule_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.targetText;
+      return D.SelectorList_SelectorList$parse(B.trimAscii(t1.get$value(t1), true), false, true, this.$this._async_evaluate$_logger);
+    },
+    $signature: 42
+  };
+  E._EvaluateVisitor_visitAtRule_closure1.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t3, _i, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate$_atRootExcludingStyleRule) || t1._async_evaluate$_inKeyframes ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t3 = t2.length, _i = 0;
+            case 5:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 7;
+                break;
+              }
+              $async$goto = 8;
+              return P._asyncAwait(t2[_i].accept$1(t1), $async$call$0);
+            case 8:
+              // returning from await.
+            case 6:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 7:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 9;
+              return P._asyncAwait(t1._async_evaluate$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitAtRule__closure0(t1, $async$self.node), false, type$.legacy_ModifiableCssStyleRule, type$.Null), $async$call$0);
+            case 9:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitAtRule__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitAtRule_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor_visitForRule_closure4.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassNumber),
+        $async$returnValue, $async$self = this;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self.node.from.accept$1($async$self.$this), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result.assertNumber$0();
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 202
+  };
+  E._EvaluateVisitor_visitForRule_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassNumber),
+        $async$returnValue, $async$self = this;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self.node.to.accept$1($async$self.$this), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result.assertNumber$0();
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 202
+  };
+  E._EvaluateVisitor_visitForRule_closure6.prototype = {
+    call$0: function() {
+      return this.fromNumber.assertInt$0();
+    },
+    $signature: 11
+  };
+  E._EvaluateVisitor_visitForRule_closure7.prototype = {
+    call$0: function() {
+      var t1 = this.fromNumber;
+      return this.toNumber.coerce$2(t1.get$numeratorUnits(), t1.get$denominatorUnits()).assertInt$0();
+    },
+    $signature: 11
+  };
+  E._EvaluateVisitor_visitForRule_closure8.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, i, t3, t4, t5, t6, t7, t8, result, t1, t2, nodeWithSpan;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.node;
+              nodeWithSpan = t1._async_evaluate$_expressionNode$1(t2.from);
+              i = $async$self.from, t3 = $async$self._box_0, t4 = $async$self.direction, t5 = t2.variable, t6 = $async$self.fromNumber, t2 = t2.children;
+            case 3:
+              // for condition
+              if (!(i !== t3.to)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              t7 = t1._async_evaluate$_environment;
+              t8 = t6.get$numeratorUnits();
+              t7.setLocalVariable$3(t5, T.SassNumber_SassNumber$withUnits(i, t6.get$denominatorUnits(), t8), nodeWithSpan);
+              $async$goto = 6;
+              return P._asyncAwait(t1._async_evaluate$_handleReturn$2(t2, new E._EvaluateVisitor_visitForRule__closure0(t1)), $async$call$0);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              if (result != null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              i += t4;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor_visitForRule__closure0.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 81
+  };
+  E._EvaluateVisitor_visitForwardRule_closure1.prototype = {
+    call$1: function(module) {
+      this.$this._async_evaluate$_environment.forwardModule$2(module, this.node);
+    },
+    $signature: 121
+  };
+  E._EvaluateVisitor_visitForwardRule_closure2.prototype = {
+    call$1: function(module) {
+      this.$this._async_evaluate$_environment.forwardModule$2(module, this.node);
+    },
+    $signature: 121
+  };
+  E._EvaluateVisitor__assertConfigurationIsEmpty_closure0.prototype = {
+    call$2: function($name, value) {
+      var t1 = this.only;
+      if (t1 != null && !t1.contains$1(0, $name))
+        return;
+      t1 = this.nameInError ? "$" + H.S($name) + string$.x20was_n : string$.This_v;
+      throw H.wrapException(this.$this._async_evaluate$_exception$2(t1, value.configurationSpan));
+    },
+    $signature: 200
+  };
+  E._EvaluateVisitor_visitIfRule_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      return t1._async_evaluate$_handleReturn$2(this._box_0.clause.children, new E._EvaluateVisitor_visitIfRule__closure0(t1));
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor_visitIfRule__closure0.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 81
+  };
+  E._EvaluateVisitor__visitDynamicImport_closure0.prototype = {
+    call$0: function() {
+      return this.$call$body$_EvaluateVisitor__visitDynamicImport_closure();
+    },
+    $call$body$_EvaluateVisitor__visitDynamicImport_closure: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, previousLoad, oldImporter, oldStylesheet, t4, t5, t6, t7, t8, t9, t10, t11, environment, module, visitor, _box_0, t1, t2, result, importer, stylesheet, url, t3;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              _box_0 = {};
+              t1 = $async$self.$this;
+              t2 = $async$self.$import;
+              $async$goto = 3;
+              return P._asyncAwait(t1._async_evaluate$_loadStylesheet$3$forImport(t2.url, t2.span, true), $async$call$0);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              importer = result.item1;
+              stylesheet = result.item2;
+              url = stylesheet.span.file.url;
+              t3 = t1._async_evaluate$_activeModules;
+              if (t3.containsKey$1(url)) {
+                previousLoad = t3.$index(0, url);
+                throw H.wrapException(previousLoad == null ? t1._async_evaluate$_exception$1("This file is already being loaded.") : t1._async_evaluate$_multiSpanException$3("This file is already being loaded.", "new load", P.LinkedHashMap_LinkedHashMap$_literal([previousLoad.get$span(), "original load"], type$.legacy_FileSpan, type$.legacy_String)));
+              }
+              t3.$indexSet(0, url, t2);
+              t2 = new P.UnmodifiableListView(stylesheet._uses, type$.UnmodifiableListView_legacy_UseRule);
+              if (t2.get$length(t2) === 0) {
+                t2 = new P.UnmodifiableListView(stylesheet._forwards, type$.UnmodifiableListView_legacy_ForwardRule);
+                t2 = t2.get$length(t2) === 0;
+              } else
+                t2 = false;
+              $async$goto = t2 ? 4 : 5;
+              break;
+            case 4:
+              // then
+              oldImporter = t1._async_evaluate$_importer;
+              oldStylesheet = t1._async_evaluate$_stylesheet;
+              t1._async_evaluate$_importer = importer;
+              t1._async_evaluate$_stylesheet = stylesheet;
+              $async$goto = 6;
+              return P._asyncAwait(t1.visitStylesheet$1(stylesheet), $async$call$0);
+            case 6:
+              // returning from await.
+              t1._async_evaluate$_importer = oldImporter;
+              t1._async_evaluate$_stylesheet = oldStylesheet;
+              t3.remove$1(0, url);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 5:
+              // join
+              _box_0.children = null;
+              t2 = t1._async_evaluate$_environment;
+              t4 = type$.legacy_String;
+              t5 = type$.legacy_Module_legacy_AsyncCallable;
+              t6 = type$.legacy_AstNode;
+              t7 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_AsyncCallable);
+              t8 = t2._async_environment$_variables;
+              t8 = H.setRuntimeTypeInfo(t8.slice(0), H._arrayInstanceType(t8));
+              t9 = t2._async_environment$_variableNodes;
+              if (t9 == null)
+                t9 = null;
+              else
+                t9 = H.setRuntimeTypeInfo(t9.slice(0), H._arrayInstanceType(t9));
+              t10 = t2._async_environment$_functions;
+              t10 = H.setRuntimeTypeInfo(t10.slice(0), H._arrayInstanceType(t10));
+              t11 = t2._async_environment$_mixins;
+              t11 = H.setRuntimeTypeInfo(t11.slice(0), H._arrayInstanceType(t11));
+              environment = Q.AsyncEnvironment$_(P.LinkedHashMap_LinkedHashMap$_empty(t4, t5), P.LinkedHashMap_LinkedHashMap$_empty(t4, t6), P.LinkedHashSet_LinkedHashSet$_empty(t5), P.LinkedHashMap_LinkedHashMap$_empty(t5, t6), null, null, null, t7, t8, t9, t10, t11, t2._async_environment$_content);
+              $async$goto = 7;
+              return P._asyncAwait(t1._async_evaluate$_withEnvironment$1$2(environment, new E._EvaluateVisitor__visitDynamicImport__closure0(_box_0, t1, importer, stylesheet, environment), type$.Null), $async$call$0);
+            case 7:
+              // returning from await.
+              module = Q._EnvironmentModule__EnvironmentModule0(environment, new V.CssStylesheet(new P.UnmodifiableListView(C.List_empty0, type$.UnmodifiableListView_legacy_CssNode), Y.SourceFile$decoded(C.List_empty1, "<dummy module>").span$1(0)), C.C_EmptyExtender, environment._async_environment$_forwardedModules);
+              t1._async_evaluate$_environment.importForwards$1(module);
+              $async$goto = module.transitivelyContainsCss ? 8 : 9;
+              break;
+            case 8:
+              // then
+              $async$goto = 10;
+              return P._asyncAwait(t1._async_evaluate$_combineCss$2$clone(module, module.transitivelyContainsExtensions).accept$1(t1), $async$call$0);
+            case 10:
+              // returning from await.
+            case 9:
+              // join
+              visitor = new E._ImportedCssVisitor0(t1);
+              for (t1 = J.get$iterator$ax(_box_0.children); t1.moveNext$0();)
+                t1.get$current(t1).accept$1(visitor);
+              t3.remove$1(0, url);
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor__visitDynamicImport__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t2, t3, t1, oldImporter, oldStylesheet, oldRoot, oldParent, oldEndOfImports, oldOutOfOrderImports, oldConfiguration;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              oldImporter = t1._async_evaluate$_importer;
+              oldStylesheet = t1._async_evaluate$_stylesheet;
+              oldRoot = t1._async_evaluate$_root;
+              oldParent = t1._async_evaluate$_parent;
+              oldEndOfImports = t1._async_evaluate$_endOfImports;
+              oldOutOfOrderImports = t1._async_evaluate$_outOfOrderImports;
+              oldConfiguration = t1._async_evaluate$_configuration;
+              t1._async_evaluate$_importer = $async$self.importer;
+              t2 = t1._async_evaluate$_stylesheet = $async$self.stylesheet;
+              t1._async_evaluate$_parent = t1._async_evaluate$_root = V.ModifiableCssStylesheet$(t2.span);
+              t1._async_evaluate$_endOfImports = 0;
+              t1._async_evaluate$_outOfOrderImports = null;
+              t3 = new P.UnmodifiableListView(t2._forwards, type$.UnmodifiableListView_legacy_ForwardRule);
+              if (!t3.get$isEmpty(t3))
+                t1._async_evaluate$_configuration = $async$self.environment.toImplicitConfiguration$0();
+              $async$goto = 2;
+              return P._asyncAwait(t1.visitStylesheet$1(t2), $async$call$0);
+            case 2:
+              // returning from await.
+              $async$self._box_0.children = t1._async_evaluate$_addOutOfOrderImports$0();
+              t1._async_evaluate$_importer = oldImporter;
+              t1._async_evaluate$_stylesheet = oldStylesheet;
+              t1._async_evaluate$_root = oldRoot;
+              t1._async_evaluate$_parent = oldParent;
+              t1._async_evaluate$_endOfImports = oldEndOfImports;
+              t1._async_evaluate$_outOfOrderImports = oldOutOfOrderImports;
+              t1._async_evaluate$_configuration = oldConfiguration;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitIncludeRule_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._async_evaluate$_environment.getMixin$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 105
+  };
+  E._EvaluateVisitor_visitIncludeRule_closure3.prototype = {
+    call$0: function() {
+      return this.node.get$spanWithoutContent();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 33
+  };
+  E._EvaluateVisitor_visitIncludeRule_closure4.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, t1;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(t1._async_evaluate$_environment.withContent$2($async$self.contentCallable, new E._EvaluateVisitor_visitIncludeRule__closure0(t1, $async$self.mixin, $async$self.nodeWithSpan)), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitIncludeRule__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, t1;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(t1._async_evaluate$_environment.asMixin$1(new E._EvaluateVisitor_visitIncludeRule___closure0(t1, $async$self.mixin, $async$self.nodeWithSpan)), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitIncludeRule___closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, t4, t5, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.mixin.declaration.children, t2 = t1.length, t3 = $async$self.$this, t4 = $async$self.nodeWithSpan, t5 = type$.legacy_Value, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t3._async_evaluate$_addErrorSpan$1$2(t4, new E._EvaluateVisitor_visitIncludeRule____closure0(t3, t1[_i]), t5), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitIncludeRule____closure0.prototype = {
+    call$0: function() {
+      return this.statement.accept$1(this.$this);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor_visitMediaRule_closure1.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.mergedQueries;
+              if (t2 == null)
+                t2 = $async$self.queries;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate$_withMediaQueries$1$2(t2, new E._EvaluateVisitor_visitMediaRule__closure0(t1, $async$self.node), type$.Null), $async$call$0);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitMediaRule__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t3, _i, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate$_atRootExcludingStyleRule) ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t3 = t2.length, _i = 0;
+            case 5:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 7;
+                break;
+              }
+              $async$goto = 8;
+              return P._asyncAwait(t2[_i].accept$1(t1), $async$call$0);
+            case 8:
+              // returning from await.
+            case 6:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 7:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 9;
+              return P._asyncAwait(t1._async_evaluate$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitMediaRule___closure0(t1, $async$self.node), false, type$.legacy_ModifiableCssStyleRule, type$.Null), $async$call$0);
+            case 9:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitMediaRule___closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitMediaRule_closure2.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule._is(node))
+        t1 = this.mergedQueries != null && type$.legacy_CssMediaRule._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor__visitMediaQueries_closure0.prototype = {
+    call$0: function() {
+      return F.MediaQueryParser$(this.resolved, this.$this._async_evaluate$_logger, null).parse$0();
+    },
+    $signature: 114
+  };
+  E._EvaluateVisitor_visitStyleRule_closure6.prototype = {
+    call$0: function() {
+      var t1 = this.selectorText;
+      return E.KeyframeSelectorParser$(t1.get$value(t1), this.$this._async_evaluate$_logger).parse$0();
+    },
+    $signature: 40
+  };
+  E._EvaluateVisitor_visitStyleRule_closure7.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitStyleRule_closure8.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor_visitStyleRule_closure9.prototype = {
+    call$0: function() {
+      var t2, t3,
+        t1 = this.selectorText;
+      t1 = t1.get$value(t1);
+      t2 = this.$this;
+      t3 = !t2._async_evaluate$_stylesheet.plainCss;
+      return D.SelectorList_SelectorList$parse(t1, t3, t3, t2._async_evaluate$_logger);
+    },
+    $signature: 42
+  };
+  E._EvaluateVisitor_visitStyleRule_closure10.prototype = {
+    call$0: function() {
+      var t1 = this._box_0.parsedSelector,
+        t2 = this.$this,
+        t3 = t2._async_evaluate$_styleRule;
+      t3 = t3 == null ? null : t3.originalSelector;
+      return t1.resolveParentSelectors$2$implicitParent(t3, !t2._async_evaluate$_atRootExcludingStyleRule);
+    },
+    $signature: 42
+  };
+  E._EvaluateVisitor_visitStyleRule_closure11.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate$_withStyleRule$1$2($async$self.rule, new E._EvaluateVisitor_visitStyleRule__closure0(t1, $async$self.node), type$.Null), $async$call$0);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitStyleRule__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitStyleRule_closure12.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor_visitSupportsRule_closure1.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t3, _i, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate$_atRootExcludingStyleRule) ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t3 = t2.length, _i = 0;
+            case 5:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 7;
+                break;
+              }
+              $async$goto = 8;
+              return P._asyncAwait(t2[_i].accept$1(t1), $async$call$0);
+            case 8:
+              // returning from await.
+            case 6:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 7:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 9;
+              return P._asyncAwait(t1._async_evaluate$_withParent$2$2(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitSupportsRule__closure0(t1, $async$self.node), type$.legacy_ModifiableCssStyleRule, type$.Null), $async$call$0);
+            case 9:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitSupportsRule__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitSupportsRule_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor_visitVariableDeclaration_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.override;
+      this.$this._async_evaluate$_environment.setVariable$4$global(this.node.name, t1.value, t1.assignmentNode, true);
+    },
+    $signature: 0
+  };
+  E._EvaluateVisitor_visitVariableDeclaration_closure3.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._async_evaluate$_environment.getVariable$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 13
+  };
+  E._EvaluateVisitor_visitVariableDeclaration_closure4.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = this.node;
+      t1._async_evaluate$_environment.setVariable$5$global$namespace(t2.name, this.value, t1._async_evaluate$_expressionNode$1(t2.expression), t2.isGlobal, t2.namespace);
+    },
+    $signature: 0
+  };
+  E._EvaluateVisitor_visitUseRule_closure0.prototype = {
+    call$1: function(module) {
+      var t1 = this.node;
+      this.$this._async_evaluate$_environment.addModule$3$namespace(module, t1, t1.namespace);
+    },
+    $signature: 121
+  };
+  E._EvaluateVisitor_visitWarnRule_closure0.prototype = {
+    call$0: function() {
+      return this.node.expression.accept$1(this.$this);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor_visitWhileRule_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, t3, result;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node, t2 = t1.condition, t3 = $async$self.$this, t1 = t1.children;
+            case 3:
+              // for condition
+              $async$goto = 5;
+              return P._asyncAwait(t2.accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+              if (!$async$result.get$isTruthy()) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(t3._async_evaluate$_handleReturn$2(t1, new E._EvaluateVisitor_visitWhileRule__closure0(t3)), $async$call$0);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              if (result != null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 4:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor_visitWhileRule__closure0.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 81
+  };
+  E._EvaluateVisitor_visitBinaryOperationExpression_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, right, result, t1, t2, left, $async$temp1, $async$temp2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node;
+              t2 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(t1.left.accept$1(t2), $async$call$0);
+            case 3:
+              // returning from await.
+              left = $async$result;
+            case 4:
+              // switch
+              switch (t1.operator) {
+                case C.BinaryOperator_kjl:
+                  // goto case
+                  $async$goto = 6;
+                  break;
+                case C.BinaryOperator_or_or_1:
+                  // goto case
+                  $async$goto = 7;
+                  break;
+                case C.BinaryOperator_and_and_2:
+                  // goto case
+                  $async$goto = 8;
+                  break;
+                case C.BinaryOperator_YlX:
+                  // goto case
+                  $async$goto = 9;
+                  break;
+                case C.BinaryOperator_i5H:
+                  // goto case
+                  $async$goto = 10;
+                  break;
+                case C.BinaryOperator_AcR:
+                  // goto case
+                  $async$goto = 11;
+                  break;
+                case C.BinaryOperator_1da:
+                  // goto case
+                  $async$goto = 12;
+                  break;
+                case C.BinaryOperator_8qt:
+                  // goto case
+                  $async$goto = 13;
+                  break;
+                case C.BinaryOperator_33h:
+                  // goto case
+                  $async$goto = 14;
+                  break;
+                case C.BinaryOperator_AcR0:
+                  // goto case
+                  $async$goto = 15;
+                  break;
+                case C.BinaryOperator_iyO:
+                  // goto case
+                  $async$goto = 16;
+                  break;
+                case C.BinaryOperator_O1M:
+                  // goto case
+                  $async$goto = 17;
+                  break;
+                case C.BinaryOperator_RTB:
+                  // goto case
+                  $async$goto = 18;
+                  break;
+                case C.BinaryOperator_2ad:
+                  // goto case
+                  $async$goto = 19;
+                  break;
+                default:
+                  // goto default
+                  $async$goto = 20;
+                  break;
+              }
+              break;
+            case 6:
+              // case
+              $async$goto = 21;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 21:
+              // returning from await.
+              right = $async$result;
+              left.toString;
+              t1 = N.serializeValue0(left, false, true) + "=";
+              right.toString;
+              $async$returnValue = new D.SassString(t1 + N.serializeValue0(right, false, true), false);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 7:
+              // case
+              $async$goto = left.get$isTruthy() ? 22 : 24;
+              break;
+            case 22:
+              // then
+              $async$result = left;
+              // goto join
+              $async$goto = 23;
+              break;
+            case 24:
+              // else
+              $async$goto = 25;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 25:
+              // returning from await.
+            case 23:
+              // join
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 8:
+              // case
+              $async$goto = left.get$isTruthy() ? 26 : 28;
+              break;
+            case 26:
+              // then
+              $async$goto = 29;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 29:
+              // returning from await.
+              // goto join
+              $async$goto = 27;
+              break;
+            case 28:
+              // else
+              $async$result = left;
+            case 27:
+              // join
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 9:
+              // case
+              $async$temp1 = J;
+              $async$temp2 = left;
+              $async$goto = 30;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 30:
+              // returning from await.
+              $async$returnValue = $async$temp1.$eq$($async$temp2, $async$result) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 10:
+              // case
+              $async$temp1 = J;
+              $async$temp2 = left;
+              $async$goto = 31;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 31:
+              // returning from await.
+              $async$returnValue = !$async$temp1.$eq$($async$temp2, $async$result) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 11:
+              // case
+              $async$temp1 = left;
+              $async$goto = 32;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 32:
+              // returning from await.
+              $async$returnValue = $async$temp1.greaterThan$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 12:
+              // case
+              $async$temp1 = left;
+              $async$goto = 33;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 33:
+              // returning from await.
+              $async$returnValue = $async$temp1.greaterThanOrEquals$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 13:
+              // case
+              $async$temp1 = left;
+              $async$goto = 34;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 34:
+              // returning from await.
+              $async$returnValue = $async$temp1.lessThan$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 14:
+              // case
+              $async$temp1 = left;
+              $async$goto = 35;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 35:
+              // returning from await.
+              $async$returnValue = $async$temp1.lessThanOrEquals$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 15:
+              // case
+              $async$temp1 = left;
+              $async$goto = 36;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 36:
+              // returning from await.
+              $async$returnValue = $async$temp1.plus$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 16:
+              // case
+              $async$temp1 = left;
+              $async$goto = 37;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 37:
+              // returning from await.
+              $async$returnValue = $async$temp1.minus$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 17:
+              // case
+              $async$temp1 = left;
+              $async$goto = 38;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 38:
+              // returning from await.
+              $async$returnValue = $async$temp1.times$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 18:
+              // case
+              $async$goto = 39;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 39:
+              // returning from await.
+              right = $async$result;
+              result = left.dividedBy$1(right);
+              if (t1.allowsSlash && left instanceof T.SassNumber && right instanceof T.SassNumber) {
+                $async$returnValue = type$.legacy_SassNumber._as(result).withSlash$2(left, right);
+                // goto return
+                $async$goto = 1;
+                break;
+              } else {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 19:
+              // case
+              $async$temp1 = left;
+              $async$goto = 40;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 40:
+              // returning from await.
+              $async$returnValue = $async$temp1.modulo$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 20:
+              // default
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 5:
+              // after switch
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor_visitVariableExpression_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._async_evaluate$_environment.getVariable$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 13
+  };
+  E._EvaluateVisitor_visitListExpression_closure0.prototype = {
+    call$1: function(expression) {
+      return expression.accept$1(this.$this);
+    },
+    $signature: 230
+  };
+  E._EvaluateVisitor_visitFunctionExpression_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.node.namespace,
+        t2 = this.plainName;
+      if (t1 == null)
+        t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return this.$this._async_evaluate$_getFunction$2$namespace(t2, t1);
+    },
+    $signature: 105
+  };
+  E._EvaluateVisitor_visitFunctionExpression_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._async_evaluate$_runFunctionCallable$3(t1.$arguments, this._box_0.$function, t1);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor__runUserDefinedCallable_closure0.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = _this.callable;
+      return t1._async_evaluate$_withEnvironment$1$2(t2.environment.closure$0(), new E._EvaluateVisitor__runUserDefinedCallable__closure0(t1, _this.evaluated, t2, _this.nodeWithSpan, _this.run), type$.legacy_Value);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor__runUserDefinedCallable__closure0.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this;
+      return t1._async_evaluate$_environment.scope$1$1(new E._EvaluateVisitor__runUserDefinedCallable___closure0(t1, _this.evaluated, _this.callable, _this.nodeWithSpan, _this.run), type$.legacy_Value);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor__runUserDefinedCallable___closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, declaredArguments, minLength, t8, i, t9, t10, t11, argument, value, t12, rest, argumentList, result, argumentWord, argumentNames, t1, t2, t3, t4, t5, t6, t7;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.evaluated;
+              t3 = t2.positional;
+              t4 = t3.length;
+              t5 = t2.named;
+              t6 = $async$self.callable.declaration.$arguments;
+              t7 = $async$self.nodeWithSpan;
+              t1._async_evaluate$_verifyArguments$4(t4, t5, t6, t7);
+              declaredArguments = t6.$arguments;
+              t4 = declaredArguments.length;
+              minLength = Math.min(t3.length, t4);
+              for (t8 = t1._async_evaluate$_sourceMap, i = 0; i < minLength; ++i) {
+                t9 = t1._async_evaluate$_environment;
+                t10 = declaredArguments[i].name;
+                t11 = t3[i].withoutSlash$0();
+                t9.setLocalVariable$3(t10, t11, t8 ? t2.positionalNodes[i] : null);
+              }
+              i = t3.length;
+            case 3:
+              // for condition
+              if (!(i < t4)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              argument = declaredArguments[i];
+              t9 = argument.name;
+              value = t5.remove$1(0, t9);
+              $async$goto = value == null ? 6 : 7;
+              break;
+            case 6:
+              // then
+              $async$goto = 8;
+              return P._asyncAwait(argument.defaultValue.accept$1(t1), $async$call$0);
+            case 8:
+              // returning from await.
+              value = $async$result;
+            case 7:
+              // join
+              t10 = t1._async_evaluate$_environment;
+              t11 = value.withoutSlash$0();
+              if (t8) {
+                t12 = t2.namedNodes.$index(0, t9);
+                if (t12 == null)
+                  t12 = t1._async_evaluate$_expressionNode$1(argument.defaultValue);
+              } else
+                t12 = null;
+              t10.setLocalVariable$3(t9, t11, t12);
+            case 4:
+              // for update
+              ++i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              t8 = t6.restArgument;
+              if (t8 != null) {
+                rest = t3.length > t4 ? C.JSArray_methods.sublist$1(t3, t4) : C.List_empty5;
+                t2 = t2.separator;
+                argumentList = D.SassArgumentList$(rest, t5, t2 === C.ListSeparator_undecided ? C.ListSeparator_comma : t2);
+                t1._async_evaluate$_environment.setLocalVariable$3(t8, argumentList, t7);
+              } else
+                argumentList = null;
+              $async$goto = 9;
+              return P._asyncAwait($async$self.run.call$0(), $async$call$0);
+            case 9:
+              // returning from await.
+              result = $async$result;
+              if (argumentList == null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              if (t5.get$isEmpty(t5)) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              if (argumentList._wereKeywordsAccessed) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t2 = t5.get$keys(t5);
+              argumentWord = B.pluralize("argument", t2.get$length(t2), null);
+              t5 = t5.get$keys(t5);
+              argumentNames = B.toSentence(H.MappedIterable_MappedIterable(t5, new E._EvaluateVisitor__runUserDefinedCallable____closure0(), H._instanceType(t5)._eval$1("Iterable.E"), type$.legacy_Object), "or");
+              throw H.wrapException(E.MultiSpanSassRuntimeException$("No " + argumentWord + " named " + H.S(argumentNames) + ".", t7.get$span(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([t6.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), t1._async_evaluate$_stackTrace$1(t7.get$span())));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor__runUserDefinedCallable____closure0.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  E._EvaluateVisitor__runFunctionCallable_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value),
+        $async$returnValue, $async$self = this, t1, t2, t3, t4, _i, $returnValue;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.callable.declaration, t2 = t1.children, t3 = t2.length, t4 = $async$self.$this, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(t2[_i].accept$1(t4), $async$call$0);
+            case 6:
+              // returning from await.
+              $returnValue = $async$result;
+              if ($returnValue instanceof F.Value) {
+                $async$returnValue = $returnValue;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              throw H.wrapException(t4._async_evaluate$_exception$2("Function finished without @return.", t1.span));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 30
+  };
+  E._EvaluateVisitor__runBuiltInCallable_closure1.prototype = {
+    call$0: function() {
+      return this.overload.verify$2(this.evaluated.positional.length, this.namedSet);
+    },
+    $signature: 1
+  };
+  E._EvaluateVisitor__runBuiltInCallable_closure2.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  E._EvaluateVisitor__evaluateArguments_closure0.prototype = {
+    call$2: function(key, value) {
+      var t1;
+      this.named.$indexSet(0, key, value);
+      t1 = this.namedNodes;
+      if (t1 != null)
+        t1.$indexSet(0, key, this.restNodeForSpan);
+    },
+    $signature: 80
+  };
+  E._EvaluateVisitor__evaluateMacroArguments_closure3.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression(value, null);
+    },
+    $signature: 47
+  };
+  E._EvaluateVisitor__evaluateMacroArguments_closure4.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression(value, null);
+    },
+    $signature: 47
+  };
+  E._EvaluateVisitor__evaluateMacroArguments_closure5.prototype = {
+    call$2: function(key, value) {
+      this.named.$indexSet(0, key, new F.ValueExpression(value, null));
+    },
+    $signature: 80
+  };
+  E._EvaluateVisitor__evaluateMacroArguments_closure6.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression(value, null);
+    },
+    $signature: 47
+  };
+  E._EvaluateVisitor__addRestMap_closure1.prototype = {
+    call$1: function(value) {
+      return this.T._eval$1("0*")._as(value);
+    },
+    $signature: function() {
+      return this.T._eval$1("0*(Value*)");
+    }
+  };
+  E._EvaluateVisitor__addRestMap_closure2.prototype = {
+    call$2: function(key, value) {
+      var _this = this;
+      if (key instanceof D.SassString)
+        _this.values.$indexSet(0, key.text, _this._box_0.convert.call$1(value));
+      else
+        throw H.wrapException(_this.$this._async_evaluate$_exception$2(string$.Variab_ + H.S(key) + " is not a string in " + _this.map.toString$0(0) + ".", _this.nodeWithSpan.get$span()));
+    },
+    $signature: 46
+  };
+  E._EvaluateVisitor__verifyArguments_closure0.prototype = {
+    call$0: function() {
+      return this.$arguments.verify$2(this.positional, new M.MapKeySet(this.named, type$.MapKeySet_legacy_String));
+    },
+    $signature: 1
+  };
+  E._EvaluateVisitor_visitStringExpression_closure0.prototype = {
+    call$1: function(value) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, t1, result;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (typeof value == "string") {
+                $async$returnValue = value;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              type$.legacy_Expression._as(value);
+              t1 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(value.accept$1(t1), $async$call$1);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$returnValue = result instanceof D.SassString ? result.text : t1._async_evaluate$_serialize$3$quote(result, value, false);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 79
+  };
+  E._EvaluateVisitor_visitCssAtRule_closure1.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssAtRule_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor_visitCssKeyframeBlock_closure1.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssKeyframeBlock_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor_visitCssMediaRule_closure1.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.mergedQueries;
+              if (t2 == null)
+                t2 = $async$self.node.queries;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate$_withMediaQueries$1$2(t2, new E._EvaluateVisitor_visitCssMediaRule__closure0(t1, $async$self.node), type$.Null), $async$call$0);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssMediaRule__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, cur, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate$_atRootExcludingStyleRule) ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t2 = new H.ListIterator(t2, t2.get$length(t2));
+            case 5:
+              // for condition
+              if (!t2.moveNext$0()) {
+                // goto after for
+                $async$goto = 6;
+                break;
+              }
+              cur = t2.__internal$_current;
+              $async$goto = 7;
+              return P._asyncAwait(cur.accept$1(t1), $async$call$0);
+            case 7:
+              // returning from await.
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 6:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 8;
+              return P._asyncAwait(t1._async_evaluate$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitCssMediaRule___closure0(t1, $async$self.node), false, type$.legacy_ModifiableCssStyleRule, type$.Null), $async$call$0);
+            case 8:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssMediaRule___closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssMediaRule_closure2.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule._is(node))
+        t1 = this.mergedQueries != null && type$.legacy_CssMediaRule._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor_visitCssStyleRule_closure1.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate$_withStyleRule$1$2($async$self.rule, new E._EvaluateVisitor_visitCssStyleRule__closure0(t1, $async$self.node), type$.Null), $async$call$0);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssStyleRule__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssStyleRule_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor_visitCssSupportsRule_closure1.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, cur, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate$_atRootExcludingStyleRule) ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t2 = new H.ListIterator(t2, t2.get$length(t2));
+            case 5:
+              // for condition
+              if (!t2.moveNext$0()) {
+                // goto after for
+                $async$goto = 6;
+                break;
+              }
+              cur = t2.__internal$_current;
+              $async$goto = 7;
+              return P._asyncAwait(cur.accept$1(t1), $async$call$0);
+            case 7:
+              // returning from await.
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 6:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 8;
+              return P._asyncAwait(t1._async_evaluate$_withParent$2$2(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitCssSupportsRule__closure0(t1, $async$self.node), type$.legacy_ModifiableCssStyleRule, type$.Null), $async$call$0);
+            case 8:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssSupportsRule__closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssSupportsRule_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._EvaluateVisitor__performInterpolation_closure0.prototype = {
+    call$1: function(value) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, t1, result, t2, t3;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (typeof value == "string") {
+                $async$returnValue = value;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              type$.legacy_Expression._as(value);
+              t1 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(value.accept$1(t1), $async$call$1);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              if ($async$self.warnForColor && result instanceof K.SassColor && $.$get$namesByColor().containsKey$1(result)) {
+                t2 = X.Interpolation$(H.setRuntimeTypeInfo([""], type$.JSArray_legacy_Object), null);
+                t3 = $.$get$namesByColor();
+                t1._async_evaluate$_warn$2(string$.You_pr + H.S(t3.$index(0, result)) + string$.x20in_in + H.S(result) + string$.x2c_whicw + H.S(t3.$index(0, result)) + string$.x22x29__If + new V.BinaryOperationExpression(C.BinaryOperator_AcR0, new D.StringExpression(t2, true), value, false).toString$0(0) + "'.", value.get$span());
+              }
+              $async$returnValue = t1._async_evaluate$_serialize$3$quote(result, value, false);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 79
+  };
+  E._EvaluateVisitor__serialize_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.value;
+      t1.toString;
+      return N.serializeValue0(t1, false, this.quote);
+    },
+    $signature: 12
+  };
+  E._EvaluateVisitor__stackTrace_closure0.prototype = {
+    call$1: function(tuple) {
+      return this.$this._async_evaluate$_stackFrame$2(tuple.item1, tuple.item2.get$span());
+    },
+    $signature: 195
+  };
+  E._ImportedCssVisitor0.prototype = {
+    visitCssAtRule$1: function(node) {
+      var t1 = node.isChildless ? null : new E._ImportedCssVisitor_visitCssAtRule_closure0();
+      this._async_evaluate$_visitor._async_evaluate$_addChild$2$through(node, t1);
+    },
+    visitCssComment$1: function(node) {
+      return this._async_evaluate$_visitor._async_evaluate$_addChild$1(node);
+    },
+    visitCssDeclaration$1: function(node) {
+    },
+    visitCssImport$1: function(node) {
+      var t1 = this._async_evaluate$_visitor,
+        t2 = t1._async_evaluate$_parent,
+        t3 = t1._async_evaluate$_root;
+      if (t2 != t3)
+        t1._async_evaluate$_addChild$1(node);
+      else if (t1._async_evaluate$_endOfImports === J.get$length$asx(t3.children._collection$_source)) {
+        t1._async_evaluate$_addChild$1(node);
+        t1._async_evaluate$_endOfImports = t1._async_evaluate$_endOfImports + 1;
+      } else {
+        t2 = t1._async_evaluate$_outOfOrderImports;
+        (t2 == null ? t1._async_evaluate$_outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport) : t2).push(node);
+      }
+    },
+    visitCssKeyframeBlock$1: function(node) {
+    },
+    visitCssMediaRule$1: function(node) {
+      var t1 = this._async_evaluate$_visitor,
+        t2 = t1._async_evaluate$_mediaQueries;
+      t1._async_evaluate$_addChild$2$through(node, new E._ImportedCssVisitor_visitCssMediaRule_closure0(t2 == null || t1._async_evaluate$_mergeMediaQueries$2(t2, node.queries) != null));
+    },
+    visitCssStyleRule$1: function(node) {
+      return this._async_evaluate$_visitor._async_evaluate$_addChild$2$through(node, new E._ImportedCssVisitor_visitCssStyleRule_closure0());
+    },
+    visitCssStylesheet$1: function(node) {
+      var t1, cur;
+      for (t1 = node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(this);
+      }
+    },
+    visitCssSupportsRule$1: function(node) {
+      return this._async_evaluate$_visitor._async_evaluate$_addChild$2$through(node, new E._ImportedCssVisitor_visitCssSupportsRule_closure0());
+    }
+  };
+  E._ImportedCssVisitor_visitCssAtRule_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._ImportedCssVisitor_visitCssMediaRule_closure0.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule._is(node))
+        t1 = this.hasBeenMerged && type$.legacy_CssMediaRule._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 7
+  };
+  E._ImportedCssVisitor_visitCssStyleRule_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E._ImportedCssVisitor_visitCssSupportsRule_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  E.EvaluateResult.prototype = {};
+  E._ArgumentResults0.prototype = {};
+  V._CloneCssVisitor.prototype = {
+    visitCssAtRule$1: function(node) {
+      var t1 = node.isChildless,
+        rule = U.ModifiableCssAtRule$(node.name, node.span, t1, node.value);
+      return t1 ? rule : this._visitChildren$2(rule, node);
+    },
+    visitCssComment$1: function(node) {
+      return new R.ModifiableCssComment(node.text, node.span);
+    },
+    visitCssDeclaration$1: function(node) {
+      return L.ModifiableCssDeclaration$(node.name, node.value, node.span, node.parsedAsCustomProperty, node.valueSpanForMap);
+    },
+    visitCssImport$1: function(node) {
+      return F.ModifiableCssImport$(node.url, node.span, node.media, node.supports);
+    },
+    visitCssKeyframeBlock$1: function(node) {
+      return this._visitChildren$2(U.ModifiableCssKeyframeBlock$(node.selector, node.span), node);
+    },
+    visitCssMediaRule$1: function(node) {
+      return this._visitChildren$2(G.ModifiableCssMediaRule$(node.queries, node.span), node);
+    },
+    visitCssStyleRule$1: function(node) {
+      var newSelector = this._oldToNewSelectors.$index(0, node.selector);
+      if (newSelector == null)
+        throw H.wrapException(P.StateError$(string$.The_Ex));
+      return this._visitChildren$2(X.ModifiableCssStyleRule$(newSelector, node.span, node.originalSelector), node);
+    },
+    visitCssStylesheet$1: function(node) {
+      return this._visitChildren$2(V.ModifiableCssStylesheet$(node.get$span()), node);
+    },
+    visitCssSupportsRule$1: function(node) {
+      return this._visitChildren$2(B.ModifiableCssSupportsRule$(node.condition, node.span), node);
+    },
+    _visitChildren$1$2: function(newParent, oldParent) {
+      var t1, t2, newChild;
+      for (t1 = J.get$iterator$ax(oldParent.get$children(oldParent)); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        newChild = t2.accept$1(this);
+        newChild.isGroupEnd = t2.get$isGroupEnd();
+        newParent.addChild$1(newChild);
+      }
+      return newParent;
+    },
+    _visitChildren$2: function(newParent, oldParent) {
+      return this._visitChildren$1$2(newParent, oldParent, type$.legacy_ModifiableCssParentNode);
+    }
+  };
+  R.Evaluator.prototype = {};
+  R._EvaluateVisitor.prototype = {
+    _EvaluateVisitor$5$functions$importCache$logger$nodeImporter$sourceMap: function(functions, importCache, logger, nodeImporter, sourceMap) {
+      var t2, cur, _i, metaModule, t3, module, $function, t4, _this = this,
+        _s20_ = "$name, $module: null",
+        _s9_ = "sass:meta",
+        metaFunctions = [Q.BuiltInCallable$function("global-variable-exists", _s20_, new R._EvaluateVisitor_closure(_this), _s9_), Q.BuiltInCallable$function("variable-exists", "$name", new R._EvaluateVisitor_closure0(_this), _s9_), Q.BuiltInCallable$function("function-exists", _s20_, new R._EvaluateVisitor_closure1(_this), _s9_), Q.BuiltInCallable$function("mixin-exists", _s20_, new R._EvaluateVisitor_closure2(_this), _s9_), Q.BuiltInCallable$function("content-exists", "", new R._EvaluateVisitor_closure3(_this), _s9_), Q.BuiltInCallable$function("module-variables", "$module", new R._EvaluateVisitor_closure4(_this), _s9_), Q.BuiltInCallable$function("module-functions", "$module", new R._EvaluateVisitor_closure5(_this), _s9_), Q.BuiltInCallable$function("get-function", "$name, $css: false, $module: null", new R._EvaluateVisitor_closure6(_this), _s9_), Q.BuiltInCallable$function("call", "$function, $args...", new R._EvaluateVisitor_closure7(_this), _s9_)],
+        t1 = type$.JSArray_legacy_BuiltInCallable,
+        metaMixins = H.setRuntimeTypeInfo([Q.BuiltInCallable$mixin("load-css", "$url, $with: null", new R._EvaluateVisitor_closure8(_this), _s9_)], t1);
+      t1 = H.setRuntimeTypeInfo([], t1);
+      for (t2 = $.$get$global(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (_i = 0; _i < 9; ++_i)
+        t1.push(metaFunctions[_i]);
+      metaModule = Q.BuiltInModule$("meta", t1, metaMixins, null, type$.legacy_BuiltInCallable);
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_BuiltInModule_legacy_BuiltInCallable);
+      for (t2 = $.$get$coreModules(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      t1.push(metaModule);
+      t2 = t1.length;
+      t3 = _this._builtInModules;
+      _i = 0;
+      for (; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        module = t1[_i];
+        t3.$indexSet(0, module.url, module);
+      }
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Callable);
+      for (t2 = $.$get$globalFunctions(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (_i = 0; _i < 9; ++_i)
+        t1.push(metaFunctions[_i]);
+      for (t2 = t1.length, t3 = _this._builtInFunctions, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        $function = t1[_i];
+        t4 = $function.get$name($function);
+        t4.toString;
+        t3.$indexSet(0, H.stringReplaceAllUnchecked(t4, "_", "-"), $function);
+      }
+    },
+    run$2: function(_, importer, node) {
+      return this._withWarnCallback$1$1(new R._EvaluateVisitor_run_closure(this, node, importer), type$.legacy_EvaluateResult);
+    },
+    runExpression$2: function(importer, expression) {
+      return this._withWarnCallback$1$1(new R._EvaluateVisitor_runExpression_closure(this, importer, expression), type$.legacy_Value);
+    },
+    runStatement$2: function(importer, statement) {
+      return this._withWarnCallback$1$1(new R._EvaluateVisitor_runStatement_closure(this, importer, statement), type$.void);
+    },
+    _withWarnCallback$1$1: function(callback, $T) {
+      return N.withWarnCallback(new R._EvaluateVisitor__withWarnCallback_closure(this), callback, $T._eval$1("0*"));
+    },
+    _withFakeStylesheet$1$3: function(importer, nodeWithSpan, callback) {
+      var oldStylesheet, t1, _this = this,
+        oldImporter = _this._importer;
+      _this._importer = importer;
+      oldStylesheet = _this._stylesheet;
+      _this._stylesheet = V.Stylesheet$(C.List_empty11, nodeWithSpan.get$span(), false);
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } finally {
+        _this._importer = oldImporter;
+        _this._stylesheet = oldStylesheet;
+      }
+    },
+    _withFakeStylesheet$3: function(importer, nodeWithSpan, callback) {
+      return this._withFakeStylesheet$1$3(importer, nodeWithSpan, callback, type$.dynamic);
+    },
+    _loadModule$7$baseUrl$configuration$namesInErrors: function(url, stackFrame, nodeWithSpan, callback, baseUrl, configuration, namesInErrors) {
+      var t1, _this = this,
+        builtInModule = _this._builtInModules.$index(0, url);
+      if (builtInModule != null) {
+        if (configuration != null && !configuration.isImplicit) {
+          t1 = namesInErrors ? "Built-in module " + H.S(url) + " can't be configured." : "Built-in modules can't be configured.";
+          throw H.wrapException(_this._evaluate$_exception$2(t1, nodeWithSpan.get$span()));
+        }
+        _this._addExceptionSpan$2(nodeWithSpan, new R._EvaluateVisitor__loadModule_closure(callback, builtInModule));
+        return;
+      }
+      _this._withStackFrame$3(stackFrame, nodeWithSpan, new R._EvaluateVisitor__loadModule_closure0(_this, url, nodeWithSpan, baseUrl, namesInErrors, configuration, callback));
+    },
+    _loadModule$5$configuration: function(url, stackFrame, nodeWithSpan, callback, configuration) {
+      return this._loadModule$7$baseUrl$configuration$namesInErrors(url, stackFrame, nodeWithSpan, callback, null, configuration, false);
+    },
+    _loadModule$4: function(url, stackFrame, nodeWithSpan, callback) {
+      return this._loadModule$7$baseUrl$configuration$namesInErrors(url, stackFrame, nodeWithSpan, callback, null, null, false);
+    },
+    _execute$5$configuration$namesInErrors$nodeWithSpan: function(importer, stylesheet, configuration, namesInErrors, nodeWithSpan) {
+      var message, existingNode, environment, extender, module, _this = this, t1 = {},
+        url = stylesheet.span.file.url,
+        t2 = _this._modules,
+        alreadyLoaded = t2.$index(0, url);
+      if (alreadyLoaded != null) {
+        t1 = configuration == null;
+        if (!(t1 ? _this._configuration : configuration).isImplicit) {
+          message = namesInErrors ? H.S($.$get$context().prettyUri$1(url)) + string$.x20was_a : string$.This_mw;
+          existingNode = _this._moduleNodes.$index(0, url);
+          t2 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_FileSpan, type$.legacy_String);
+          if (existingNode != null)
+            t2.$indexSet(0, existingNode.get$span(), "original load");
+          if (t1)
+            t2.$indexSet(0, _this._configuration.nodeWithSpan.get$span(), "configuration");
+          throw H.wrapException(t2.get$isEmpty(t2) ? _this._evaluate$_exception$1(message) : _this._multiSpanException$3(message, "new load", t2));
+        }
+        return alreadyLoaded;
+      }
+      environment = O.Environment$(_this._sourceMap);
+      t1.css = null;
+      extender = F.Extender$();
+      _this._withEnvironment$2(environment, new R._EvaluateVisitor__execute_closure(t1, _this, importer, stylesheet, extender, configuration));
+      module = O._EnvironmentModule__EnvironmentModule(environment, t1.css, extender, environment._forwardedModules);
+      t2.$indexSet(0, url, module);
+      _this._moduleNodes.$indexSet(0, url, nodeWithSpan);
+      return module;
+    },
+    _execute$2: function(importer, stylesheet) {
+      return this._execute$5$configuration$namesInErrors$nodeWithSpan(importer, stylesheet, null, false, null);
+    },
+    _addOutOfOrderImports$0: function() {
+      var t1, statements, _this = this;
+      if (_this._outOfOrderImports == null)
+        return _this._root.children;
+      t1 = new Array(J.get$length$asx(_this._root.children._collection$_source) + _this._outOfOrderImports.length);
+      t1.fixed$length = Array;
+      statements = new G.FixedLengthListBuilder(H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_ModifiableCssNode), type$.FixedLengthListBuilder_legacy_ModifiableCssNode);
+      statements.addRange$3(_this._root.children, 0, _this._endOfImports);
+      statements.addAll$1(0, _this._outOfOrderImports);
+      statements.addRange$2(_this._root.children, _this._endOfImports);
+      return statements.build$0();
+    },
+    _combineCss$2$clone: function(root, clone) {
+      var selectors, unsatisfiedExtension, sortedModules, t1, imports, css, cur, t2, statements, index, _this = this;
+      if (!C.JSArray_methods.any$1(root.get$upstream(), new R._EvaluateVisitor__combineCss_closure())) {
+        selectors = root.get$extender().get$simpleSelectors();
+        unsatisfiedExtension = B.firstOrNull(root.get$extender().extensionsWhereTarget$1(new R._EvaluateVisitor__combineCss_closure0(selectors)));
+        if (unsatisfiedExtension != null)
+          _this._throwForUnsatisfiedExtension$1(unsatisfiedExtension);
+        return root.get$css(root);
+      }
+      sortedModules = _this._topologicalModules$1(root);
+      if (clone) {
+        t1 = sortedModules.$ti._eval$1("MappedListIterable<ListMixin.E,Module<Callable*>*>");
+        sortedModules = P.List_List$from(new H.MappedListIterable(sortedModules, new R._EvaluateVisitor__combineCss_closure1(), t1), true, t1._eval$1("ListIterable.E"));
+      }
+      _this._extendModules$1(sortedModules);
+      t1 = type$.JSArray_legacy_CssNode;
+      imports = H.setRuntimeTypeInfo([], t1);
+      css = H.setRuntimeTypeInfo([], t1);
+      for (t1 = J.get$reversed$ax(sortedModules), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        t2 = cur.get$css(cur);
+        statements = t2.get$children(t2);
+        index = _this._indexAfterImports$1(statements);
+        t2 = J.getInterceptor$ax(statements);
+        C.JSArray_methods.addAll$1(imports, t2.getRange$2(statements, 0, index));
+        C.JSArray_methods.addAll$1(css, t2.getRange$2(statements, index, t2.get$length(statements)));
+      }
+      return new V.CssStylesheet(new P.UnmodifiableListView(C.JSArray_methods.$add(imports, css), type$.UnmodifiableListView_legacy_CssNode), root.get$css(root).get$span());
+    },
+    _combineCss$1: function(root) {
+      return this._combineCss$2$clone(root, false);
+    },
+    _extendModules$1: function(sortedModules) {
+      var t1, t2, originalSelectors, extenders, t3, t4, _i,
+        downstreamExtenders = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Uri, type$.legacy_List_legacy_Extender),
+        unsatisfiedExtensions = new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_Extension);
+      for (t1 = J.get$iterator$ax(sortedModules); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        originalSelectors = t2.get$extender().get$simpleSelectors().toSet$0(0);
+        unsatisfiedExtensions.addAll$1(0, t2.get$extender().extensionsWhereTarget$1(new R._EvaluateVisitor__extendModules_closure(originalSelectors)));
+        extenders = downstreamExtenders.$index(0, t2.get$url());
+        if (extenders != null)
+          t2.get$extender().addExtensions$1(extenders);
+        t3 = t2.get$extender();
+        if (t3.get$isEmpty(t3))
+          continue;
+        for (t3 = t2.get$upstream(), t4 = t3.length, _i = 0; _i < t3.length; t3.length === t4 || (0, H.throwConcurrentModificationError)(t3), ++_i)
+          J.add$1$ax(downstreamExtenders.putIfAbsent$2(t3[_i].get$url(), new R._EvaluateVisitor__extendModules_closure0()), t2.get$extender());
+        unsatisfiedExtensions.removeAll$1(t2.get$extender().extensionsWhereTarget$1(originalSelectors.get$contains(originalSelectors)));
+      }
+      if (unsatisfiedExtensions._collection$_length !== 0)
+        this._throwForUnsatisfiedExtension$1(unsatisfiedExtensions.get$first(unsatisfiedExtensions));
+    },
+    _throwForUnsatisfiedExtension$1: function(extension) {
+      throw H.wrapException(E.SassException$(string$.The_ta + H.S(extension.target) + ' !optional" to avoid this error.', extension.span));
+    },
+    _topologicalModules$1: function(root) {
+      var t1 = type$.legacy_Module_legacy_Callable,
+        sorted = Q.QueueList$(null, t1);
+      new R._EvaluateVisitor__topologicalModules_visitModule(P.LinkedHashSet_LinkedHashSet$_empty(t1), sorted).call$1(root);
+      return sorted;
+    },
+    _indexAfterImports$1: function(statements) {
+      var t1, t2, t3, lastImport, i, statement;
+      for (t1 = J.getInterceptor$asx(statements), t2 = type$.legacy_CssComment, t3 = type$.legacy_CssImport, lastImport = -1, i = 0; i < t1.get$length(statements); ++i) {
+        statement = t1.$index(statements, i);
+        if (t3._is(statement))
+          lastImport = i;
+        else if (!t2._is(statement))
+          break;
+      }
+      return lastImport + 1;
+    },
+    visitStylesheet$1: function(node) {
+      var t1, t2, _i;
+      for (t1 = node.children, t2 = t1.length, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(this);
+      return null;
+    },
+    visitAtRootRule$1: function(node) {
+      var root, innerCopy, outerCopy, cur, copy, _this = this, _null = null,
+        t1 = node.query,
+        query = t1 != null ? _this._adjustParseError$2(t1, new R._EvaluateVisitor_visitAtRootRule_closure(_this, _this._performInterpolation$2$warnForColor(t1, true))) : C.AtRootQuery_UsS,
+        $parent = _this._evaluate$_parent,
+        included = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssParentNode);
+      for (t1 = type$.legacy_CssStylesheet; !t1._is($parent);) {
+        if (!query.excludes$1($parent))
+          included.push($parent);
+        $parent = $parent._parent;
+      }
+      root = _this._trimIncluded$1(included);
+      if (root == _this._evaluate$_parent) {
+        _this._evaluate$_environment.scope$1$2$when(new R._EvaluateVisitor_visitAtRootRule_closure0(_this, node), node.hasDeclarations, type$.Null);
+        return _null;
+      }
+      innerCopy = included.length === 0 ? _null : C.JSArray_methods.get$first(included).copyWithoutChildren$0();
+      for (t1 = H.SubListIterable$(included, 1, _null, type$.legacy_ModifiableCssParentNode), t1 = new H.ListIterator(t1, t1.get$length(t1)), outerCopy = innerCopy; t1.moveNext$0(); outerCopy = copy) {
+        cur = t1.__internal$_current;
+        copy = cur.copyWithoutChildren$0();
+        copy.addChild$1(outerCopy);
+      }
+      if (outerCopy != null)
+        root.addChild$1(outerCopy);
+      _this._scopeForAtRoot$4(node, innerCopy == null ? root : innerCopy, query, included).call$1(new R._EvaluateVisitor_visitAtRootRule_closure1(_this, node));
+      return _null;
+    },
+    _trimIncluded$1: function(nodes) {
+      var $parent, innermostContiguous, i, t2, root,
+        t1 = nodes.length;
+      if (t1 === 0)
+        return this._root;
+      $parent = this._evaluate$_parent;
+      for (innermostContiguous = null, i = 0; i < t1; ++i) {
+        for (; $parent != nodes[i]; innermostContiguous = null)
+          $parent = $parent._parent;
+        if (innermostContiguous == null)
+          innermostContiguous = i;
+        $parent = $parent._parent;
+      }
+      t2 = this._root;
+      if ($parent != t2)
+        return t2;
+      root = nodes[innermostContiguous];
+      C.JSArray_methods.removeRange$2(nodes, innermostContiguous, t1);
+      return root;
+    },
+    _scopeForAtRoot$4: function(node, newParent, query, included) {
+      var _this = this,
+        scope = new R._EvaluateVisitor__scopeForAtRoot_closure(_this, newParent, node),
+        t1 = query._all || query._at_root_query$_rule;
+      if (t1 !== query.include)
+        scope = new R._EvaluateVisitor__scopeForAtRoot_closure0(_this, scope);
+      if (_this._mediaQueries != null && query.excludesName$1("media"))
+        scope = new R._EvaluateVisitor__scopeForAtRoot_closure1(_this, scope);
+      if (_this._inKeyframes && query.excludesName$1("keyframes"))
+        scope = new R._EvaluateVisitor__scopeForAtRoot_closure2(_this, scope);
+      return _this._inUnknownAtRule && !C.JSArray_methods.any$1(included, new R._EvaluateVisitor__scopeForAtRoot_closure3()) ? new R._EvaluateVisitor__scopeForAtRoot_closure4(_this, scope) : scope;
+    },
+    visitContentBlock$1: function(node) {
+      return H.throwExpression(P.UnsupportedError$(string$.Evalua));
+    },
+    visitContentRule$1: function(node) {
+      var $content = this._evaluate$_environment._content;
+      if ($content == null)
+        return null;
+      this._runUserDefinedCallable$4(node.$arguments, $content, node, new R._EvaluateVisitor_visitContentRule_closure(this, $content));
+      return null;
+    },
+    visitDebugRule$1: function(node) {
+      var value = node.expression.accept$1(this),
+        t1 = value instanceof D.SassString ? value.text : J.toString$0$(value);
+      this._evaluate$_logger.debug$2(0, t1, node.span);
+      return null;
+    },
+    visitDeclaration$1: function(node) {
+      var t1, $name, t2, cssValue, t3, oldDeclarationName, _this = this;
+      if (!(_this._styleRule != null && !_this._atRootExcludingStyleRule) && !_this._inUnknownAtRule && !_this._inKeyframes)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Declarm, node.span));
+      t1 = node.name;
+      $name = _this._interpolationToValue$2$warnForColor(t1, true);
+      t2 = _this._declarationName;
+      if (t2 != null)
+        $name = new F.CssValue(t2 + "-" + H.S($name.value), $name.span, type$.CssValue_legacy_String);
+      t2 = node.value;
+      cssValue = t2 == null ? null : new F.CssValue(t2.accept$1(_this), t2.get$span(), type$.CssValue_legacy_Value);
+      if (cssValue != null) {
+        t3 = cssValue.value;
+        t3 = !t3.get$isBlank() || t3.get$asList().length === 0;
+      } else
+        t3 = false;
+      if (t3) {
+        t3 = _this._evaluate$_parent;
+        t1 = C.JSString_methods.startsWith$1(t1.get$initialPlain(), "--");
+        t2 = _this._expressionNode$1(t2);
+        t2 = t2 == null ? null : t2.get$span();
+        t3.addChild$1(L.ModifiableCssDeclaration$($name, cssValue, node.span, t1, t2));
+      } else if (J.startsWith$1$s($name.value, "--") && node.children == null)
+        throw H.wrapException(_this._evaluate$_exception$2("Custom property values may not be empty.", t2.get$span()));
+      if (node.children != null) {
+        oldDeclarationName = _this._declarationName;
+        _this._declarationName = $name.value;
+        _this._evaluate$_environment.scope$1$2$when(new R._EvaluateVisitor_visitDeclaration_closure(_this, node), node.hasDeclarations, type$.Null);
+        _this._declarationName = oldDeclarationName;
+      }
+      return null;
+    },
+    visitEachRule$1: function(node) {
+      var _this = this,
+        t1 = node.list,
+        list = t1.accept$1(_this),
+        nodeWithSpan = _this._expressionNode$1(t1),
+        setVariables = node.variables.length === 1 ? new R._EvaluateVisitor_visitEachRule_closure(_this, node, nodeWithSpan) : new R._EvaluateVisitor_visitEachRule_closure0(_this, node, nodeWithSpan);
+      return _this._evaluate$_environment.scope$1$2$semiGlobal(new R._EvaluateVisitor_visitEachRule_closure1(_this, list, setVariables, node), true, type$.legacy_Value);
+    },
+    _setMultipleVariables$3: function(variables, value, nodeWithSpan) {
+      var i,
+        list = value.get$asList(),
+        t1 = variables.length,
+        minLength = Math.min(t1, list.length);
+      for (i = 0; i < minLength; ++i)
+        this._evaluate$_environment.setLocalVariable$3(variables[i], list[i].withoutSlash$0(), nodeWithSpan);
+      for (i = minLength; i < t1; ++i)
+        this._evaluate$_environment.setLocalVariable$3(variables[i], C.C_SassNull0, nodeWithSpan);
+    },
+    visitErrorRule$1: function(node) {
+      throw H.wrapException(this._evaluate$_exception$2(J.toString$0$(node.expression.accept$1(this)), node.span));
+    },
+    visitExtendRule$1: function(node) {
+      var targetText, t1, t2, t3, _i, t4, _this = this;
+      if (!(_this._styleRule != null && !_this._atRootExcludingStyleRule) || _this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.x40exten, node.span));
+      targetText = _this._interpolationToValue$2$warnForColor(node.selector, true);
+      for (t1 = _this._adjustParseError$2(targetText, new R._EvaluateVisitor_visitExtendRule_closure(_this, targetText)).components, t2 = t1.length, t3 = type$.legacy_CompoundSelector, _i = 0; _i < t2; ++_i) {
+        t4 = t1[_i].components;
+        if (t4.length !== 1 || !(C.JSArray_methods.get$first(t4) instanceof X.CompoundSelector))
+          throw H.wrapException(E.SassFormatException$("complex selectors may not be extended.", targetText.span));
+        t4 = t3._as(C.JSArray_methods.get$first(t4)).components;
+        if (t4.length !== 1)
+          throw H.wrapException(E.SassFormatException$(string$.compou + C.JSArray_methods.join$1(t4, ", ") + string$.x60_inst, targetText.span));
+        _this._extender.addExtension$4(_this._styleRule.selector, C.JSArray_methods.get$first(t4), node, _this._mediaQueries);
+      }
+      return null;
+    },
+    visitAtRule$1: function(node) {
+      var $name, t1, value, wasInKeyframes, wasInUnknownAtRule, _this = this;
+      if (_this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.At_rul, node.span));
+      $name = _this._interpolationToValue$1(node.name);
+      t1 = node.value;
+      value = t1 == null ? null : _this._interpolationToValue$3$trim$warnForColor(t1, true, true);
+      if (node.children == null) {
+        _this._evaluate$_parent.addChild$1(U.ModifiableCssAtRule$($name, node.span, true, value));
+        return null;
+      }
+      wasInKeyframes = _this._inKeyframes;
+      wasInUnknownAtRule = _this._inUnknownAtRule;
+      if (B.unvendor($name.value) === "keyframes")
+        _this._inKeyframes = true;
+      else
+        _this._inUnknownAtRule = true;
+      _this._withParent$2$4$scopeWhen$through(U.ModifiableCssAtRule$($name, node.span, false, value), new R._EvaluateVisitor_visitAtRule_closure(_this, node), node.hasDeclarations, new R._EvaluateVisitor_visitAtRule_closure0(), type$.legacy_ModifiableCssAtRule, type$.Null);
+      _this._inUnknownAtRule = wasInUnknownAtRule;
+      _this._inKeyframes = wasInKeyframes;
+      return null;
+    },
+    visitForRule$1: function(node) {
+      var _this = this, t1 = {},
+        t2 = node.from,
+        fromNumber = _this._addExceptionSpan$2(t2, new R._EvaluateVisitor_visitForRule_closure(_this, node)),
+        t3 = node.to,
+        toNumber = _this._addExceptionSpan$2(t3, new R._EvaluateVisitor_visitForRule_closure0(_this, node)),
+        from = _this._addExceptionSpan$2(t2, new R._EvaluateVisitor_visitForRule_closure1(fromNumber)),
+        to = t1.to = _this._addExceptionSpan$2(t3, new R._EvaluateVisitor_visitForRule_closure2(toNumber, fromNumber)),
+        direction = from > to ? -1 : 1;
+      if (from === (!node.isExclusive ? t1.to = to + direction : to))
+        return null;
+      return _this._evaluate$_environment.scope$1$2$semiGlobal(new R._EvaluateVisitor_visitForRule_closure3(t1, _this, node, from, direction, fromNumber), true, type$.legacy_Value);
+    },
+    visitForwardRule$1: function(node) {
+      var newConfiguration, t4, _i, variable, _this = this,
+        _s8_ = "@forward",
+        oldConfiguration = _this._configuration,
+        adjustedConfiguration = oldConfiguration.throughForward$1(node),
+        t1 = node.configuration,
+        t2 = t1.length,
+        t3 = node.url;
+      if (t2 !== 0) {
+        newConfiguration = _this._addForwardConfiguration$2(adjustedConfiguration, node);
+        _this._loadModule$5$configuration(t3, _s8_, node, new R._EvaluateVisitor_visitForwardRule_closure(_this, node), newConfiguration);
+        t3 = type$.legacy_String;
+        t4 = P.LinkedHashSet_LinkedHashSet(t3);
+        for (_i = 0; _i < t2; ++_i) {
+          variable = t1[_i];
+          if (!variable.isGuarded)
+            t4.add$1(0, variable.name);
+        }
+        _this._removeUsedConfiguration$3$except(adjustedConfiguration, newConfiguration, t4);
+        t3 = P.LinkedHashSet_LinkedHashSet(t3);
+        for (_i = 0; _i < t2; ++_i)
+          t3.add$1(0, t1[_i].name);
+        _this._assertConfigurationIsEmpty$2$only(newConfiguration, t3);
+      } else {
+        _this._configuration = adjustedConfiguration;
+        _this._loadModule$4(t3, _s8_, node, new R._EvaluateVisitor_visitForwardRule_closure0(_this, node));
+        _this._configuration = oldConfiguration;
+      }
+      return null;
+    },
+    _addForwardConfiguration$2: function(configuration, node) {
+      var t2, t3, _i, variable, t4, t5,
+        t1 = configuration._values,
+        newValues = P.LinkedHashMap_LinkedHashMap$of(new P.UnmodifiableMapView(t1, type$.UnmodifiableMapView_of_legacy_String_and_legacy_ConfiguredValue), type$.legacy_String, type$.legacy_ConfiguredValue);
+      for (t2 = node.configuration, t3 = t2.length, _i = 0; _i < t3; ++_i) {
+        variable = t2[_i];
+        if (variable.isGuarded) {
+          t4 = variable.name;
+          t5 = t1.get$isEmpty(t1) ? null : t1.remove$1(0, t4);
+          if (t5 != null && !J.$eq$(t5.value, C.C_SassNull0)) {
+            newValues.$indexSet(0, t4, t5);
+            continue;
+          }
+        }
+        t4 = variable.name;
+        t5 = variable.expression;
+        newValues.$indexSet(0, t4, new Z.ConfiguredValue(t5.accept$1(this).withoutSlash$0(), variable.span, this._expressionNode$1(t5)));
+      }
+      return new A.Configuration(newValues, node, false);
+    },
+    _removeUsedConfiguration$3$except: function(upstream, downstream, except) {
+      var t1, t2, t3, t4, _i, $name;
+      for (t1 = upstream._values, t2 = J.toList$0$ax(t1.get$keys(t1)), t3 = t2.length, t4 = downstream._values, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i) {
+        $name = t2[_i];
+        if (except.contains$1(0, $name))
+          continue;
+        if (!t4.containsKey$1($name))
+          if (!t1.get$isEmpty(t1))
+            t1.remove$1(0, $name);
+      }
+    },
+    _assertConfigurationIsEmpty$3$nameInError$only: function(configuration, nameInError, only) {
+      configuration._values.forEach$1(0, new R._EvaluateVisitor__assertConfigurationIsEmpty_closure(this, only, nameInError));
+    },
+    _assertConfigurationIsEmpty$2$nameInError: function(configuration, nameInError) {
+      return this._assertConfigurationIsEmpty$3$nameInError$only(configuration, nameInError, null);
+    },
+    _assertConfigurationIsEmpty$1: function(configuration) {
+      return this._assertConfigurationIsEmpty$3$nameInError$only(configuration, false, null);
+    },
+    _assertConfigurationIsEmpty$2$only: function(configuration, only) {
+      return this._assertConfigurationIsEmpty$3$nameInError$only(configuration, false, only);
+    },
+    visitFunctionRule$1: function(node) {
+      var t1 = this._evaluate$_environment,
+        t2 = t1.closure$0(),
+        t3 = t1._functions,
+        index = t3.length - 1,
+        t4 = node.name;
+      t1._functionIndices.$indexSet(0, t4, index);
+      J.$indexSet$ax(t3[index], t4, new E.UserDefinedCallable(node, t2, type$.UserDefinedCallable_legacy_Environment));
+      return null;
+    },
+    visitIfRule$1: function(node) {
+      var t1, t2, _i, clauseToCheck, _box_0 = {};
+      _box_0.clause = node.lastClause;
+      for (t1 = node.clauses, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        clauseToCheck = t1[_i];
+        if (clauseToCheck.expression.accept$1(this).get$isTruthy()) {
+          _box_0.clause = clauseToCheck;
+          break;
+        }
+      }
+      t1 = _box_0.clause;
+      if (t1 == null)
+        return null;
+      return this._evaluate$_environment.scope$1$3$semiGlobal$when(new R._EvaluateVisitor_visitIfRule_closure(_box_0, this), true, t1.hasDeclarations, type$.legacy_Value);
+    },
+    visitImportRule$1: function(node) {
+      var t1, t2, t3, t4, t5, t6, _i, $import, t7, result, supports, t8, t9, resolvedSupports, mediaQuery, t10, result0, _this = this, _null = null;
+      for (t1 = node.imports, t2 = t1.length, t3 = type$.legacy_CssMediaQuery, t4 = type$.CssValue_legacy_String, t5 = type$.legacy_StaticImport, t6 = type$.JSArray_legacy_ModifiableCssImport, _i = 0; _i < t2; ++_i) {
+        $import = t1[_i];
+        if ($import instanceof B.DynamicImport)
+          _this._visitDynamicImport$1($import);
+        else {
+          t5._as($import);
+          t7 = $import.url;
+          result = _this._performInterpolation$2$warnForColor(t7, false);
+          supports = $import.supports;
+          if (supports instanceof L.SupportsDeclaration) {
+            t8 = supports.name;
+            t8 = H.S(_this._evaluate$_serialize$3$quote(t8.accept$1(_this), t8, true)) + ": ";
+            t9 = supports.value;
+            resolvedSupports = t8 + H.S(_this._evaluate$_serialize$3$quote(t9.accept$1(_this), t9, true));
+          } else
+            resolvedSupports = supports == null ? _null : _this._visitSupportsCondition$1(supports);
+          t8 = $import.media;
+          mediaQuery = t8 == null ? _null : _this._visitMediaQueries$1(t8);
+          t8 = $import.span;
+          t9 = resolvedSupports == null ? _null : new F.CssValue("supports(" + resolvedSupports + ")", supports.get$span(), t4);
+          if (mediaQuery == null)
+            t10 = _null;
+          else {
+            result0 = P.List_List$from(mediaQuery, false, t3);
+            result0.fixed$length = Array;
+            result0.immutable$list = Array;
+            t10 = result0;
+          }
+          node = new F.ModifiableCssImport(new F.CssValue(result, t7.span, t4), t9, t10, t8);
+          t7 = _this._evaluate$_parent;
+          t8 = _this._root;
+          if (t7 != t8)
+            t7.addChild$1(node);
+          else if (_this._endOfImports === J.get$length$asx(t8.children._collection$_source)) {
+            t7 = _this._root;
+            t7.toString;
+            node._parent = t7;
+            t7 = t7._children;
+            node._indexInParent = t7.length;
+            t7.push(node);
+            _this._endOfImports = _this._endOfImports + 1;
+          } else {
+            t7 = _this._outOfOrderImports;
+            (t7 == null ? _this._outOfOrderImports = H.setRuntimeTypeInfo([], t6) : t7).push(node);
+          }
+        }
+      }
+      return _null;
+    },
+    _visitDynamicImport$1: function($import) {
+      return this._withStackFrame$3("@import", $import, new R._EvaluateVisitor__visitDynamicImport_closure(this, $import));
+    },
+    _loadStylesheet$4$baseUrl$forImport: function(url, span, baseUrl, forImport) {
+      var tuple, error, error0, message, t1, t2, t3, exception, message0, _this = this;
+      try {
+        _this._importSpan = span;
+        t1 = P.Uri_parse(url);
+        t2 = _this._importer;
+        if (baseUrl == null) {
+          t3 = _this._stylesheet;
+          t3 = t3 == null ? null : t3.span;
+          t3 = t3 == null ? null : t3.file.url;
+        } else
+          t3 = baseUrl;
+        tuple = _this._evaluate$_importCache.import$4$baseImporter$baseUrl$forImport(t1, t2, t3, forImport);
+        if (tuple != null)
+          return tuple;
+        if (C.JSString_methods.startsWith$1(url, "package:") && true)
+          throw H.wrapException(string$.x22packa);
+        else
+          throw H.wrapException("Can't find stylesheet to import.");
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassException) {
+          error = t1;
+          t1 = _this._evaluate$_exception$2(error._span_exception$_message, error.get$span());
+          throw H.wrapException(t1);
+        } else {
+          error0 = t1;
+          message = null;
+          try {
+            message = H._asStringS(J.get$message$x(error0));
+          } catch (exception) {
+            H.unwrapException(exception);
+            message0 = J.toString$0$(error0);
+            message = message0;
+          }
+          t1 = _this._evaluate$_exception$1(message);
+          throw H.wrapException(t1);
+        }
+      } finally {
+        _this._importSpan = null;
+      }
+    },
+    _loadStylesheet$3$baseUrl: function(url, span, baseUrl) {
+      return this._loadStylesheet$4$baseUrl$forImport(url, span, baseUrl, false);
+    },
+    _loadStylesheet$3$forImport: function(url, span, forImport) {
+      return this._loadStylesheet$4$baseUrl$forImport(url, span, null, forImport);
+    },
+    visitIncludeRule$1: function(node) {
+      var nodeWithSpan, t1, t2, contentCallable, _this = this,
+        _s37_ = "Mixin doesn't accept a content block.",
+        mixin = _this._addExceptionSpan$2(node, new R._EvaluateVisitor_visitIncludeRule_closure(_this, node));
+      if (mixin == null)
+        throw H.wrapException(_this._evaluate$_exception$2("Undefined mixin.", node.span));
+      nodeWithSpan = new B._FakeAstNode(new R._EvaluateVisitor_visitIncludeRule_closure0(node));
+      if (mixin instanceof Q.BuiltInCallable) {
+        if (node.content != null)
+          throw H.wrapException(_this._evaluate$_exception$2(_s37_, node.span));
+        _this._runBuiltInCallable$3(node.$arguments, mixin, nodeWithSpan);
+      } else if (type$.legacy_UserDefinedCallable_legacy_Environment._is(mixin)) {
+        t1 = node.content;
+        t2 = t1 == null;
+        if (!t2 && !type$.legacy_MixinRule._as(mixin.declaration).hasContent)
+          throw H.wrapException(E.MultiSpanSassRuntimeException$(_s37_, node.get$spanWithoutContent(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([mixin.declaration.$arguments.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), _this._evaluate$_stackTrace$1(node.get$spanWithoutContent())));
+        contentCallable = t2 ? null : new E.UserDefinedCallable(t1, _this._evaluate$_environment.closure$0(), type$.UserDefinedCallable_legacy_Environment);
+        _this._runUserDefinedCallable$4(node.$arguments, mixin, nodeWithSpan, new R._EvaluateVisitor_visitIncludeRule_closure1(_this, contentCallable, mixin, nodeWithSpan));
+      } else
+        throw H.wrapException(P.UnsupportedError$("Unknown callable type " + mixin.toString$0(0) + "."));
+      return null;
+    },
+    visitMixinRule$1: function(node) {
+      var t1 = this._evaluate$_environment,
+        t2 = t1.closure$0(),
+        t3 = t1._mixins,
+        index = t3.length - 1,
+        t4 = node.name;
+      t1._mixinIndices.$indexSet(0, t4, index);
+      J.$indexSet$ax(t3[index], t4, new E.UserDefinedCallable(node, t2, type$.UserDefinedCallable_legacy_Environment));
+      return null;
+    },
+    visitLoudComment$1: function(node) {
+      var t1, t2, _this = this;
+      if (_this._inFunction)
+        return null;
+      t1 = _this._evaluate$_parent;
+      t2 = _this._root;
+      if (t1 == t2 && _this._endOfImports === J.get$length$asx(t2.children._collection$_source))
+        _this._endOfImports = _this._endOfImports + 1;
+      t1 = node.text;
+      _this._evaluate$_parent.addChild$1(new R.ModifiableCssComment(_this._performInterpolation$1(t1), t1.span));
+      return null;
+    },
+    visitMediaRule$1: function(node) {
+      var queries, t1, mergedQueries, _this = this;
+      if (_this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Media_, node.span));
+      queries = _this._visitMediaQueries$1(node.query);
+      t1 = _this._mediaQueries;
+      mergedQueries = t1 == null ? null : _this._mergeMediaQueries$2(t1, queries);
+      t1 = mergedQueries == null;
+      if (!t1 && mergedQueries.length === 0)
+        return null;
+      t1 = t1 ? queries : mergedQueries;
+      _this._withParent$2$4$scopeWhen$through(G.ModifiableCssMediaRule$(t1, node.span), new R._EvaluateVisitor_visitMediaRule_closure(_this, mergedQueries, queries, node), node.hasDeclarations, new R._EvaluateVisitor_visitMediaRule_closure0(mergedQueries), type$.legacy_ModifiableCssMediaRule, type$.Null);
+      return null;
+    },
+    _visitMediaQueries$1: function(interpolation) {
+      return this._adjustParseError$2(interpolation, new R._EvaluateVisitor__visitMediaQueries_closure(this, this._performInterpolation$2$warnForColor(interpolation, true)));
+    },
+    _mergeMediaQueries$2: function(queries1, queries2) {
+      var t1, t2, t3, t4, t5, result,
+        queries = H.setRuntimeTypeInfo([], type$.JSArray_legacy_CssMediaQuery);
+      for (t1 = J.get$iterator$ax(queries1), t2 = J.getInterceptor$ax(queries2), t3 = type$.legacy_MediaQuerySuccessfulMergeResult; t1.moveNext$0();) {
+        t4 = t1.get$current(t1);
+        for (t5 = t2.get$iterator(queries2); t5.moveNext$0();) {
+          result = t4.merge$1(t5.get$current(t5));
+          if (result === C._SingletonCssMediaQueryMergeResult_empty)
+            continue;
+          if (result === C._SingletonCssMediaQueryMergeResult_unrepresentable)
+            return null;
+          queries.push(t3._as(result).query);
+        }
+      }
+      return queries;
+    },
+    visitReturnRule$1: function(node) {
+      return node.expression.accept$1(this);
+    },
+    visitSilentComment$1: function(node) {
+      return null;
+    },
+    visitStyleRule$1: function(node) {
+      var t2, selectorText, parsedSelector, rule, oldAtRootExcludingStyleRule, _this = this, t1 = {};
+      if (_this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Style_, node.span));
+      t2 = node.selector;
+      selectorText = _this._interpolationToValue$3$trim$warnForColor(t2, true, true);
+      if (_this._inKeyframes) {
+        _this._withParent$2$4$scopeWhen$through(U.ModifiableCssKeyframeBlock$(new F.CssValue(P.List_List$unmodifiable(_this._adjustParseError$2(t2, new R._EvaluateVisitor_visitStyleRule_closure(_this, selectorText)), type$.legacy_String), t2.span, type$.CssValue_legacy_List_legacy_String), node.span), new R._EvaluateVisitor_visitStyleRule_closure0(_this, node), node.hasDeclarations, new R._EvaluateVisitor_visitStyleRule_closure1(), type$.legacy_ModifiableCssKeyframeBlock, type$.Null);
+        return null;
+      }
+      t1.parsedSelector = _this._adjustParseError$2(t2, new R._EvaluateVisitor_visitStyleRule_closure2(_this, selectorText));
+      parsedSelector = _this._addExceptionSpan$2(t2, new R._EvaluateVisitor_visitStyleRule_closure3(t1, _this));
+      t1.parsedSelector = parsedSelector;
+      rule = X.ModifiableCssStyleRule$(_this._extender.addSelector$3(parsedSelector, t2.span, _this._mediaQueries), node.span, t1.parsedSelector);
+      oldAtRootExcludingStyleRule = _this._atRootExcludingStyleRule;
+      _this._atRootExcludingStyleRule = false;
+      _this._withParent$2$4$scopeWhen$through(rule, new R._EvaluateVisitor_visitStyleRule_closure4(_this, rule, node), node.hasDeclarations, new R._EvaluateVisitor_visitStyleRule_closure5(), type$.legacy_ModifiableCssStyleRule, type$.Null);
+      _this._atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+      if (!(_this._styleRule != null && !oldAtRootExcludingStyleRule)) {
+        t1 = _this._evaluate$_parent.children;
+        t1 = !t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = _this._evaluate$_parent.children;
+        t1.get$last(t1).isGroupEnd = true;
+      }
+      return null;
+    },
+    visitSupportsRule$1: function(node) {
+      var t1, _this = this;
+      if (_this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Suppor, node.span));
+      t1 = node.condition;
+      _this._withParent$2$4$scopeWhen$through(B.ModifiableCssSupportsRule$(new F.CssValue(_this._visitSupportsCondition$1(t1), t1.get$span(), type$.CssValue_legacy_String), node.span), new R._EvaluateVisitor_visitSupportsRule_closure(_this, node), node.hasDeclarations, new R._EvaluateVisitor_visitSupportsRule_closure0(), type$.legacy_ModifiableCssSupportsRule, type$.Null);
+      return null;
+    },
+    _visitSupportsCondition$1: function(condition) {
+      var t1, t2, _this = this;
+      if (condition instanceof U.SupportsOperation) {
+        t1 = condition.left;
+        t2 = condition.operator;
+        return H.S(_this._parenthesize$2(t1, t2)) + " " + t2 + " " + H.S(_this._parenthesize$2(condition.right, t2));
+      } else if (condition instanceof M.SupportsNegation)
+        return "not " + H.S(_this._parenthesize$1(condition.condition));
+      else if (condition instanceof X.SupportsInterpolation) {
+        t1 = condition.expression;
+        return _this._evaluate$_serialize$3$quote(t1.accept$1(_this), t1, false);
+      } else if (condition instanceof L.SupportsDeclaration) {
+        t1 = condition.name;
+        t1 = "(" + H.S(_this._evaluate$_serialize$3$quote(t1.accept$1(_this), t1, true)) + ": ";
+        t2 = condition.value;
+        return t1 + H.S(_this._evaluate$_serialize$3$quote(t2.accept$1(_this), t2, true)) + ")";
+      } else if (condition instanceof F.SupportsFunction)
+        return _this._performInterpolation$1(condition.name) + "(" + _this._performInterpolation$1(condition.$arguments) + ")";
+      else if (condition instanceof Y.SupportsAnything)
+        return "(" + _this._performInterpolation$1(condition.contents) + ")";
+      else
+        return null;
+    },
+    _parenthesize$2: function(condition, operator) {
+      var t1;
+      if (!(condition instanceof M.SupportsNegation))
+        if (condition instanceof U.SupportsOperation)
+          t1 = operator == null || operator !== condition.operator;
+        else
+          t1 = false;
+      else
+        t1 = true;
+      if (t1)
+        return "(" + H.S(this._visitSupportsCondition$1(condition)) + ")";
+      else
+        return this._visitSupportsCondition$1(condition);
+    },
+    _parenthesize$1: function(condition) {
+      return this._parenthesize$2(condition, null);
+    },
+    visitVariableDeclaration$1: function(node) {
+      var t1, value, t2, _this = this, _null = null;
+      if (node.isGuarded) {
+        if (node.namespace == null && _this._evaluate$_environment._variables.length === 1) {
+          t1 = _this._configuration._values;
+          t1 = t1.get$isEmpty(t1) ? _null : t1.remove$1(0, node.name);
+          if (t1 != null) {
+            _this._addExceptionSpan$2(node, new R._EvaluateVisitor_visitVariableDeclaration_closure(_this, node, t1));
+            return _null;
+          }
+        }
+        value = _this._addExceptionSpan$2(node, new R._EvaluateVisitor_visitVariableDeclaration_closure0(_this, node));
+        if (value != null && !value.$eq(0, C.C_SassNull0))
+          return _null;
+      }
+      if (node.isGlobal && !_this._evaluate$_environment.globalVariableExists$1(node.name)) {
+        t1 = _this._evaluate$_environment._variables.length === 1 ? string$.As_of_S : string$.As_of_C + B.declarationName(node.span) + ": null` at the root of the\nstylesheet.";
+        t2 = node.span;
+        _this._evaluate$_logger.warn$4$deprecation$span$trace(0, t1, true, t2, _this._evaluate$_stackTrace$1(t2));
+      }
+      _this._addExceptionSpan$2(node, new R._EvaluateVisitor_visitVariableDeclaration_closure1(_this, node, node.expression.accept$1(_this).withoutSlash$0()));
+      return _null;
+    },
+    visitUseRule$1: function(node) {
+      var configuration, t3, _i, variable, t4, t5, _this = this,
+        t1 = node.configuration,
+        t2 = t1.length;
+      if (t2 === 0)
+        configuration = C.Configuration_Map_empty_null_true;
+      else {
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_ConfiguredValue);
+        for (_i = 0; _i < t2; ++_i) {
+          variable = t1[_i];
+          t4 = variable.name;
+          t5 = variable.expression;
+          t3.$indexSet(0, t4, new Z.ConfiguredValue(t5.accept$1(_this).withoutSlash$0(), variable.span, _this._expressionNode$1(t5)));
+        }
+        configuration = new A.Configuration(t3, node, false);
+      }
+      _this._loadModule$5$configuration(node.url, "@use", node, new R._EvaluateVisitor_visitUseRule_closure(_this, node), configuration);
+      _this._assertConfigurationIsEmpty$1(configuration);
+      return null;
+    },
+    visitWarnRule$1: function(node) {
+      var _this = this,
+        value = _this._addExceptionSpan$2(node, new R._EvaluateVisitor_visitWarnRule_closure(_this, node)),
+        t1 = value instanceof D.SassString ? value.text : _this._evaluate$_serialize$2(value, node.expression);
+      _this._evaluate$_logger.warn$2$trace(0, t1, _this._evaluate$_stackTrace$1(node.span));
+      return null;
+    },
+    visitWhileRule$1: function(node) {
+      return this._evaluate$_environment.scope$1$3$semiGlobal$when(new R._EvaluateVisitor_visitWhileRule_closure(this, node), true, node.hasDeclarations, type$.legacy_Value);
+    },
+    visitBinaryOperationExpression$1: function(node) {
+      return this._addExceptionSpan$2(node, new R._EvaluateVisitor_visitBinaryOperationExpression_closure(this, node));
+    },
+    visitValueExpression$1: function(node) {
+      return node.value;
+    },
+    visitVariableExpression$1: function(node) {
+      var result = this._addExceptionSpan$2(node, new R._EvaluateVisitor_visitVariableExpression_closure(this, node));
+      if (result != null)
+        return result;
+      throw H.wrapException(this._evaluate$_exception$2("Undefined variable.", node.span));
+    },
+    visitUnaryOperationExpression$1: function(node) {
+      var operand = node.operand.accept$1(this),
+        t1 = node.operator;
+      switch (t1) {
+        case C.UnaryOperator_j2w:
+          return operand.unaryPlus$0();
+        case C.UnaryOperator_U4G:
+          return operand.unaryMinus$0();
+        case C.UnaryOperator_zDx:
+          operand.toString;
+          return new D.SassString("/" + N.serializeValue0(operand, false, true), false);
+        case C.UnaryOperator_not_not:
+          return operand.unaryNot$0();
+        default:
+          throw H.wrapException(P.StateError$("Unknown unary operator " + H.S(t1) + "."));
+      }
+    },
+    visitBooleanExpression$1: function(node) {
+      return node.value ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    visitIfExpression$1: function(node) {
+      var condition, ifTrue, ifFalse, _this = this,
+        pair = _this._evaluateMacroArguments$1(node),
+        positional = pair.item1,
+        named = pair.item2,
+        t1 = J.getInterceptor$asx(positional);
+      _this._verifyArguments$4(t1.get$length(positional), named, $.$get$IfExpression_declaration(), node);
+      condition = t1.get$length(positional) > 0 ? t1.$index(positional, 0) : named.$index(0, "condition");
+      ifTrue = t1.get$length(positional) > 1 ? t1.$index(positional, 1) : named.$index(0, "if-true");
+      ifFalse = t1.get$length(positional) > 2 ? t1.$index(positional, 2) : named.$index(0, "if-false");
+      return (condition.accept$1(_this).get$isTruthy() ? ifTrue : ifFalse).accept$1(_this);
+    },
+    visitNullExpression$1: function(node) {
+      return C.C_SassNull0;
+    },
+    visitNumberExpression$1: function(node) {
+      var t1 = node.value,
+        t2 = node.unit;
+      return t2 == null ? new N.UnitlessSassNumber(t1, null) : new L.SingleUnitSassNumber(t2, t1, null);
+    },
+    visitParenthesizedExpression$1: function(node) {
+      return node.expression.accept$1(this);
+    },
+    visitColorExpression$1: function(node) {
+      return node.value;
+    },
+    visitListExpression$1: function(node) {
+      var t1 = node.contents;
+      return D.SassList$(new H.MappedListIterable(t1, new R._EvaluateVisitor_visitListExpression_closure(this), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Value*>")), node.separator, node.hasBrackets);
+    },
+    visitMapExpression$1: function(node) {
+      var t2, t3, _i, pair, t4, keyValue, valueValue,
+        t1 = type$.legacy_Value,
+        map = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1),
+        keyNodes = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_AstNode);
+      for (t2 = node.pairs, t3 = t2.length, _i = 0; _i < t3; ++_i) {
+        pair = t2[_i];
+        t4 = pair.item1;
+        keyValue = t4.accept$1(this);
+        valueValue = pair.item2.accept$1(this);
+        if (map.containsKey$1(keyValue))
+          throw H.wrapException(E.MultiSpanSassRuntimeException$("Duplicate key.", t4.get$span(), "second key", P.LinkedHashMap_LinkedHashMap$_literal([keyNodes.$index(0, keyValue).get$span(), "first key"], type$.legacy_FileSpan, type$.legacy_String), this._evaluate$_stackTrace$1(t4.get$span())));
+        map.$indexSet(0, keyValue, valueValue);
+        keyNodes.$indexSet(0, keyValue, t4);
+      }
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(map, t1, t1));
+    },
+    visitFunctionExpression$1: function(node) {
+      var oldInFunction, result, _this = this, t1 = {},
+        t2 = node.name,
+        plainName = t2.get$asPlain();
+      t1.$function = null;
+      if ((plainName != null ? t1.$function = _this._addExceptionSpan$2(node, new R._EvaluateVisitor_visitFunctionExpression_closure(_this, node, plainName)) : null) == null) {
+        if (node.namespace != null)
+          throw H.wrapException(_this._evaluate$_exception$2("Undefined function.", node.span));
+        t1.$function = new L.PlainCssCallable(_this._performInterpolation$1(t2));
+      }
+      oldInFunction = _this._inFunction;
+      _this._inFunction = true;
+      result = _this._addErrorSpan$2(node, new R._EvaluateVisitor_visitFunctionExpression_closure0(t1, _this, node));
+      _this._inFunction = oldInFunction;
+      return result;
+    },
+    _getFunction$2$namespace: function($name, namespace) {
+      var local = this._evaluate$_environment.getFunction$2$namespace($name, namespace);
+      if (local != null || namespace != null)
+        return local;
+      return this._builtInFunctions.$index(0, $name);
+    },
+    _runUserDefinedCallable$4: function($arguments, callable, nodeWithSpan, run) {
+      var evaluated = this._evaluateArguments$1($arguments),
+        t1 = callable.declaration.name,
+        $name = t1 == null ? "@content" : t1 + "()";
+      return this._withStackFrame$3($name, nodeWithSpan, new R._EvaluateVisitor__runUserDefinedCallable_closure(this, callable, evaluated, nodeWithSpan, run));
+    },
+    _runFunctionCallable$3: function($arguments, callable, nodeWithSpan) {
+      var result, t1, t2, t3, first, _i, argument, rest, _this = this;
+      if (callable instanceof Q.BuiltInCallable) {
+        result = _this._runBuiltInCallable$3($arguments, callable, nodeWithSpan);
+        if (result == null)
+          throw H.wrapException(_this._evaluate$_exception$2(string$.Custom, nodeWithSpan.get$span()));
+        return result.withoutSlash$0();
+      } else if (type$.legacy_UserDefinedCallable_legacy_Environment._is(callable))
+        return _this._runUserDefinedCallable$4($arguments, callable, nodeWithSpan, new R._EvaluateVisitor__runFunctionCallable_closure(_this, callable)).withoutSlash$0();
+      else if (callable instanceof L.PlainCssCallable) {
+        t1 = $arguments.named;
+        if (t1.get$isNotEmpty(t1) || $arguments.keywordRest != null)
+          throw H.wrapException(_this._evaluate$_exception$2(string$.Plain_, nodeWithSpan.get$span()));
+        t1 = H.S(callable.name) + "(";
+        for (t2 = $arguments.positional, t3 = t2.length, first = true, _i = 0; _i < t3; ++_i) {
+          argument = t2[_i];
+          if (first)
+            first = false;
+          else
+            t1 += ", ";
+          t1 += H.S(_this._evaluate$_serialize$3$quote(argument.accept$1(_this), argument, true));
+        }
+        t2 = $arguments.rest;
+        rest = t2 == null ? null : t2.accept$1(_this);
+        if (rest != null) {
+          if (!first)
+            t1 += ", ";
+          t2 = t1 + H.S(_this._evaluate$_serialize$2(rest, t2));
+          t1 = t2;
+        }
+        t1 += H.Primitives_stringFromCharCode(41);
+        return new D.SassString(t1.charCodeAt(0) == 0 ? t1 : t1, false);
+      } else
+        return null;
+    },
+    _runBuiltInCallable$3: function($arguments, callable, nodeWithSpan) {
+      var callback, result, error, error0, error1, message, namedSet, tuple, overload, declaredArguments, i, t1, argument, t2, t3, rest, argumentList, exception, message0, _this = this,
+        evaluated = _this._evaluateArguments$2$trackSpans($arguments, false),
+        oldCallableNode = _this._callableNode;
+      _this._callableNode = nodeWithSpan;
+      namedSet = new M.MapKeySet(evaluated.named, type$.MapKeySet_legacy_String);
+      tuple = callable.callbackFor$2(evaluated.positional.length, namedSet);
+      overload = tuple.item1;
+      callback = tuple.item2;
+      _this._addExceptionSpan$2(nodeWithSpan, new R._EvaluateVisitor__runBuiltInCallable_closure(overload, evaluated, namedSet));
+      declaredArguments = overload.$arguments;
+      for (i = evaluated.positional.length, t1 = declaredArguments.length; i < t1; ++i) {
+        argument = declaredArguments[i];
+        t2 = evaluated.positional;
+        t3 = evaluated.named.remove$1(0, argument.name);
+        if (t3 == null) {
+          t3 = argument.defaultValue;
+          t3 = t3 == null ? null : t3.accept$1(_this);
+        }
+        t2.push(t3);
+      }
+      if (overload.restArgument != null) {
+        if (evaluated.positional.length > t1) {
+          rest = C.JSArray_methods.sublist$1(evaluated.positional, t1);
+          C.JSArray_methods.removeRange$2(evaluated.positional, t1, evaluated.positional.length);
+        } else
+          rest = C.List_empty5;
+        t1 = evaluated.named;
+        argumentList = D.SassArgumentList$(rest, t1, evaluated.separator === C.ListSeparator_undecided ? C.ListSeparator_comma : evaluated.separator);
+        evaluated.positional.push(argumentList);
+      } else
+        argumentList = null;
+      result = null;
+      try {
+        result = callback.call$1(evaluated.positional);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_SassRuntimeException._is(t1))
+          throw exception;
+        else if (t1 instanceof E.MultiSpanSassScriptException) {
+          error = t1;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, _this._evaluate$_stackTrace$1(nodeWithSpan.get$span())));
+        } else if (t1 instanceof E.MultiSpanSassException) {
+          error0 = t1;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$(error0._span_exception$_message, error0.get$span(), error0.primaryLabel, error0.secondarySpans, _this._evaluate$_stackTrace$1(error0.get$span())));
+        } else {
+          error1 = t1;
+          message = null;
+          try {
+            message = H._asStringS(J.get$message$x(error1));
+          } catch (exception) {
+            H.unwrapException(exception);
+            message0 = J.toString$0$(error1);
+            message = message0;
+          }
+          throw H.wrapException(_this._evaluate$_exception$2(message, nodeWithSpan.get$span()));
+        }
+      }
+      _this._callableNode = oldCallableNode;
+      if (argumentList == null)
+        return result;
+      t1 = evaluated.named;
+      if (t1.get$isEmpty(t1))
+        return result;
+      if (argumentList._wereKeywordsAccessed)
+        return result;
+      t1 = evaluated.named;
+      t1 = t1.get$keys(t1);
+      t1 = "No " + B.pluralize("argument", t1.get$length(t1), null) + " named ";
+      t2 = evaluated.named;
+      throw H.wrapException(E.MultiSpanSassRuntimeException$(t1 + H.S(B.toSentence(t2.get$keys(t2).map$1$1(0, new R._EvaluateVisitor__runBuiltInCallable_closure0(), type$.legacy_Object), "or")) + ".", nodeWithSpan.get$span(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([overload.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), _this._evaluate$_stackTrace$1(nodeWithSpan.get$span())));
+    },
+    _evaluateArguments$2$trackSpans: function($arguments, trackSpans) {
+      var t1, t2, t3, _i, t4, t5, t6, t7, t8, t9, positionalNodes, namedNodes, rest, restNodeForSpan, separator, keywordRest, keywordRestNodeForSpan, _this = this, _null = null;
+      if (trackSpans == null)
+        trackSpans = _this._sourceMap;
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value);
+      for (t2 = $arguments.positional, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t1.push(t2[_i].accept$1(_this));
+      t4 = type$.legacy_String;
+      t5 = type$.legacy_Value;
+      t6 = P.LinkedHashMap_LinkedHashMap$_empty(t4, t5);
+      for (t7 = $arguments.named, t8 = t7.get$entries(t7), t8 = t8.get$iterator(t8); t8.moveNext$0();) {
+        t9 = t8.get$current(t8);
+        t6.$indexSet(0, t9.key, t9.value.accept$1(_this));
+      }
+      if (trackSpans) {
+        t8 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AstNode);
+        for (_i = 0; _i < t3; ++_i)
+          t8.push(_this._expressionNode$1(t2[_i]));
+        positionalNodes = t8;
+      } else
+        positionalNodes = _null;
+      if (trackSpans) {
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode);
+        for (t3 = t7.get$entries(t7), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+          t7 = t3.get$current(t3);
+          t2.$indexSet(0, t7.key, _this._expressionNode$1(t7.value));
+        }
+        namedNodes = t2;
+      } else
+        namedNodes = _null;
+      t2 = $arguments.rest;
+      if (t2 == null)
+        return new R._ArgumentResults(t1, positionalNodes, t6, namedNodes, C.ListSeparator_undecided);
+      rest = t2.accept$1(_this);
+      restNodeForSpan = trackSpans ? _this._expressionNode$1(t2) : _null;
+      if (rest instanceof A.SassMap) {
+        _this._addRestMap$1$3(t6, rest, t2, t5);
+        if (namedNodes != null) {
+          t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode);
+          for (t3 = rest.contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), t7 = type$.legacy_SassString; t3.moveNext$0();)
+            t2.$indexSet(0, t7._as(t3.get$current(t3)).text, restNodeForSpan);
+          namedNodes.addAll$1(0, t2);
+        }
+        separator = C.ListSeparator_undecided;
+      } else if (rest instanceof D.SassList) {
+        t2 = rest._list$_contents;
+        C.JSArray_methods.addAll$1(t1, t2);
+        if (positionalNodes != null)
+          C.JSArray_methods.addAll$1(positionalNodes, P.List_List$filled(t2.length, restNodeForSpan, false, type$.legacy_AstNode));
+        separator = rest.separator;
+        if (rest instanceof D.SassArgumentList) {
+          rest._wereKeywordsAccessed = true;
+          rest._keywords.forEach$1(0, new R._EvaluateVisitor__evaluateArguments_closure(t6, namedNodes, restNodeForSpan));
+        }
+      } else {
+        t1.push(rest);
+        if (positionalNodes != null)
+          positionalNodes.push(restNodeForSpan);
+        separator = C.ListSeparator_undecided;
+      }
+      t2 = $arguments.keywordRest;
+      if (t2 == null)
+        return new R._ArgumentResults(t1, positionalNodes, t6, namedNodes, separator);
+      keywordRest = t2.accept$1(_this);
+      keywordRestNodeForSpan = trackSpans ? _this._expressionNode$1(t2) : _null;
+      if (keywordRest instanceof A.SassMap) {
+        _this._addRestMap$1$3(t6, keywordRest, t2, t5);
+        if (namedNodes != null) {
+          t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode);
+          for (t3 = keywordRest.contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), t4 = type$.legacy_SassString; t3.moveNext$0();)
+            t2.$indexSet(0, t4._as(t3.get$current(t3)).text, keywordRestNodeForSpan);
+          namedNodes.addAll$1(0, t2);
+        }
+        return new R._ArgumentResults(t1, positionalNodes, t6, namedNodes, separator);
+      } else
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Variabs + H.S(keywordRest) + ").", t2.get$span()));
+    },
+    _evaluateArguments$1: function($arguments) {
+      return this._evaluateArguments$2$trackSpans($arguments, null);
+    },
+    _evaluateMacroArguments$1: function(invocation) {
+      var t3, positional, named, rest, keywordRest, _this = this,
+        t1 = invocation.$arguments,
+        t2 = t1.rest;
+      if (t2 == null)
+        return new S.Tuple2(t1.positional, t1.named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression);
+      t3 = t1.positional;
+      positional = H.setRuntimeTypeInfo(t3.slice(0), H._arrayInstanceType(t3)._eval$1("JSArray<1>"));
+      t3 = type$.legacy_Expression;
+      named = P.LinkedHashMap_LinkedHashMap$of(t1.named, type$.legacy_String, t3);
+      rest = t2.accept$1(_this);
+      if (rest instanceof A.SassMap)
+        _this._addRestMap$1$4(named, rest, invocation, new R._EvaluateVisitor__evaluateMacroArguments_closure(), t3);
+      else if (rest instanceof D.SassList) {
+        t2 = rest._list$_contents;
+        C.JSArray_methods.addAll$1(positional, new H.MappedListIterable(t2, new R._EvaluateVisitor__evaluateMacroArguments_closure0(), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Expression*>")));
+        if (rest instanceof D.SassArgumentList) {
+          rest._wereKeywordsAccessed = true;
+          rest._keywords.forEach$1(0, new R._EvaluateVisitor__evaluateMacroArguments_closure1(named));
+        }
+      } else
+        positional.push(new F.ValueExpression(rest, null));
+      t1 = t1.keywordRest;
+      if (t1 == null)
+        return new S.Tuple2(positional, named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression);
+      keywordRest = t1.accept$1(_this);
+      if (keywordRest instanceof A.SassMap) {
+        _this._addRestMap$1$4(named, keywordRest, invocation, new R._EvaluateVisitor__evaluateMacroArguments_closure2(), t3);
+        return new S.Tuple2(positional, named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression);
+      } else
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Variabs + H.S(keywordRest) + ").", invocation.span));
+    },
+    _addRestMap$1$4: function(values, map, nodeWithSpan, convert, $T) {
+      var t1 = {};
+      t1.convert = convert;
+      if (convert == null)
+        t1.convert = new R._EvaluateVisitor__addRestMap_closure($T);
+      map.contents.forEach$1(0, new R._EvaluateVisitor__addRestMap_closure0(t1, this, values, map, nodeWithSpan));
+    },
+    _addRestMap$1$3: function(values, map, nodeWithSpan, $T) {
+      return this._addRestMap$1$4(values, map, nodeWithSpan, null, $T);
+    },
+    _verifyArguments$4: function(positional, named, $arguments, nodeWithSpan) {
+      return this._addExceptionSpan$2(nodeWithSpan, new R._EvaluateVisitor__verifyArguments_closure($arguments, positional, named));
+    },
+    visitSelectorExpression$1: function(node) {
+      var t1 = this._styleRule;
+      if (t1 == null)
+        return C.C_SassNull0;
+      return t1.originalSelector.get$asSassList();
+    },
+    visitStringExpression$1: function(node) {
+      var t1 = node.text.contents;
+      return new D.SassString(new H.MappedListIterable(t1, new R._EvaluateVisitor_visitStringExpression_closure(this), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0), node.hasQuotes);
+    },
+    visitCssAtRule$1: function(node) {
+      var wasInKeyframes, wasInUnknownAtRule, t1, _this = this;
+      if (_this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.At_rul, node.span));
+      if (node.isChildless) {
+        _this._evaluate$_parent.addChild$1(U.ModifiableCssAtRule$(node.name, node.span, true, node.value));
+        return null;
+      }
+      wasInKeyframes = _this._inKeyframes;
+      wasInUnknownAtRule = _this._inUnknownAtRule;
+      t1 = node.name;
+      if (B.unvendor(t1.get$value(t1)) === "keyframes")
+        _this._inKeyframes = true;
+      else
+        _this._inUnknownAtRule = true;
+      _this._withParent$2$4$scopeWhen$through(U.ModifiableCssAtRule$(t1, node.span, false, node.value), new R._EvaluateVisitor_visitCssAtRule_closure(_this, node), false, new R._EvaluateVisitor_visitCssAtRule_closure0(), type$.legacy_ModifiableCssAtRule, type$.Null);
+      _this._inUnknownAtRule = wasInUnknownAtRule;
+      _this._inKeyframes = wasInKeyframes;
+    },
+    visitCssComment$1: function(node) {
+      var _this = this,
+        t1 = _this._evaluate$_parent,
+        t2 = _this._root;
+      if (t1 == t2 && _this._endOfImports === J.get$length$asx(t2.children._collection$_source))
+        _this._endOfImports = _this._endOfImports + 1;
+      _this._evaluate$_parent.addChild$1(new R.ModifiableCssComment(node.text, node.span));
+    },
+    visitCssDeclaration$1: function(node) {
+      var t1 = node.name;
+      this._evaluate$_parent.addChild$1(L.ModifiableCssDeclaration$(t1, node.value, node.span, J.startsWith$1$s(t1.get$value(t1), "--"), node.valueSpanForMap));
+    },
+    visitCssImport$1: function(node) {
+      var _this = this,
+        modifiableNode = F.ModifiableCssImport$(node.url, node.span, node.media, node.supports),
+        t1 = _this._evaluate$_parent,
+        t2 = _this._root;
+      if (t1 != t2)
+        t1.addChild$1(modifiableNode);
+      else if (_this._endOfImports === J.get$length$asx(t2.children._collection$_source)) {
+        _this._root.addChild$1(modifiableNode);
+        _this._endOfImports = _this._endOfImports + 1;
+      } else {
+        t1 = _this._outOfOrderImports;
+        (t1 == null ? _this._outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport) : t1).push(modifiableNode);
+      }
+    },
+    visitCssKeyframeBlock$1: function(node) {
+      this._withParent$2$4$scopeWhen$through(U.ModifiableCssKeyframeBlock$(node.selector, node.span), new R._EvaluateVisitor_visitCssKeyframeBlock_closure(this, node), false, new R._EvaluateVisitor_visitCssKeyframeBlock_closure0(), type$.legacy_ModifiableCssKeyframeBlock, type$.Null);
+    },
+    visitCssMediaRule$1: function(node) {
+      var t1, mergedQueries, _this = this;
+      if (_this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Media_, node.span));
+      t1 = _this._mediaQueries;
+      mergedQueries = t1 == null ? null : _this._mergeMediaQueries$2(t1, node.queries);
+      t1 = mergedQueries == null;
+      if (!t1 && mergedQueries.length === 0)
+        return null;
+      t1 = t1 ? node.queries : mergedQueries;
+      _this._withParent$2$4$scopeWhen$through(G.ModifiableCssMediaRule$(t1, node.span), new R._EvaluateVisitor_visitCssMediaRule_closure(_this, mergedQueries, node), false, new R._EvaluateVisitor_visitCssMediaRule_closure0(mergedQueries), type$.legacy_ModifiableCssMediaRule, type$.Null);
+    },
+    visitCssStyleRule$1: function(node) {
+      var t1, t2, t3, originalSelector, rule, oldAtRootExcludingStyleRule, _this = this;
+      if (_this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Style_, node.span));
+      t1 = node.selector;
+      t2 = t1.value;
+      t3 = _this._styleRule;
+      t3 = t3 == null ? null : t3.originalSelector;
+      originalSelector = t2.resolveParentSelectors$2$implicitParent(t3, !_this._atRootExcludingStyleRule);
+      rule = X.ModifiableCssStyleRule$(_this._extender.addSelector$3(originalSelector, t1.span, _this._mediaQueries), node.span, originalSelector);
+      oldAtRootExcludingStyleRule = _this._atRootExcludingStyleRule;
+      _this._atRootExcludingStyleRule = false;
+      _this._withParent$2$4$scopeWhen$through(rule, new R._EvaluateVisitor_visitCssStyleRule_closure(_this, rule, node), false, new R._EvaluateVisitor_visitCssStyleRule_closure0(), type$.legacy_ModifiableCssStyleRule, type$.Null);
+      _this._atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+      if (!(_this._styleRule != null && !oldAtRootExcludingStyleRule)) {
+        t1 = _this._evaluate$_parent.children;
+        t1 = !t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = _this._evaluate$_parent.children;
+        t1.get$last(t1).isGroupEnd = true;
+      }
+    },
+    visitCssStylesheet$1: function(node) {
+      var t1;
+      for (t1 = J.get$iterator$ax(node.get$children(node)); t1.moveNext$0();)
+        t1.get$current(t1).accept$1(this);
+    },
+    visitCssSupportsRule$1: function(node) {
+      var _this = this;
+      if (_this._declarationName != null)
+        throw H.wrapException(_this._evaluate$_exception$2(string$.Suppor, node.span));
+      _this._withParent$2$4$scopeWhen$through(B.ModifiableCssSupportsRule$(node.condition, node.span), new R._EvaluateVisitor_visitCssSupportsRule_closure(_this, node), false, new R._EvaluateVisitor_visitCssSupportsRule_closure0(), type$.legacy_ModifiableCssSupportsRule, type$.Null);
+    },
+    _handleReturn$1$2: function(list, callback) {
+      var t1, _i, result;
+      for (t1 = list.length, _i = 0; _i < list.length; list.length === t1 || (0, H.throwConcurrentModificationError)(list), ++_i) {
+        result = callback.call$1(list[_i]);
+        if (result != null)
+          return result;
+      }
+      return null;
+    },
+    _handleReturn$2: function(list, callback) {
+      return this._handleReturn$1$2(list, callback, type$.dynamic);
+    },
+    _withEnvironment$1$2: function(environment, callback) {
+      var result,
+        oldEnvironment = this._evaluate$_environment;
+      this._evaluate$_environment = environment;
+      result = callback.call$0();
+      this._evaluate$_environment = oldEnvironment;
+      return result;
+    },
+    _withEnvironment$2: function(environment, callback) {
+      return this._withEnvironment$1$2(environment, callback, type$.dynamic);
+    },
+    _interpolationToValue$3$trim$warnForColor: function(interpolation, trim, warnForColor) {
+      var result = this._performInterpolation$2$warnForColor(interpolation, warnForColor),
+        t1 = trim ? B.trimAscii(result, true) : result;
+      return new F.CssValue(t1, interpolation.span, type$.CssValue_legacy_String);
+    },
+    _interpolationToValue$1: function(interpolation) {
+      return this._interpolationToValue$3$trim$warnForColor(interpolation, false, false);
+    },
+    _interpolationToValue$2$warnForColor: function(interpolation, warnForColor) {
+      return this._interpolationToValue$3$trim$warnForColor(interpolation, false, warnForColor);
+    },
+    _performInterpolation$2$warnForColor: function(interpolation, warnForColor) {
+      var t1 = interpolation.contents;
+      return new H.MappedListIterable(t1, new R._EvaluateVisitor__performInterpolation_closure(this, warnForColor), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0);
+    },
+    _performInterpolation$1: function(interpolation) {
+      return this._performInterpolation$2$warnForColor(interpolation, false);
+    },
+    _evaluate$_serialize$3$quote: function(value, nodeWithSpan, quote) {
+      return this._addExceptionSpan$2(nodeWithSpan, new R._EvaluateVisitor__serialize_closure(value, quote));
+    },
+    _evaluate$_serialize$2: function(value, nodeWithSpan) {
+      return this._evaluate$_serialize$3$quote(value, nodeWithSpan, true);
+    },
+    _expressionNode$1: function(expression) {
+      var t1;
+      if (!this._sourceMap)
+        return null;
+      if (expression instanceof S.VariableExpression) {
+        t1 = this._evaluate$_environment.getVariableNode$2$namespace(expression.name, expression.namespace);
+        return t1 == null ? expression : t1;
+      } else
+        return expression;
+    },
+    _withParent$2$4$scopeWhen$through: function(node, callback, scopeWhen, through, $S, $T) {
+      var oldParent, result, _this = this;
+      _this._addChild$2$through(node, through);
+      oldParent = _this._evaluate$_parent;
+      _this._evaluate$_parent = node;
+      result = _this._evaluate$_environment.scope$1$2$when(callback, scopeWhen, $T._eval$1("0*"));
+      _this._evaluate$_parent = oldParent;
+      return result;
+    },
+    _withParent$2$3$scopeWhen: function(node, callback, scopeWhen, $S, $T) {
+      return this._withParent$2$4$scopeWhen$through(node, callback, scopeWhen, null, $S, $T);
+    },
+    _withParent$2$2: function(node, callback, $S, $T) {
+      return this._withParent$2$4$scopeWhen$through(node, callback, true, null, $S, $T);
+    },
+    _addChild$2$through: function(node, through) {
+      var grandparent,
+        $parent = this._evaluate$_parent;
+      if (through != null) {
+        for (; through.call$1($parent);)
+          $parent = $parent._parent;
+        if ($parent.get$hasFollowingSibling()) {
+          grandparent = $parent._parent;
+          $parent = $parent.copyWithoutChildren$0();
+          grandparent.addChild$1($parent);
+        }
+      }
+      $parent.addChild$1(node);
+    },
+    _addChild$1: function(node) {
+      return this._addChild$2$through(node, null);
+    },
+    _withStyleRule$1$2: function(rule, callback) {
+      var result,
+        oldRule = this._styleRule;
+      this._styleRule = rule;
+      result = callback.call$0();
+      this._styleRule = oldRule;
+      return result;
+    },
+    _withStyleRule$2: function(rule, callback) {
+      return this._withStyleRule$1$2(rule, callback, type$.dynamic);
+    },
+    _withMediaQueries$1$2: function(queries, callback) {
+      var result,
+        oldMediaQueries = this._mediaQueries;
+      this._mediaQueries = queries;
+      result = callback.call$0();
+      this._mediaQueries = oldMediaQueries;
+      return result;
+    },
+    _withMediaQueries$2: function(queries, callback) {
+      return this._withMediaQueries$1$2(queries, callback, type$.dynamic);
+    },
+    _withStackFrame$1$3: function(member, nodeWithSpan, callback) {
+      var oldMember, result, _this = this,
+        t1 = _this._stack;
+      t1.push(new S.Tuple2(_this._member, nodeWithSpan, type$.Tuple2_of_legacy_String_and_legacy_AstNode));
+      oldMember = _this._member;
+      _this._member = member;
+      result = callback.call$0();
+      _this._member = oldMember;
+      t1.pop();
+      return result;
+    },
+    _withStackFrame$3: function(member, nodeWithSpan, callback) {
+      return this._withStackFrame$1$3(member, nodeWithSpan, callback, type$.dynamic);
+    },
+    _stackFrame$2: function(member, span) {
+      var url = span.file.url;
+      return B.frameForSpan(span, member, url != null && this._evaluate$_importCache != null ? this._evaluate$_importCache.humanize$1(url) : url);
+    },
+    _evaluate$_stackTrace$1: function(span) {
+      var t2, cur, _this = this,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Frame);
+      for (t2 = _this._stack, t2 = new H.MappedListIterable(t2, new R._EvaluateVisitor__stackTrace_closure(_this), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Frame*>")), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      if (span != null)
+        t1.push(_this._stackFrame$2(_this._member, span));
+      return new Y.Trace(P.List_List$unmodifiable(new H.ReversedListIterable(t1, type$.ReversedListIterable_legacy_Frame), type$.legacy_Frame), new P._StringStackTrace(null));
+    },
+    _evaluate$_stackTrace$0: function() {
+      return this._evaluate$_stackTrace$1(null);
+    },
+    _warn$3$deprecation: function(message, span, deprecation) {
+      return this._evaluate$_logger.warn$4$deprecation$span$trace(0, message, deprecation, span, this._evaluate$_stackTrace$1(span));
+    },
+    _warn$2: function(message, span) {
+      return this._warn$3$deprecation(message, span, false);
+    },
+    _evaluate$_exception$2: function(message, span) {
+      var t1 = span == null ? C.JSArray_methods.get$last(this._stack).item2.get$span() : span;
+      return new E.SassRuntimeException(this._evaluate$_stackTrace$1(span), message, t1);
+    },
+    _evaluate$_exception$1: function(message) {
+      return this._evaluate$_exception$2(message, null);
+    },
+    _multiSpanException$3: function(message, primaryLabel, secondaryLabels) {
+      var t1 = C.JSArray_methods.get$last(this._stack).item2.get$span();
+      return new E.MultiSpanSassRuntimeException(this._evaluate$_stackTrace$0(), primaryLabel, H.ConstantMap_ConstantMap$from(secondaryLabels, type$.legacy_FileSpan, type$.legacy_String), message, t1);
+    },
+    _adjustParseError$1$2: function(nodeWithSpan, callback) {
+      var error, errorText, span, syntheticFile, syntheticSpan, t1, exception, t2, t3, t4, t5, _null = null;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException) {
+          error = t1;
+          t1 = error;
+          errorText = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(G.SourceSpanException.prototype.get$span.call(t1).file._decodedChars, 0, _null), 0, _null);
+          span = nodeWithSpan.get$span();
+          t1 = span;
+          t2 = span;
+          syntheticFile = C.JSString_methods.replaceRange$3(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(span.file._decodedChars, 0, _null), 0, _null), Y.FileLocation$_(t1.file, t1._file$_start).offset, Y.FileLocation$_(t2.file, t2._end).offset, errorText);
+          t2 = Y.SourceFile$fromString(syntheticFile, span.file.url);
+          t1 = span;
+          t1 = Y.FileLocation$_(t1.file, t1._file$_start);
+          t3 = error;
+          t3 = G.SourceSpanException.prototype.get$span.call(t3);
+          t3 = Y.FileLocation$_(t3.file, t3._file$_start);
+          t4 = span;
+          t4 = Y.FileLocation$_(t4.file, t4._file$_start);
+          t5 = error;
+          t5 = G.SourceSpanException.prototype.get$span.call(t5);
+          syntheticSpan = t2.span$2(t1.offset + t3.offset, t4.offset + Y.FileLocation$_(t5.file, t5._end).offset);
+          throw H.wrapException(this._evaluate$_exception$2(error._span_exception$_message, syntheticSpan));
+        } else
+          throw exception;
+      }
+    },
+    _adjustParseError$2: function(nodeWithSpan, callback) {
+      return this._adjustParseError$1$2(nodeWithSpan, callback, type$.dynamic);
+    },
+    _addExceptionSpan$1$2: function(nodeWithSpan, callback) {
+      var error, error0, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.MultiSpanSassScriptException) {
+          error = t1;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, this._evaluate$_stackTrace$1(nodeWithSpan.get$span())));
+        } else if (t1 instanceof E.SassScriptException) {
+          error0 = t1;
+          throw H.wrapException(this._evaluate$_exception$2(error0.message, nodeWithSpan.get$span()));
+        } else
+          throw exception;
+      }
+    },
+    _addExceptionSpan$2: function(nodeWithSpan, callback) {
+      return this._addExceptionSpan$1$2(nodeWithSpan, callback, type$.dynamic);
+    },
+    _addErrorSpan$1$2: function(nodeWithSpan, callback) {
+      var error, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_SassRuntimeException._is(t1)) {
+          error = t1;
+          t1 = error.get$span();
+          if (!C.JSString_methods.startsWith$1(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1.file._decodedChars, t1._file$_start, t1._end), 0, null), "@error"))
+            throw exception;
+          throw H.wrapException(E.SassRuntimeException$(error._span_exception$_message, nodeWithSpan.get$span(), this._evaluate$_stackTrace$0()));
+        } else
+          throw exception;
+      }
+    },
+    _addErrorSpan$2: function(nodeWithSpan, callback) {
+      return this._addErrorSpan$1$2(nodeWithSpan, callback, type$.dynamic);
+    }
+  };
+  R._EvaluateVisitor_closure.prototype = {
+    call$1: function($arguments) {
+      var module, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this._evaluate$_environment;
+      t2 = variable.text;
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return t1.globalVariableExists$2$namespace(t2, module == null ? null : module.text) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  R._EvaluateVisitor_closure0.prototype = {
+    call$1: function($arguments) {
+      var variable = J.$index$asx($arguments, 0).assertString$1("name"),
+        t1 = this.$this._evaluate$_environment,
+        t2 = variable.text;
+      t2.toString;
+      return t1.getVariable$1(H.stringReplaceAllUnchecked(t2, "_", "-")) != null ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  R._EvaluateVisitor_closure1.prototype = {
+    call$1: function($arguments) {
+      var module, t2, t3, t4,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this;
+      t2 = t1._evaluate$_environment;
+      t3 = variable.text;
+      t3.toString;
+      t4 = H.stringReplaceAllUnchecked(t3, "_", "-");
+      return t2.getFunction$2$namespace(t4, module == null ? null : module.text) != null || t1._builtInFunctions.containsKey$1(t3) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  R._EvaluateVisitor_closure2.prototype = {
+    call$1: function($arguments) {
+      var module, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this._evaluate$_environment;
+      t2 = variable.text;
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return t1.getMixin$2$namespace(t2, module == null ? null : module.text) != null ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  R._EvaluateVisitor_closure3.prototype = {
+    call$1: function($arguments) {
+      var t1 = this.$this._evaluate$_environment;
+      if (!t1._inMixin)
+        throw H.wrapException(E.SassScriptException$(string$.conten));
+      return t1._content != null ? C.SassBoolean_true0 : C.SassBoolean_false0;
+    },
+    $signature: 22
+  };
+  R._EvaluateVisitor_closure4.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.$index$asx($arguments, 0).assertString$1("module").text,
+        module = this.$this._evaluate$_environment._environment$_modules.$index(0, t1);
+      if (module == null)
+        throw H.wrapException('There is no module with namespace "' + H.S(t1) + '".');
+      t1 = type$.legacy_Value;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = module.get$variables(), t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, new D.SassString(t4.key, true), t4.value);
+      }
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 36
+  };
+  R._EvaluateVisitor_closure5.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.$index$asx($arguments, 0).assertString$1("module").text,
+        module = this.$this._evaluate$_environment._environment$_modules.$index(0, t1);
+      if (module == null)
+        throw H.wrapException('There is no module with namespace "' + H.S(t1) + '".');
+      t1 = type$.legacy_Value;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = module.get$functions(module), t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, new D.SassString(t4.key, true), new F.SassFunction(t4.value));
+      }
+      return new A.SassMap(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 36
+  };
+  R._EvaluateVisitor_closure6.prototype = {
+    call$1: function($arguments) {
+      var module, callable,
+        t1 = J.getInterceptor$asx($arguments),
+        $name = t1.$index($arguments, 0).assertString$1("name"),
+        css = t1.$index($arguments, 1).get$isTruthy();
+      t1 = t1.$index($arguments, 2).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      if (css && module != null)
+        throw H.wrapException(string$.x24css_a);
+      if (css)
+        callable = new L.PlainCssCallable($name.text);
+      else {
+        t1 = this.$this;
+        callable = t1._addExceptionSpan$2(t1._callableNode, new R._EvaluateVisitor__closure1(t1, $name, module));
+      }
+      if (callable != null)
+        return new F.SassFunction(callable);
+      throw H.wrapException("Function not found: " + $name.toString$0(0));
+    },
+    $signature: 212
+  };
+  R._EvaluateVisitor__closure1.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this.name.text;
+      t1.toString;
+      t1 = H.stringReplaceAllUnchecked(t1, "_", "-");
+      t2 = this.module;
+      t2 = t2 == null ? null : t2.text;
+      return this.$this._getFunction$2$namespace(t1, t2);
+    },
+    $signature: 118
+  };
+  R._EvaluateVisitor_closure7.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4, t5, t6, t7, t8, t9, t10, invocation, callable,
+        t1 = J.getInterceptor$asx($arguments),
+        $function = t1.$index($arguments, 0),
+        args = type$.legacy_SassArgumentList._as(t1.$index($arguments, 1));
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression);
+      t2 = type$.legacy_String;
+      t3 = type$.legacy_Expression;
+      t4 = this.$this;
+      t5 = t4._callableNode.get$span();
+      t6 = t4._callableNode.get$span();
+      args._wereKeywordsAccessed = true;
+      t7 = args._keywords;
+      if (t7.get$isEmpty(t7))
+        t7 = null;
+      else {
+        t8 = type$.legacy_Value;
+        t9 = P.LinkedHashMap_LinkedHashMap$_empty(t8, t8);
+        for (args._wereKeywordsAccessed = true, t7 = t7.get$entries(t7), t7 = t7.get$iterator(t7); t7.moveNext$0();) {
+          t10 = t7.get$current(t7);
+          t9.$indexSet(0, new D.SassString(t10.key, false), t10.value);
+        }
+        t7 = new F.ValueExpression(new A.SassMap(H.ConstantMap_ConstantMap$from(t9, t8, t8)), t4._callableNode.get$span());
+      }
+      invocation = new X.ArgumentInvocation(P.List_List$unmodifiable(t1, t3), H.ConstantMap_ConstantMap$from(P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), t2, t3), new F.ValueExpression(args, t6), t7, t5);
+      if ($function instanceof D.SassString) {
+        N.warn(string$.Passin + $function.toString$0(0) + ")) instead.", true);
+        return t4.visitFunctionExpression$1(new F.FunctionExpression(null, X.Interpolation$(H.setRuntimeTypeInfo([$function.text], type$.JSArray_legacy_Object), t4._callableNode.get$span()), invocation, t4._callableNode.get$span()));
+      }
+      callable = $function.assertFunction$1("function").callable;
+      if (type$.legacy_Callable._is(callable))
+        return t4._runFunctionCallable$3(invocation, callable, t4._callableNode);
+      else
+        throw H.wrapException(E.SassScriptException$("The function " + H.S(callable.get$name(callable)) + string$.x20is_as));
+    },
+    $signature: 5
+  };
+  R._EvaluateVisitor_closure8.prototype = {
+    call$1: function($arguments) {
+      var withMap, values, configuration, t2, t3, _null = null,
+        t1 = J.getInterceptor$asx($arguments),
+        url = P.Uri_parse(t1.$index($arguments, 0).assertString$1("url").text);
+      t1 = t1.$index($arguments, 1).get$realNull();
+      t1 = t1 == null ? _null : t1.assertMap$1("with");
+      withMap = t1 == null ? _null : t1.contents;
+      if (withMap != null) {
+        values = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_ConfiguredValue);
+        t1 = this.$this;
+        withMap.forEach$1(0, new R._EvaluateVisitor__closure(values, t1._callableNode.get$span()));
+        configuration = new A.Configuration(values, t1._callableNode, false);
+      } else
+        configuration = C.Configuration_Map_empty_null_true;
+      t1 = this.$this;
+      t2 = t1._callableNode;
+      t3 = t2.get$span();
+      t3 = t3 == null ? _null : t3.file.url;
+      t1._loadModule$7$baseUrl$configuration$namesInErrors(url, "load-css()", t2, new R._EvaluateVisitor__closure0(t1), t3, configuration, true);
+      t1._assertConfigurationIsEmpty$2$nameInError(configuration, true);
+      return _null;
+    },
+    $signature: 103
+  };
+  R._EvaluateVisitor__closure.prototype = {
+    call$2: function(variable, value) {
+      var $name,
+        t1 = variable.assertString$1("with key").text;
+      t1.toString;
+      $name = H.stringReplaceAllUnchecked(t1, "_", "-");
+      t1 = this.values;
+      if (t1.containsKey$1($name))
+        throw H.wrapException("The variable $" + $name + " was configured twice.");
+      t1.$indexSet(0, $name, new Z.ConfiguredValue(value, this.span, null));
+    },
+    $signature: 46
+  };
+  R._EvaluateVisitor__closure0.prototype = {
+    call$1: function(module) {
+      var t1 = this.$this;
+      return t1._combineCss$2$clone(module, true).accept$1(t1);
+    },
+    $signature: 193
+  };
+  R._EvaluateVisitor_run_closure.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.node,
+        t2 = t1.span,
+        url = t2 == null ? null : t2.file.url;
+      if (url != null)
+        _this.$this._activeModules.$indexSet(0, url, null);
+      t2 = _this.$this;
+      return new E.EvaluateResult(t2._combineCss$1(t2._execute$2(_this.importer, t1)));
+    },
+    $signature: 237
+  };
+  R._EvaluateVisitor_runExpression_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = this.expression;
+      return t1._withFakeStylesheet$3(this.importer, t2, new R._EvaluateVisitor_runExpression__closure(t1, t2));
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_runExpression__closure.prototype = {
+    call$0: function() {
+      return this.expression.accept$1(this.$this);
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_runStatement_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = this.statement;
+      return t1._withFakeStylesheet$3(this.importer, t2, new R._EvaluateVisitor_runStatement__closure(t1, t2));
+    },
+    $signature: 1
+  };
+  R._EvaluateVisitor_runStatement__closure.prototype = {
+    call$0: function() {
+      return this.statement.accept$1(this.$this);
+    },
+    $signature: 1
+  };
+  R._EvaluateVisitor__withWarnCallback_closure.prototype = {
+    call$2: function(message, deprecation) {
+      var t1 = this.$this,
+        t2 = t1._importSpan;
+      return t1._warn$3$deprecation(message, t2 == null ? t1._callableNode.get$span() : t2, deprecation);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 72
+  };
+  R._EvaluateVisitor__loadModule_closure.prototype = {
+    call$0: function() {
+      return this.callback.call$1(this.builtInModule);
+    },
+    $signature: 1
+  };
+  R._EvaluateVisitor__loadModule_closure0.prototype = {
+    call$0: function() {
+      var module, error, error0, error1, error2, message, previousLoad, exception, _this = this,
+        t1 = _this.$this,
+        t2 = _this.nodeWithSpan,
+        result = t1._loadStylesheet$3$baseUrl(J.toString$0$(_this.url), t2.get$span(), _this.baseUrl),
+        importer = result.item1,
+        stylesheet = result.item2,
+        canonicalUrl = stylesheet.span.file.url,
+        t3 = t1._activeModules;
+      if (t3.containsKey$1(canonicalUrl)) {
+        message = _this.namesInErrors ? "Module loop: " + H.S($.$get$context().prettyUri$1(canonicalUrl)) + " is already being loaded." : string$.Module;
+        previousLoad = t3.$index(0, canonicalUrl);
+        throw H.wrapException(previousLoad == null ? t1._evaluate$_exception$1(message) : t1._multiSpanException$3(message, "new load", P.LinkedHashMap_LinkedHashMap$_literal([previousLoad.get$span(), "original load"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+      t3.$indexSet(0, canonicalUrl, t2);
+      module = null;
+      try {
+        module = t1._execute$5$configuration$namesInErrors$nodeWithSpan(importer, stylesheet, _this.configuration, _this.namesInErrors, t2);
+      } finally {
+        t3.remove$1(0, canonicalUrl);
+      }
+      try {
+        _this.callback.call$1(module);
+      } catch (exception) {
+        t2 = H.unwrapException(exception);
+        if (type$.legacy_SassRuntimeException._is(t2))
+          throw exception;
+        else if (t2 instanceof E.MultiSpanSassException) {
+          error = t2;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$(error._span_exception$_message, error.get$span(), error.primaryLabel, error.secondarySpans, t1._evaluate$_stackTrace$1(error.get$span())));
+        } else if (t2 instanceof E.SassException) {
+          error0 = t2;
+          throw H.wrapException(t1._evaluate$_exception$2(error0._span_exception$_message, error0.get$span()));
+        } else if (t2 instanceof E.MultiSpanSassScriptException) {
+          error1 = t2;
+          throw H.wrapException(t1._multiSpanException$3(error1.message, error1.primaryLabel, error1.secondarySpans));
+        } else if (t2 instanceof E.SassScriptException) {
+          error2 = t2;
+          throw H.wrapException(t1._evaluate$_exception$1(error2.message));
+        } else
+          throw exception;
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor__execute_closure.prototype = {
+    call$0: function() {
+      var t2, t3, t4, css, _this = this,
+        t1 = _this.$this,
+        oldImporter = t1._importer,
+        oldStylesheet = t1._stylesheet,
+        oldRoot = t1._root,
+        oldParent = t1._evaluate$_parent,
+        oldEndOfImports = t1._endOfImports,
+        oldOutOfOrderImports = t1._outOfOrderImports,
+        oldExtender = t1._extender,
+        oldStyleRule = t1._styleRule,
+        oldMediaQueries = t1._mediaQueries,
+        oldDeclarationName = t1._declarationName,
+        oldInUnknownAtRule = t1._inUnknownAtRule,
+        oldAtRootExcludingStyleRule = t1._atRootExcludingStyleRule,
+        oldInKeyframes = t1._inKeyframes,
+        oldConfiguration = t1._configuration;
+      t1._importer = _this.importer;
+      t2 = t1._stylesheet = _this.stylesheet;
+      t3 = t2.span;
+      t1._evaluate$_parent = t1._root = V.ModifiableCssStylesheet$(t3);
+      t1._endOfImports = 0;
+      t1._outOfOrderImports = null;
+      t1._extender = _this.extender;
+      t1._declarationName = t1._mediaQueries = t1._styleRule = null;
+      t1._inKeyframes = t1._atRootExcludingStyleRule = t1._inUnknownAtRule = false;
+      t4 = _this.configuration;
+      if (t4 != null)
+        t1._configuration = t4;
+      t1.visitStylesheet$1(t2);
+      css = t1._outOfOrderImports == null ? t1._root : new V.CssStylesheet(new P.UnmodifiableListView(t1._addOutOfOrderImports$0(), type$.UnmodifiableListView_legacy_CssNode), t3);
+      _this._box_0.css = css;
+      t1._importer = oldImporter;
+      t1._stylesheet = oldStylesheet;
+      t1._root = oldRoot;
+      t1._evaluate$_parent = oldParent;
+      t1._endOfImports = oldEndOfImports;
+      t1._outOfOrderImports = oldOutOfOrderImports;
+      t1._extender = oldExtender;
+      t1._styleRule = oldStyleRule;
+      t1._mediaQueries = oldMediaQueries;
+      t1._declarationName = oldDeclarationName;
+      t1._inUnknownAtRule = oldInUnknownAtRule;
+      t1._atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+      t1._inKeyframes = oldInKeyframes;
+      t1._configuration = oldConfiguration;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor__combineCss_closure.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsCss();
+    },
+    $signature: 122
+  };
+  R._EvaluateVisitor__combineCss_closure0.prototype = {
+    call$1: function(target) {
+      return !this.selectors.contains$1(0, target);
+    },
+    $signature: 18
+  };
+  R._EvaluateVisitor__combineCss_closure1.prototype = {
+    call$1: function(module) {
+      return module.cloneCss$0();
+    },
+    $signature: 127
+  };
+  R._EvaluateVisitor__extendModules_closure.prototype = {
+    call$1: function(target) {
+      return !this.originalSelectors.contains$1(0, target);
+    },
+    $signature: 18
+  };
+  R._EvaluateVisitor__extendModules_closure0.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extender);
+    },
+    $signature: 210
+  };
+  R._EvaluateVisitor__topologicalModules_visitModule.prototype = {
+    call$1: function(module) {
+      var t1, t2, t3, _i, upstream;
+      for (t1 = module.get$upstream(), t2 = t1.length, t3 = this.seen, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        upstream = t1[_i];
+        if (upstream.get$transitivelyContainsCss() && t3.add$1(0, upstream))
+          this.call$1(upstream);
+      }
+      this.sorted.addFirst$1(module);
+    },
+    $signature: 193
+  };
+  R._EvaluateVisitor_visitAtRootRule_closure.prototype = {
+    call$0: function() {
+      return V.AtRootQueryParser$(this.resolved, this.$this._evaluate$_logger, null).parse$0();
+    },
+    $signature: 113
+  };
+  R._EvaluateVisitor_visitAtRootRule_closure0.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitAtRootRule_closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure.prototype = {
+    call$1: function(callback) {
+      var t1 = this.$this,
+        oldParent = t1._evaluate$_parent;
+      t1._evaluate$_parent = this.newParent;
+      t1._evaluate$_environment.scope$1$2$when(callback, this.node.hasDeclarations, type$.void);
+      t1._evaluate$_parent = oldParent;
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure0.prototype = {
+    call$1: function(callback) {
+      var t1 = this.$this,
+        oldAtRootExcludingStyleRule = t1._atRootExcludingStyleRule;
+      t1._atRootExcludingStyleRule = true;
+      this.innerScope.call$1(callback);
+      t1._atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure1.prototype = {
+    call$1: function(callback) {
+      return this.$this._withMediaQueries$2(null, new R._EvaluateVisitor__scopeForAtRoot__closure(this.innerScope, callback));
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor__scopeForAtRoot__closure.prototype = {
+    call$0: function() {
+      return this.innerScope.call$1(this.callback);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure2.prototype = {
+    call$1: function(callback) {
+      var t1 = this.$this,
+        wasInKeyframes = t1._inKeyframes;
+      t1._inKeyframes = false;
+      this.innerScope.call$1(callback);
+      t1._inKeyframes = wasInKeyframes;
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure3.prototype = {
+    call$1: function($parent) {
+      return type$.legacy_CssAtRule._is($parent);
+    },
+    $signature: 205
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure4.prototype = {
+    call$1: function(callback) {
+      var t1 = this.$this,
+        wasInUnknownAtRule = t1._inUnknownAtRule;
+      t1._inUnknownAtRule = false;
+      this.innerScope.call$1(callback);
+      t1._inUnknownAtRule = wasInUnknownAtRule;
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor_visitContentRule_closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.content.declaration.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+      return null;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitDeclaration_closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitEachRule_closure.prototype = {
+    call$1: function(value) {
+      return this.$this._evaluate$_environment.setLocalVariable$3(C.JSArray_methods.get$first(this.node.variables), value.withoutSlash$0(), this.nodeWithSpan);
+    },
+    $signature: 68
+  };
+  R._EvaluateVisitor_visitEachRule_closure0.prototype = {
+    call$1: function(value) {
+      return this.$this._setMultipleVariables$3(this.node.variables, value, this.nodeWithSpan);
+    },
+    $signature: 68
+  };
+  R._EvaluateVisitor_visitEachRule_closure1.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this;
+      return t1._handleReturn$2(_this.list.get$asList(), new R._EvaluateVisitor_visitEachRule__closure(t1, _this.setVariables, _this.node));
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitEachRule__closure.prototype = {
+    call$1: function(element) {
+      var t1;
+      this.setVariables.call$1(element);
+      t1 = this.$this;
+      return t1._handleReturn$2(this.node.children, new R._EvaluateVisitor_visitEachRule___closure(t1));
+    },
+    $signature: 64
+  };
+  R._EvaluateVisitor_visitEachRule___closure.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 61
+  };
+  R._EvaluateVisitor_visitExtendRule_closure.prototype = {
+    call$0: function() {
+      return D.SelectorList_SelectorList$parse(B.trimAscii(this.targetText.value, true), false, true, this.$this._evaluate$_logger);
+    },
+    $signature: 42
+  };
+  R._EvaluateVisitor_visitAtRule_closure.prototype = {
+    call$0: function() {
+      var t3, _i,
+        t1 = this.$this,
+        t2 = t1._styleRule;
+      if (!(t2 != null && !t1._atRootExcludingStyleRule) || t1._inKeyframes)
+        for (t2 = this.node.children, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t2[_i].accept$1(t1);
+      else
+        t1._withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitAtRule__closure(t1, this.node), false, type$.legacy_ModifiableCssStyleRule, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitAtRule__closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitAtRule_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor_visitForRule_closure.prototype = {
+    call$0: function() {
+      return this.node.from.accept$1(this.$this).assertNumber$0();
+    },
+    $signature: 191
+  };
+  R._EvaluateVisitor_visitForRule_closure0.prototype = {
+    call$0: function() {
+      return this.node.to.accept$1(this.$this).assertNumber$0();
+    },
+    $signature: 191
+  };
+  R._EvaluateVisitor_visitForRule_closure1.prototype = {
+    call$0: function() {
+      return this.fromNumber.assertInt$0();
+    },
+    $signature: 11
+  };
+  R._EvaluateVisitor_visitForRule_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.fromNumber;
+      return this.toNumber.coerce$2(t1.get$numeratorUnits(), t1.get$denominatorUnits()).assertInt$0();
+    },
+    $signature: 11
+  };
+  R._EvaluateVisitor_visitForRule_closure3.prototype = {
+    call$0: function() {
+      var i, t3, t4, t5, t6, t7, t8, result, _this = this,
+        t1 = _this.$this,
+        t2 = _this.node,
+        nodeWithSpan = t1._expressionNode$1(t2.from);
+      for (i = _this.from, t3 = _this._box_0, t4 = _this.direction, t5 = t2.variable, t6 = _this.fromNumber, t2 = t2.children; i !== t3.to; i += t4) {
+        t7 = t1._evaluate$_environment;
+        t8 = t6.get$numeratorUnits();
+        t7.setLocalVariable$3(t5, T.SassNumber_SassNumber$withUnits(i, t6.get$denominatorUnits(), t8), nodeWithSpan);
+        result = t1._handleReturn$2(t2, new R._EvaluateVisitor_visitForRule__closure(t1));
+        if (result != null)
+          return result;
+      }
+      return null;
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitForRule__closure.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 61
+  };
+  R._EvaluateVisitor_visitForwardRule_closure.prototype = {
+    call$1: function(module) {
+      this.$this._evaluate$_environment.forwardModule$2(module, this.node);
+    },
+    $signature: 117
+  };
+  R._EvaluateVisitor_visitForwardRule_closure0.prototype = {
+    call$1: function(module) {
+      this.$this._evaluate$_environment.forwardModule$2(module, this.node);
+    },
+    $signature: 117
+  };
+  R._EvaluateVisitor__assertConfigurationIsEmpty_closure.prototype = {
+    call$2: function($name, value) {
+      var t1 = this.only;
+      if (t1 != null && !t1.contains$1(0, $name))
+        return;
+      t1 = this.nameInError ? "$" + H.S($name) + string$.x20was_n : string$.This_v;
+      throw H.wrapException(this.$this._evaluate$_exception$2(t1, value.configurationSpan));
+    },
+    $signature: 200
+  };
+  R._EvaluateVisitor_visitIfRule_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      return t1._handleReturn$2(this._box_0.clause.children, new R._EvaluateVisitor_visitIfRule__closure(t1));
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitIfRule__closure.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 61
+  };
+  R._EvaluateVisitor__visitDynamicImport_closure.prototype = {
+    call$0: function() {
+      var previousLoad, oldImporter, oldStylesheet, t4, t5, t6, t7, t8, t9, t10, t11, environment, module, visitor, _null = null,
+        _s34_ = "This file is already being loaded.",
+        _box_0 = {},
+        t1 = this.$this,
+        t2 = this.$import,
+        result = t1._loadStylesheet$3$forImport(t2.url, t2.span, true),
+        importer = result.item1,
+        stylesheet = result.item2,
+        url = stylesheet.span.file.url,
+        t3 = t1._activeModules;
+      if (t3.containsKey$1(url)) {
+        previousLoad = t3.$index(0, url);
+        throw H.wrapException(previousLoad == null ? t1._evaluate$_exception$1(_s34_) : t1._multiSpanException$3(_s34_, "new load", P.LinkedHashMap_LinkedHashMap$_literal([previousLoad.get$span(), "original load"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+      t3.$indexSet(0, url, t2);
+      t2 = new P.UnmodifiableListView(stylesheet._uses, type$.UnmodifiableListView_legacy_UseRule);
+      if (t2.get$length(t2) === 0) {
+        t2 = new P.UnmodifiableListView(stylesheet._forwards, type$.UnmodifiableListView_legacy_ForwardRule);
+        t2 = t2.get$length(t2) === 0;
+      } else
+        t2 = false;
+      if (t2) {
+        oldImporter = t1._importer;
+        oldStylesheet = t1._stylesheet;
+        t1._importer = importer;
+        t1._stylesheet = stylesheet;
+        t1.visitStylesheet$1(stylesheet);
+        t1._importer = oldImporter;
+        t1._stylesheet = oldStylesheet;
+        t3.remove$1(0, url);
+        return;
+      }
+      _box_0.children = null;
+      t2 = t1._evaluate$_environment;
+      t4 = type$.legacy_String;
+      t5 = type$.legacy_Module_legacy_Callable;
+      t6 = type$.legacy_AstNode;
+      t7 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_Callable);
+      t8 = t2._variables;
+      t8 = H.setRuntimeTypeInfo(t8.slice(0), H._arrayInstanceType(t8));
+      t9 = t2._variableNodes;
+      if (t9 == null)
+        t9 = _null;
+      else
+        t9 = H.setRuntimeTypeInfo(t9.slice(0), H._arrayInstanceType(t9));
+      t10 = t2._functions;
+      t10 = H.setRuntimeTypeInfo(t10.slice(0), H._arrayInstanceType(t10));
+      t11 = t2._mixins;
+      t11 = H.setRuntimeTypeInfo(t11.slice(0), H._arrayInstanceType(t11));
+      environment = O.Environment$_(P.LinkedHashMap_LinkedHashMap$_empty(t4, t5), P.LinkedHashMap_LinkedHashMap$_empty(t4, t6), P.LinkedHashSet_LinkedHashSet$_empty(t5), P.LinkedHashMap_LinkedHashMap$_empty(t5, t6), _null, _null, _null, t7, t8, t9, t10, t11, t2._content);
+      t1._withEnvironment$2(environment, new R._EvaluateVisitor__visitDynamicImport__closure(_box_0, t1, importer, stylesheet, environment));
+      module = O._EnvironmentModule__EnvironmentModule(environment, new V.CssStylesheet(new P.UnmodifiableListView(C.List_empty0, type$.UnmodifiableListView_legacy_CssNode), Y.SourceFile$decoded(C.List_empty1, "<dummy module>").span$1(0)), C.C_EmptyExtender, environment._forwardedModules);
+      t1._evaluate$_environment.importForwards$1(module);
+      if (module.transitivelyContainsCss)
+        t1._combineCss$2$clone(module, module.transitivelyContainsExtensions).accept$1(t1);
+      visitor = new R._ImportedCssVisitor(t1);
+      for (t1 = J.get$iterator$ax(_box_0.children); t1.moveNext$0();)
+        t1.get$current(t1).accept$1(visitor);
+      t3.remove$1(0, url);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor__visitDynamicImport__closure.prototype = {
+    call$0: function() {
+      var t2, t3, _this = this,
+        t1 = _this.$this,
+        oldImporter = t1._importer,
+        oldStylesheet = t1._stylesheet,
+        oldRoot = t1._root,
+        oldParent = t1._evaluate$_parent,
+        oldEndOfImports = t1._endOfImports,
+        oldOutOfOrderImports = t1._outOfOrderImports,
+        oldConfiguration = t1._configuration;
+      t1._importer = _this.importer;
+      t2 = t1._stylesheet = _this.stylesheet;
+      t1._evaluate$_parent = t1._root = V.ModifiableCssStylesheet$(t2.span);
+      t1._endOfImports = 0;
+      t1._outOfOrderImports = null;
+      t3 = new P.UnmodifiableListView(t2._forwards, type$.UnmodifiableListView_legacy_ForwardRule);
+      if (!t3.get$isEmpty(t3))
+        t1._configuration = _this.environment.toImplicitConfiguration$0();
+      t1.visitStylesheet$1(t2);
+      _this._box_0.children = t1._addOutOfOrderImports$0();
+      t1._importer = oldImporter;
+      t1._stylesheet = oldStylesheet;
+      t1._root = oldRoot;
+      t1._evaluate$_parent = oldParent;
+      t1._endOfImports = oldEndOfImports;
+      t1._outOfOrderImports = oldOutOfOrderImports;
+      t1._configuration = oldConfiguration;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitIncludeRule_closure.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._evaluate$_environment.getMixin$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 118
+  };
+  R._EvaluateVisitor_visitIncludeRule_closure0.prototype = {
+    call$0: function() {
+      return this.node.get$spanWithoutContent();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 33
+  };
+  R._EvaluateVisitor_visitIncludeRule_closure1.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = t1._evaluate$_environment,
+        oldContent = t2._content;
+      t2._content = _this.contentCallable;
+      new R._EvaluateVisitor_visitIncludeRule__closure(t1, _this.mixin, _this.nodeWithSpan).call$0();
+      t2._content = oldContent;
+      return null;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitIncludeRule__closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._evaluate$_environment,
+        oldInMixin = t2._inMixin;
+      t2._inMixin = true;
+      new R._EvaluateVisitor_visitIncludeRule___closure(t1, this.mixin, this.nodeWithSpan).call$0();
+      t2._inMixin = oldInMixin;
+      return null;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitIncludeRule___closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, t4, _i;
+      for (t1 = this.mixin.declaration.children, t2 = t1.length, t3 = this.$this, t4 = this.nodeWithSpan, _i = 0; _i < t2; ++_i)
+        t3._addErrorSpan$2(t4, new R._EvaluateVisitor_visitIncludeRule____closure(t3, t1[_i]));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitIncludeRule____closure.prototype = {
+    call$0: function() {
+      return this.statement.accept$1(this.$this);
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitMediaRule_closure.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = _this.mergedQueries;
+      if (t2 == null)
+        t2 = _this.queries;
+      t1._withMediaQueries$2(t2, new R._EvaluateVisitor_visitMediaRule__closure(t1, _this.node));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitMediaRule__closure.prototype = {
+    call$0: function() {
+      var t3, _i,
+        t1 = this.$this,
+        t2 = t1._styleRule;
+      if (!(t2 != null && !t1._atRootExcludingStyleRule))
+        for (t2 = this.node.children, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t2[_i].accept$1(t1);
+      else
+        t1._withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitMediaRule___closure(t1, this.node), false, type$.legacy_ModifiableCssStyleRule, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitMediaRule___closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitMediaRule_closure0.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule._is(node))
+        t1 = this.mergedQueries != null && type$.legacy_CssMediaRule._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor__visitMediaQueries_closure.prototype = {
+    call$0: function() {
+      return F.MediaQueryParser$(this.resolved, this.$this._evaluate$_logger, null).parse$0();
+    },
+    $signature: 114
+  };
+  R._EvaluateVisitor_visitStyleRule_closure.prototype = {
+    call$0: function() {
+      return E.KeyframeSelectorParser$(this.selectorText.value, this.$this._evaluate$_logger).parse$0();
+    },
+    $signature: 40
+  };
+  R._EvaluateVisitor_visitStyleRule_closure0.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitStyleRule_closure1.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor_visitStyleRule_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = !t1._stylesheet.plainCss;
+      return D.SelectorList_SelectorList$parse(this.selectorText.value, t2, t2, t1._evaluate$_logger);
+    },
+    $signature: 42
+  };
+  R._EvaluateVisitor_visitStyleRule_closure3.prototype = {
+    call$0: function() {
+      var t1 = this._box_0.parsedSelector,
+        t2 = this.$this,
+        t3 = t2._styleRule;
+      t3 = t3 == null ? null : t3.originalSelector;
+      return t1.resolveParentSelectors$2$implicitParent(t3, !t2._atRootExcludingStyleRule);
+    },
+    $signature: 42
+  };
+  R._EvaluateVisitor_visitStyleRule_closure4.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._withStyleRule$2(this.rule, new R._EvaluateVisitor_visitStyleRule__closure(t1, this.node));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitStyleRule__closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitStyleRule_closure5.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor_visitSupportsRule_closure.prototype = {
+    call$0: function() {
+      var t3, _i,
+        t1 = this.$this,
+        t2 = t1._styleRule;
+      if (!(t2 != null && !t1._atRootExcludingStyleRule))
+        for (t2 = this.node.children, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t2[_i].accept$1(t1);
+      else
+        t1._withParent$2$2(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitSupportsRule__closure(t1, this.node), type$.legacy_ModifiableCssStyleRule, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitSupportsRule__closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitSupportsRule_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor_visitVariableDeclaration_closure.prototype = {
+    call$0: function() {
+      var t1 = this.override;
+      this.$this._evaluate$_environment.setVariable$4$global(this.node.name, t1.value, t1.assignmentNode, true);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitVariableDeclaration_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._evaluate$_environment.getVariable$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitVariableDeclaration_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = this.node;
+      t1._evaluate$_environment.setVariable$5$global$namespace(t2.name, this.value, t1._expressionNode$1(t2.expression), t2.isGlobal, t2.namespace);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitUseRule_closure.prototype = {
+    call$1: function(module) {
+      var t1 = this.node;
+      this.$this._evaluate$_environment.addModule$3$namespace(module, t1, t1.namespace);
+    },
+    $signature: 117
+  };
+  R._EvaluateVisitor_visitWarnRule_closure.prototype = {
+    call$0: function() {
+      return this.node.expression.accept$1(this.$this);
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitWhileRule_closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, result;
+      for (t1 = this.node, t2 = t1.condition, t3 = this.$this, t1 = t1.children; t2.accept$1(t3).get$isTruthy();) {
+        result = t3._handleReturn$2(t1, new R._EvaluateVisitor_visitWhileRule__closure(t3));
+        if (result != null)
+          return result;
+      }
+      return null;
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitWhileRule__closure.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 61
+  };
+  R._EvaluateVisitor_visitBinaryOperationExpression_closure.prototype = {
+    call$0: function() {
+      var right, result,
+        t1 = this.node,
+        t2 = this.$this,
+        left = t1.left.accept$1(t2);
+      switch (t1.operator) {
+        case C.BinaryOperator_kjl:
+          right = t1.right.accept$1(t2);
+          left.toString;
+          t1 = N.serializeValue0(left, false, true) + "=";
+          right.toString;
+          return new D.SassString(t1 + N.serializeValue0(right, false, true), false);
+        case C.BinaryOperator_or_or_1:
+          return left.get$isTruthy() ? left : t1.right.accept$1(t2);
+        case C.BinaryOperator_and_and_2:
+          return left.get$isTruthy() ? t1.right.accept$1(t2) : left;
+        case C.BinaryOperator_YlX:
+          return J.$eq$(left, t1.right.accept$1(t2)) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+        case C.BinaryOperator_i5H:
+          return !J.$eq$(left, t1.right.accept$1(t2)) ? C.SassBoolean_true0 : C.SassBoolean_false0;
+        case C.BinaryOperator_AcR:
+          return left.greaterThan$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_1da:
+          return left.greaterThanOrEquals$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_8qt:
+          return left.lessThan$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_33h:
+          return left.lessThanOrEquals$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_AcR0:
+          return left.plus$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_iyO:
+          return left.minus$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_O1M:
+          return left.times$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_RTB:
+          right = t1.right.accept$1(t2);
+          result = left.dividedBy$1(right);
+          if (t1.allowsSlash && left instanceof T.SassNumber && right instanceof T.SassNumber)
+            return type$.legacy_SassNumber._as(result).withSlash$2(left, right);
+          else
+            return result;
+        case C.BinaryOperator_2ad:
+          return left.modulo$1(t1.right.accept$1(t2));
+        default:
+          return null;
+      }
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitVariableExpression_closure.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._evaluate$_environment.getVariable$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor_visitListExpression_closure.prototype = {
+    call$1: function(expression) {
+      return expression.accept$1(this.$this);
+    },
+    $signature: 242
+  };
+  R._EvaluateVisitor_visitFunctionExpression_closure.prototype = {
+    call$0: function() {
+      var t1 = this.node.namespace,
+        t2 = this.plainName;
+      if (t1 == null)
+        t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return this.$this._getFunction$2$namespace(t2, t1);
+    },
+    $signature: 118
+  };
+  R._EvaluateVisitor_visitFunctionExpression_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._runFunctionCallable$3(t1.$arguments, this._box_0.$function, t1);
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor__runUserDefinedCallable_closure.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = _this.callable;
+      return t1._withEnvironment$2(t2.environment.closure$0(), new R._EvaluateVisitor__runUserDefinedCallable__closure(t1, _this.evaluated, t2, _this.nodeWithSpan, _this.run));
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor__runUserDefinedCallable__closure.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this;
+      return t1._evaluate$_environment.scope$1$1(new R._EvaluateVisitor__runUserDefinedCallable___closure(t1, _this.evaluated, _this.callable, _this.nodeWithSpan, _this.run), type$.legacy_Value);
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor__runUserDefinedCallable___closure.prototype = {
+    call$0: function() {
+      var declaredArguments, minLength, t8, t9, i, t10, t11, t12, argument, value, t13, rest, argumentList, result, argumentWord, argumentNames, _this = this, _null = null,
+        t1 = _this.$this,
+        t2 = _this.evaluated,
+        t3 = t2.positional,
+        t4 = t3.length,
+        t5 = t2.named,
+        t6 = _this.callable.declaration.$arguments,
+        t7 = _this.nodeWithSpan;
+      t1._verifyArguments$4(t4, t5, t6, t7);
+      declaredArguments = t6.$arguments;
+      t4 = declaredArguments.length;
+      minLength = Math.min(t3.length, t4);
+      for (t8 = t1._sourceMap, t9 = t2.positionalNodes, i = 0; i < minLength; ++i) {
+        t10 = t1._evaluate$_environment;
+        t11 = declaredArguments[i].name;
+        t12 = t3[i].withoutSlash$0();
+        t10.setLocalVariable$3(t11, t12, t8 ? t9[i] : _null);
+      }
+      for (i = t3.length, t9 = t2.namedNodes; i < t4; ++i) {
+        argument = declaredArguments[i];
+        t10 = argument.name;
+        value = t5.remove$1(0, t10);
+        if (value == null)
+          value = argument.defaultValue.accept$1(t1);
+        t11 = t1._evaluate$_environment;
+        t12 = value.withoutSlash$0();
+        if (t8) {
+          t13 = t9.$index(0, t10);
+          if (t13 == null)
+            t13 = t1._expressionNode$1(argument.defaultValue);
+        } else
+          t13 = _null;
+        t11.setLocalVariable$3(t10, t12, t13);
+      }
+      t8 = t6.restArgument;
+      if (t8 != null) {
+        rest = t3.length > t4 ? C.JSArray_methods.sublist$1(t3, t4) : C.List_empty5;
+        t2 = t2.separator;
+        argumentList = D.SassArgumentList$(rest, t5, t2 === C.ListSeparator_undecided ? C.ListSeparator_comma : t2);
+        t1._evaluate$_environment.setLocalVariable$3(t8, argumentList, t7);
+      } else
+        argumentList = _null;
+      result = _this.run.call$0();
+      if (argumentList == null)
+        return result;
+      if (t5.get$isEmpty(t5))
+        return result;
+      if (argumentList._wereKeywordsAccessed)
+        return result;
+      t2 = t5.get$keys(t5);
+      argumentWord = B.pluralize("argument", t2.get$length(t2), _null);
+      t5 = t5.get$keys(t5);
+      argumentNames = B.toSentence(H.MappedIterable_MappedIterable(t5, new R._EvaluateVisitor__runUserDefinedCallable____closure(), H._instanceType(t5)._eval$1("Iterable.E"), type$.legacy_Object), "or");
+      throw H.wrapException(E.MultiSpanSassRuntimeException$("No " + argumentWord + " named " + H.S(argumentNames) + ".", t7.get$span(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([t6.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), t1._evaluate$_stackTrace$1(t7.get$span())));
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor__runUserDefinedCallable____closure.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  R._EvaluateVisitor__runFunctionCallable_closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, t4, _i, $returnValue;
+      for (t1 = this.callable.declaration, t2 = t1.children, t3 = t2.length, t4 = this.$this, _i = 0; _i < t3; ++_i) {
+        $returnValue = t2[_i].accept$1(t4);
+        if ($returnValue instanceof F.Value)
+          return $returnValue;
+      }
+      throw H.wrapException(t4._evaluate$_exception$2("Function finished without @return.", t1.span));
+    },
+    $signature: 13
+  };
+  R._EvaluateVisitor__runBuiltInCallable_closure.prototype = {
+    call$0: function() {
+      return this.overload.verify$2(this.evaluated.positional.length, this.namedSet);
+    },
+    $signature: 1
+  };
+  R._EvaluateVisitor__runBuiltInCallable_closure0.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  R._EvaluateVisitor__evaluateArguments_closure.prototype = {
+    call$2: function(key, value) {
+      var t1;
+      this.named.$indexSet(0, key, value);
+      t1 = this.namedNodes;
+      if (t1 != null)
+        t1.$indexSet(0, key, this.restNodeForSpan);
+    },
+    $signature: 80
+  };
+  R._EvaluateVisitor__evaluateMacroArguments_closure.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression(value, null);
+    },
+    $signature: 47
+  };
+  R._EvaluateVisitor__evaluateMacroArguments_closure0.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression(value, null);
+    },
+    $signature: 47
+  };
+  R._EvaluateVisitor__evaluateMacroArguments_closure1.prototype = {
+    call$2: function(key, value) {
+      this.named.$indexSet(0, key, new F.ValueExpression(value, null));
+    },
+    $signature: 80
+  };
+  R._EvaluateVisitor__evaluateMacroArguments_closure2.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression(value, null);
+    },
+    $signature: 47
+  };
+  R._EvaluateVisitor__addRestMap_closure.prototype = {
+    call$1: function(value) {
+      return this.T._eval$1("0*")._as(value);
+    },
+    $signature: function() {
+      return this.T._eval$1("0*(Value*)");
+    }
+  };
+  R._EvaluateVisitor__addRestMap_closure0.prototype = {
+    call$2: function(key, value) {
+      var _this = this;
+      if (key instanceof D.SassString)
+        _this.values.$indexSet(0, key.text, _this._box_0.convert.call$1(value));
+      else
+        throw H.wrapException(_this.$this._evaluate$_exception$2(string$.Variab_ + H.S(key) + " is not a string in " + _this.map.toString$0(0) + ".", _this.nodeWithSpan.get$span()));
+    },
+    $signature: 46
+  };
+  R._EvaluateVisitor__verifyArguments_closure.prototype = {
+    call$0: function() {
+      return this.$arguments.verify$2(this.positional, new M.MapKeySet(this.named, type$.MapKeySet_legacy_String));
+    },
+    $signature: 1
+  };
+  R._EvaluateVisitor_visitStringExpression_closure.prototype = {
+    call$1: function(value) {
+      var t1, result;
+      if (typeof value == "string")
+        return value;
+      type$.legacy_Expression._as(value);
+      t1 = this.$this;
+      result = value.accept$1(t1);
+      return result instanceof D.SassString ? result.text : t1._evaluate$_serialize$3$quote(result, value, false);
+    },
+    $signature: 41
+  };
+  R._EvaluateVisitor_visitCssAtRule_closure.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssAtRule_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor_visitCssKeyframeBlock_closure.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssKeyframeBlock_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor_visitCssMediaRule_closure.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = _this.mergedQueries;
+      if (t2 == null)
+        t2 = _this.node.queries;
+      t1._withMediaQueries$2(t2, new R._EvaluateVisitor_visitCssMediaRule__closure(t1, _this.node));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssMediaRule__closure.prototype = {
+    call$0: function() {
+      var cur,
+        t1 = this.$this,
+        t2 = t1._styleRule;
+      if (!(t2 != null && !t1._atRootExcludingStyleRule))
+        for (t2 = this.node.children, t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+          cur = t2.__internal$_current;
+          cur.accept$1(t1);
+        }
+      else
+        t1._withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitCssMediaRule___closure(t1, this.node), false, type$.legacy_ModifiableCssStyleRule, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssMediaRule___closure.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssMediaRule_closure0.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule._is(node))
+        t1 = this.mergedQueries != null && type$.legacy_CssMediaRule._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor_visitCssStyleRule_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._withStyleRule$2(this.rule, new R._EvaluateVisitor_visitCssStyleRule__closure(t1, this.node));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssStyleRule__closure.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssStyleRule_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor_visitCssSupportsRule_closure.prototype = {
+    call$0: function() {
+      var cur,
+        t1 = this.$this,
+        t2 = t1._styleRule;
+      if (!(t2 != null && !t1._atRootExcludingStyleRule))
+        for (t2 = this.node.children, t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+          cur = t2.__internal$_current;
+          cur.accept$1(t1);
+        }
+      else
+        t1._withParent$2$2(X.ModifiableCssStyleRule$(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitCssSupportsRule__closure(t1, this.node), type$.legacy_ModifiableCssStyleRule, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssSupportsRule__closure.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssSupportsRule_closure0.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._EvaluateVisitor__performInterpolation_closure.prototype = {
+    call$1: function(value) {
+      var t1, result, t2, t3;
+      if (typeof value == "string")
+        return value;
+      type$.legacy_Expression._as(value);
+      t1 = this.$this;
+      result = value.accept$1(t1);
+      if (this.warnForColor && result instanceof K.SassColor && $.$get$namesByColor().containsKey$1(result)) {
+        t2 = X.Interpolation$(H.setRuntimeTypeInfo([""], type$.JSArray_legacy_Object), null);
+        t3 = $.$get$namesByColor();
+        t1._warn$2(string$.You_pr + H.S(t3.$index(0, result)) + string$.x20in_in + H.S(result) + string$.x2c_whicw + H.S(t3.$index(0, result)) + string$.x22x29__If + new V.BinaryOperationExpression(C.BinaryOperator_AcR0, new D.StringExpression(t2, true), value, false).toString$0(0) + "'.", value.get$span());
+      }
+      return t1._evaluate$_serialize$3$quote(result, value, false);
+    },
+    $signature: 41
+  };
+  R._EvaluateVisitor__serialize_closure.prototype = {
+    call$0: function() {
+      var t1 = this.value;
+      t1.toString;
+      return N.serializeValue0(t1, false, this.quote);
+    },
+    $signature: 12
+  };
+  R._EvaluateVisitor__stackTrace_closure.prototype = {
+    call$1: function(tuple) {
+      return this.$this._stackFrame$2(tuple.item1, tuple.item2.get$span());
+    },
+    $signature: 195
+  };
+  R._ImportedCssVisitor.prototype = {
+    visitCssAtRule$1: function(node) {
+      var t1 = node.isChildless ? null : new R._ImportedCssVisitor_visitCssAtRule_closure();
+      this._visitor._addChild$2$through(node, t1);
+    },
+    visitCssComment$1: function(node) {
+      return this._visitor._addChild$1(node);
+    },
+    visitCssDeclaration$1: function(node) {
+    },
+    visitCssImport$1: function(node) {
+      var t1 = this._visitor,
+        t2 = t1._evaluate$_parent,
+        t3 = t1._root;
+      if (t2 != t3)
+        t1._addChild$1(node);
+      else if (t1._endOfImports === J.get$length$asx(t3.children._collection$_source)) {
+        t1._addChild$1(node);
+        t1._endOfImports = t1._endOfImports + 1;
+      } else {
+        t2 = t1._outOfOrderImports;
+        (t2 == null ? t1._outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport) : t2).push(node);
+      }
+    },
+    visitCssKeyframeBlock$1: function(node) {
+    },
+    visitCssMediaRule$1: function(node) {
+      var t1 = this._visitor,
+        t2 = t1._mediaQueries;
+      t1._addChild$2$through(node, new R._ImportedCssVisitor_visitCssMediaRule_closure(t2 == null || t1._mergeMediaQueries$2(t2, node.queries) != null));
+    },
+    visitCssStyleRule$1: function(node) {
+      return this._visitor._addChild$2$through(node, new R._ImportedCssVisitor_visitCssStyleRule_closure());
+    },
+    visitCssStylesheet$1: function(node) {
+      var t1, cur;
+      for (t1 = node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(this);
+      }
+    },
+    visitCssSupportsRule$1: function(node) {
+      return this._visitor._addChild$2$through(node, new R._ImportedCssVisitor_visitCssSupportsRule_closure());
+    }
+  };
+  R._ImportedCssVisitor_visitCssAtRule_closure.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._ImportedCssVisitor_visitCssMediaRule_closure.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule._is(node))
+        t1 = this.hasBeenMerged && type$.legacy_CssMediaRule._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 7
+  };
+  R._ImportedCssVisitor_visitCssStyleRule_closure.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._ImportedCssVisitor_visitCssSupportsRule_closure.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule._is(node);
+    },
+    $signature: 7
+  };
+  R._ArgumentResults.prototype = {};
+  F._FindDependenciesVisitor.prototype = {
+    visitEachRule$1: function(node) {
+    },
+    visitForRule$1: function(node) {
+    },
+    visitIfRule$1: function(node) {
+    },
+    visitWhileRule$1: function(node) {
+    },
+    visitUseRule$1: function(node) {
+      this._usesAndForwards.push(node.url);
+    },
+    visitForwardRule$1: function(node) {
+      this._usesAndForwards.push(node.url);
+    },
+    visitImportRule$1: function(node) {
+      var t1, t2, t3, _i, $import;
+      for (t1 = node.imports, t2 = t1.length, t3 = this._imports, _i = 0; _i < t2; ++_i) {
+        $import = t1[_i];
+        if ($import instanceof B.DynamicImport)
+          t3.push(P.Uri_parse($import.url));
+      }
+    }
+  };
+  D.RecursiveStatementVisitor.prototype = {
+    visitAtRootRule$1: function(node) {
+      return this.visitChildren$1(node);
+    },
+    visitAtRule$1: function(node) {
+      return node.children == null ? null : this.visitChildren$1(node);
+    },
+    visitContentBlock$1: function(node) {
+      return null;
+    },
+    visitContentRule$1: function(node) {
+      this.visitArgumentInvocation$1(node.$arguments);
+      return null;
+    },
+    visitDebugRule$1: function(node) {
+      return null;
+    },
+    visitDeclaration$1: function(node) {
+      return node.children == null ? null : this.visitChildren$1(node);
+    },
+    visitErrorRule$1: function(node) {
+      return null;
+    },
+    visitExtendRule$1: function(node) {
+      return null;
+    },
+    visitFunctionRule$1: function(node) {
+      return null;
+    },
+    visitIncludeRule$1: function(node) {
+      this.visitArgumentInvocation$1(node.$arguments);
+      return null;
+    },
+    visitLoudComment$1: function(node) {
+      return null;
+    },
+    visitMediaRule$1: function(node) {
+      return this.visitChildren$1(node);
+    },
+    visitMixinRule$1: function(node) {
+      return null;
+    },
+    visitReturnRule$1: function(node) {
+      return null;
+    },
+    visitSilentComment$1: function(node) {
+      return null;
+    },
+    visitStyleRule$1: function(node) {
+      return this.visitChildren$1(node);
+    },
+    visitStylesheet$1: function(node) {
+      return this.visitChildren$1(node);
+    },
+    visitSupportsRule$1: function(node) {
+      return this.visitChildren$1(node);
+    },
+    visitVariableDeclaration$1: function(node) {
+      return null;
+    },
+    visitWarnRule$1: function(node) {
+      return null;
+    },
+    visitArgumentInvocation$1: function(invocation) {
+      var t1, _i;
+      for (t1 = invocation.positional.length, _i = 0; _i < t1; ++_i)
+        ;
+      for (t1 = invocation.named, t1 = t1.get$values(t1), t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        t1.get$current(t1);
+    },
+    visitChildren$1: function(node) {
+      var t1;
+      for (t1 = node.children, t1 = (t1 && C.JSArray_methods).get$iterator(t1); t1.moveNext$0();)
+        t1.get$current(t1).accept$1(this);
+      return null;
+    }
+  };
+  N.serialize_closure.prototype = {
+    call$1: function(codeUnit) {
+      return codeUnit > 127;
+    },
+    $signature: 24
+  };
+  N._SerializeVisitor0.prototype = {
+    visitCssStylesheet$1: function(node) {
+      var t1, t2, t3, t4, previous, i, child, _this = this;
+      for (t1 = _this._style !== C.OutputStyle_compressed, t2 = type$.legacy_CssComment, t3 = type$.legacy_CssParentNode, t4 = _this._serialize$_buffer, previous = null, i = 0; i < J.get$length$asx(node.get$children(node)); ++i) {
+        child = J.$index$asx(node.get$children(node), i);
+        if (_this._isInvisible$1(child))
+          continue;
+        if (previous != null) {
+          if (t3._is(previous) ? previous.get$isChildless() : !t2._is(previous))
+            t4.writeCharCode$1(59);
+          if (t1)
+            t4.write$1(0, "\n");
+          if (previous.get$isGroupEnd())
+            if (t1)
+              t4.write$1(0, "\n");
+        }
+        child.accept$1(_this);
+        previous = child;
+      }
+      if (previous != null)
+        t1 = (t3._is(previous) ? previous.get$isChildless() : !t2._is(previous)) && t1;
+      else
+        t1 = false;
+      if (t1)
+        t4.writeCharCode$1(59);
+    },
+    visitCssComment$1: function(node) {
+      this._serialize$_buffer.forSpan$2(node.span, new N._SerializeVisitor_visitCssComment_closure(this, node));
+    },
+    visitCssAtRule$1: function(node) {
+      var t1, _this = this;
+      _this._writeIndentation$0();
+      t1 = _this._serialize$_buffer;
+      t1.forSpan$2(node.span, new N._SerializeVisitor_visitCssAtRule_closure(_this, node));
+      if (!node.isChildless) {
+        if (_this._style !== C.OutputStyle_compressed)
+          t1.writeCharCode$1(32);
+        _this._serialize$_visitChildren$1(node.children);
+      }
+    },
+    visitCssMediaRule$1: function(node) {
+      var t1, _this = this;
+      _this._writeIndentation$0();
+      t1 = _this._serialize$_buffer;
+      t1.forSpan$2(node.span, new N._SerializeVisitor_visitCssMediaRule_closure(_this, node));
+      if (_this._style !== C.OutputStyle_compressed)
+        t1.writeCharCode$1(32);
+      _this._serialize$_visitChildren$1(node.children);
+    },
+    visitCssImport$1: function(node) {
+      this._writeIndentation$0();
+      this._serialize$_buffer.forSpan$2(node.span, new N._SerializeVisitor_visitCssImport_closure(this, node));
+    },
+    _writeImportUrl$1: function(url) {
+      var urlContents, maybeQuote, _this = this;
+      if (_this._style !== C.OutputStyle_compressed || J._codeUnitAt$1$s(url, 0) !== 117) {
+        _this._serialize$_buffer.write$1(0, url);
+        return;
+      }
+      urlContents = J.substring$2$s(url, 4, url.length - 1);
+      maybeQuote = C.JSString_methods._codeUnitAt$1(urlContents, 0);
+      if (maybeQuote === 39 || maybeQuote === 34)
+        _this._serialize$_buffer.write$1(0, urlContents);
+      else
+        _this._visitQuotedString$1(urlContents);
+    },
+    visitCssKeyframeBlock$1: function(node) {
+      var t1, _this = this;
+      _this._writeIndentation$0();
+      t1 = _this._serialize$_buffer;
+      t1.forSpan$2(node.selector.span, new N._SerializeVisitor_visitCssKeyframeBlock_closure(_this, node));
+      if (_this._style !== C.OutputStyle_compressed)
+        t1.writeCharCode$1(32);
+      _this._serialize$_visitChildren$1(node.children);
+    },
+    _visitMediaQuery$1: function(query) {
+      var t2, t3, _this = this,
+        t1 = query.modifier;
+      if (t1 != null) {
+        t2 = _this._serialize$_buffer;
+        t2.write$1(0, t1);
+        t2.writeCharCode$1(32);
+      }
+      t1 = query.type;
+      if (t1 != null) {
+        t2 = _this._serialize$_buffer;
+        t2.write$1(0, t1);
+        if (query.features.length !== 0)
+          t2.write$1(0, " and ");
+      }
+      t1 = query.features;
+      t2 = _this._style === C.OutputStyle_compressed ? "and " : " and ";
+      t3 = _this._serialize$_buffer;
+      _this._writeBetween$3(t1, t2, t3.get$write(t3));
+    },
+    visitCssStyleRule$1: function(node) {
+      var t1, _this = this;
+      _this._writeIndentation$0();
+      t1 = _this._serialize$_buffer;
+      t1.forSpan$2(node.selector.span, new N._SerializeVisitor_visitCssStyleRule_closure(_this, node));
+      if (_this._style !== C.OutputStyle_compressed)
+        t1.writeCharCode$1(32);
+      _this._serialize$_visitChildren$1(node.children);
+    },
+    visitCssSupportsRule$1: function(node) {
+      var t1, _this = this;
+      _this._writeIndentation$0();
+      t1 = _this._serialize$_buffer;
+      t1.forSpan$2(node.span, new N._SerializeVisitor_visitCssSupportsRule_closure(_this, node));
+      if (_this._style !== C.OutputStyle_compressed)
+        t1.writeCharCode$1(32);
+      _this._serialize$_visitChildren$1(node.children);
+    },
+    visitCssDeclaration$1: function(node) {
+      var error, error0, t1, t2, exception, _this = this;
+      _this._writeIndentation$0();
+      t1 = node.name;
+      _this._write$1(t1);
+      t2 = _this._serialize$_buffer;
+      t2.writeCharCode$1(58);
+      if (J.startsWith$1$s(t1.get$value(t1), "--") && node.parsedAsCustomProperty)
+        t2.forSpan$2(node.value.span, new N._SerializeVisitor_visitCssDeclaration_closure(_this, node));
+      else {
+        if (_this._style !== C.OutputStyle_compressed)
+          t2.writeCharCode$1(32);
+        try {
+          t2.forSpan$2(node.valueSpanForMap, new N._SerializeVisitor_visitCssDeclaration_closure0(_this, node));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (t1 instanceof E.MultiSpanSassScriptException) {
+            error = t1;
+            throw H.wrapException(E.MultiSpanSassException$(error.message, node.value.span, error.primaryLabel, error.secondarySpans));
+          } else if (t1 instanceof E.SassScriptException) {
+            error0 = t1;
+            throw H.wrapException(E.SassException$(error0.message, node.value.span));
+          } else
+            throw exception;
+        }
+      }
+    },
+    _writeFoldedValue$1: function(node) {
+      var t1, t2, next, t3,
+        scanner = X.StringScanner$(type$.legacy_SassString._as(node.value.value).text, null, null);
+      for (t1 = scanner.string.length, t2 = this._serialize$_buffer; scanner._string_scanner$_position !== t1;) {
+        next = scanner.readChar$0();
+        if (next !== 10) {
+          t2.writeCharCode$1(next);
+          continue;
+        }
+        t2.writeCharCode$1(32);
+        while (true) {
+          t3 = scanner.peekChar$0();
+          if (!(t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12))
+            break;
+          scanner.readChar$0();
+        }
+      }
+    },
+    _writeReindentedValue$1: function(node) {
+      var _this = this,
+        t1 = node.value,
+        value = type$.legacy_SassString._as(t1.value).text,
+        minimumIndentation = _this._minimumIndentation$1(value);
+      if (minimumIndentation == null) {
+        _this._serialize$_buffer.write$1(0, value);
+        return;
+      } else if (minimumIndentation === -1) {
+        t1 = _this._serialize$_buffer;
+        t1.write$1(0, B.trimAsciiRight(value, true));
+        t1.writeCharCode$1(32);
+        return;
+      }
+      if (t1.span != null) {
+        t1 = node.name.get$span();
+        t1 = Y.FileLocation$_(t1.file, t1._file$_start);
+        minimumIndentation = Math.min(minimumIndentation, t1.file.getColumn$1(t1.offset));
+      }
+      _this._writeWithIndent$2(value, minimumIndentation);
+    },
+    _minimumIndentation$1: function(text) {
+      var character, t2, min, next, min0,
+        scanner = Z.LineScanner$(text),
+        t1 = scanner.string.length;
+      while (true) {
+        if (scanner._string_scanner$_position !== t1) {
+          character = scanner.super$StringScanner$readChar();
+          scanner._adjustLineAndColumn$1(character);
+          t2 = character !== 10;
+        } else
+          t2 = false;
+        if (!t2)
+          break;
+      }
+      if (scanner._string_scanner$_position === t1)
+        return scanner.peekChar$1(-1) === 10 ? -1 : null;
+      for (min = null; scanner._string_scanner$_position !== t1;) {
+        for (; scanner._string_scanner$_position !== t1;) {
+          next = scanner.peekChar$0();
+          if (next !== 32 && next !== 9)
+            break;
+          scanner._adjustLineAndColumn$1(scanner.super$StringScanner$readChar());
+        }
+        if (scanner._string_scanner$_position === t1 || scanner.scanChar$1(10))
+          continue;
+        min0 = scanner._line_scanner$_column;
+        min = min == null ? min0 : Math.min(min, min0);
+        while (true) {
+          if (scanner._string_scanner$_position !== t1) {
+            character = scanner.super$StringScanner$readChar();
+            scanner._adjustLineAndColumn$1(character);
+            t2 = character !== 10;
+          } else
+            t2 = false;
+          if (!t2)
+            break;
+        }
+      }
+      return min == null ? -1 : min;
+    },
+    _writeWithIndent$2: function(text, minimumIndentation) {
+      var t1, t2, t3, character, t4, lineStart, newlines, end,
+        scanner = Z.LineScanner$(text);
+      for (t1 = scanner.string, t2 = t1.length, t3 = this._serialize$_buffer; scanner._string_scanner$_position !== t2;) {
+        character = scanner.super$StringScanner$readChar();
+        scanner._adjustLineAndColumn$1(character);
+        if (character === 10)
+          break;
+        t3.writeCharCode$1(character);
+      }
+      for (t4 = J.getInterceptor$s(t1); true;) {
+        lineStart = scanner._string_scanner$_position;
+        for (newlines = 1; true;) {
+          if (scanner._string_scanner$_position === t2) {
+            t3.writeCharCode$1(32);
+            return;
+          }
+          character = scanner.super$StringScanner$readChar();
+          scanner._adjustLineAndColumn$1(character);
+          if (character === 32 || character === 9)
+            continue;
+          if (character !== 10)
+            break;
+          lineStart = scanner._string_scanner$_position;
+          ++newlines;
+        }
+        this._writeTimes$2(10, newlines);
+        this._writeIndentation$0();
+        end = scanner._string_scanner$_position;
+        t3.write$1(0, t4.substring$2(t1, lineStart + minimumIndentation, end));
+        for (; true;) {
+          if (scanner._string_scanner$_position === t2)
+            return;
+          character = scanner.super$StringScanner$readChar();
+          scanner._adjustLineAndColumn$1(character);
+          if (character === 10)
+            break;
+          t3.writeCharCode$1(character);
+        }
+      }
+    },
+    visitColor$1: function(value) {
+      var $name, hexLength, t2, t3, _this = this,
+        t1 = _this._style === C.OutputStyle_compressed;
+      if (t1 && Math.abs(value.alpha - 1) < $.$get$epsilon()) {
+        $name = $.$get$namesByColor().$index(0, value);
+        hexLength = _this._canUseShortHex$1(value) ? 4 : 7;
+        if ($name != null && $name.length <= hexLength)
+          _this._serialize$_buffer.write$1(0, $name);
+        else {
+          t1 = _this._serialize$_buffer;
+          if (_this._canUseShortHex$1(value)) {
+            t1.writeCharCode$1(35);
+            t1.writeCharCode$1(T.hexCharFor(value.get$red() & 15));
+            t1.writeCharCode$1(T.hexCharFor(value.get$green() & 15));
+            t1.writeCharCode$1(T.hexCharFor(value.get$blue() & 15));
+          } else {
+            t1.writeCharCode$1(35);
+            _this._writeHexComponent$1(value.get$red());
+            _this._writeHexComponent$1(value.get$green());
+            _this._writeHexComponent$1(value.get$blue());
+          }
+        }
+        return;
+      }
+      if (value.get$original() != null)
+        _this._serialize$_buffer.write$1(0, value.get$original());
+      else {
+        t2 = $.$get$namesByColor();
+        if (t2.containsKey$1(value) && !(Math.abs(value.alpha - 0) < $.$get$epsilon()))
+          _this._serialize$_buffer.write$1(0, t2.$index(0, value));
+        else {
+          t2 = value.alpha;
+          t3 = _this._serialize$_buffer;
+          if (Math.abs(t2 - 1) < $.$get$epsilon()) {
+            t3.writeCharCode$1(35);
+            _this._writeHexComponent$1(value.get$red());
+            _this._writeHexComponent$1(value.get$green());
+            _this._writeHexComponent$1(value.get$blue());
+          } else {
+            t3.write$1(0, "rgba(" + H.S(value.get$red()));
+            t3.write$1(0, t1 ? "," : ", ");
+            t3.write$1(0, value.get$green());
+            t3.write$1(0, t1 ? "," : ", ");
+            t3.write$1(0, value.get$blue());
+            t3.write$1(0, t1 ? "," : ", ");
+            _this._writeNumber$1(t2);
+            t3.writeCharCode$1(41);
+          }
+        }
+      }
+    },
+    _canUseShortHex$1: function(color) {
+      var t1 = color.get$red();
+      if ((t1 & 15) === C.JSInt_methods._shrOtherPositive$1(t1, 4)) {
+        t1 = color.get$green();
+        if ((t1 & 15) === C.JSInt_methods._shrOtherPositive$1(t1, 4)) {
+          t1 = color.get$blue();
+          t1 = (t1 & 15) === C.JSInt_methods._shrOtherPositive$1(t1, 4);
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    _writeHexComponent$1: function(color) {
+      var t1 = this._serialize$_buffer;
+      t1.writeCharCode$1(T.hexCharFor(C.JSInt_methods._shrOtherPositive$1(color, 4)));
+      t1.writeCharCode$1(T.hexCharFor(color & 15));
+    },
+    visitList$1: function(value) {
+      var t2, singleton, t3, t4, _this = this,
+        t1 = value.hasBrackets;
+      if (t1)
+        _this._serialize$_buffer.writeCharCode$1(91);
+      else if (value._list$_contents.length === 0) {
+        if (!_this._serialize$_inspect)
+          throw H.wrapException(E.SassScriptException$("() isn't a valid CSS value."));
+        _this._serialize$_buffer.write$1(0, "()");
+        return;
+      }
+      t2 = _this._serialize$_inspect;
+      singleton = t2 && value._list$_contents.length === 1 && value.separator === C.ListSeparator_comma;
+      if (singleton && !t1)
+        _this._serialize$_buffer.writeCharCode$1(40);
+      t3 = value._list$_contents;
+      t3 = t2 ? t3 : new H.WhereIterable(t3, new N._SerializeVisitor_visitList_closure(), H._arrayInstanceType(t3)._eval$1("WhereIterable<1>"));
+      if (value.separator === C.ListSeparator_space)
+        t4 = " ";
+      else
+        t4 = _this._style === C.OutputStyle_compressed ? "," : ", ";
+      _this._writeBetween$3(t3, t4, t2 ? new N._SerializeVisitor_visitList_closure0(_this, value) : new N._SerializeVisitor_visitList_closure1(_this));
+      if (singleton) {
+        t2 = _this._serialize$_buffer;
+        t2.writeCharCode$1(44);
+        if (!t1)
+          t2.writeCharCode$1(41);
+      }
+      if (t1)
+        _this._serialize$_buffer.writeCharCode$1(93);
+    },
+    _elementNeedsParens$2: function(separator, value) {
+      var t1;
+      if (value instanceof D.SassList) {
+        if (value._list$_contents.length < 2)
+          return false;
+        if (value.hasBrackets)
+          return false;
+        t1 = value.separator;
+        return separator === C.ListSeparator_comma ? t1 === C.ListSeparator_comma : t1 !== C.ListSeparator_undecided;
+      }
+      return false;
+    },
+    visitMap$1: function(map) {
+      var t1, t2, _this = this;
+      if (!_this._serialize$_inspect)
+        throw H.wrapException(E.SassScriptException$(map.toString$0(0) + " isn't a valid CSS value."));
+      t1 = _this._serialize$_buffer;
+      t1.writeCharCode$1(40);
+      t2 = map.contents;
+      _this._writeBetween$3(t2.get$keys(t2), ", ", new N._SerializeVisitor_visitMap_closure(_this, map));
+      t1.writeCharCode$1(41);
+    },
+    _writeMapElement$1: function(value) {
+      var needsParens = value instanceof D.SassList && value.separator === C.ListSeparator_comma && !value.hasBrackets;
+      if (needsParens)
+        this._serialize$_buffer.writeCharCode$1(40);
+      value.accept$1(this);
+      if (needsParens)
+        this._serialize$_buffer.writeCharCode$1(41);
+    },
+    visitNumber$1: function(value) {
+      var _this = this,
+        t1 = value.asSlash;
+      if (t1 != null) {
+        _this.visitNumber$1(t1.item1);
+        _this._serialize$_buffer.writeCharCode$1(47);
+        _this.visitNumber$1(t1.item2);
+        return;
+      }
+      _this._writeNumber$1(value.value);
+      if (!_this._serialize$_inspect) {
+        if (J.get$length$asx(value.get$numeratorUnits()) > 1 || value.get$denominatorUnits().length !== 0)
+          throw H.wrapException(E.SassScriptException$(value.toString$0(0) + " isn't a valid CSS value."));
+        if (J.get$isNotEmpty$asx(value.get$numeratorUnits()))
+          _this._serialize$_buffer.write$1(0, J.get$first$ax(value.get$numeratorUnits()));
+      } else
+        _this._serialize$_buffer.write$1(0, value.get$unitString());
+    },
+    _writeNumber$1: function(number) {
+      var t1, text, text0, _this = this,
+        integer = T.fuzzyIsInt(number) ? J.round$0$n(number) : null;
+      if (integer != null) {
+        t1 = integer >= 1e21 ? _this._removeExponent$1(C.JSInt_methods.toString$0(integer)) : C.JSInt_methods.toString$0(integer);
+        _this._serialize$_buffer.write$1(0, t1);
+        return;
+      }
+      text = number >= 1e21 ? _this._removeExponent$1(C.JSNumber_methods.toString$0(number)) : C.JSNumber_methods.toString$0(number);
+      text0 = _this._style === C.OutputStyle_compressed && C.JSString_methods._codeUnitAt$1(text, 0) === 48 ? C.JSString_methods.substring$1(text, 1) : text;
+      if (text.length < 12) {
+        _this._serialize$_buffer.write$1(0, text0);
+        return;
+      }
+      _this._writeDecimal$1(text0);
+    },
+    _removeExponent$1: function(text) {
+      var buffer, exponent, t2, additionalZeroes, negative,
+        t1 = text.length,
+        i = 0;
+      while (true) {
+        if (!(i < t1)) {
+          buffer = null;
+          exponent = null;
+          break;
+        }
+        c$0: {
+          if (C.JSString_methods._codeUnitAt$1(text, i) !== 101)
+            break c$0;
+          buffer = new P.StringBuffer("");
+          t2 = H.Primitives_stringFromCharCode(C.JSString_methods._codeUnitAt$1(text, 0));
+          buffer._contents = t2;
+          if (i > 2)
+            buffer._contents = t2 + C.JSString_methods.substring$2(text, 2, i);
+          exponent = P.int_parse(C.JSString_methods.substring$2(text, i + 1, t1), null);
+          break;
+        }
+        ++i;
+      }
+      if (buffer == null)
+        return text;
+      if (exponent > 0) {
+        t1 = buffer._contents;
+        additionalZeroes = exponent - (t1.length - 1);
+        for (i = 0; i < additionalZeroes; ++i)
+          t1 = buffer._contents += H.Primitives_stringFromCharCode(48);
+        return t1.charCodeAt(0) == 0 ? t1 : t1;
+      } else {
+        negative = C.JSString_methods._codeUnitAt$1(text, 0) === 45;
+        t1 = (negative ? H.Primitives_stringFromCharCode(45) : "") + "0.";
+        for (i = -1; i > exponent; --i)
+          t1 += H.Primitives_stringFromCharCode(48);
+        if (negative) {
+          t2 = buffer._contents;
+          t2 = C.JSString_methods.substring$1(t2.charCodeAt(0) == 0 ? t2 : t2, 1);
+        } else
+          t2 = buffer;
+        t2 = t1 + H.S(t2);
+        return t2.charCodeAt(0) == 0 ? t2 : t2;
+      }
+    },
+    _writeDecimal$1: function(text) {
+      var t1, t2, textIndex, codeUnit, digits, t3, digitsIndex, digitsIndex0, textIndex0, newDigit, i;
+      for (t1 = text.length, t2 = this._serialize$_buffer, textIndex = 0; textIndex < t1; ++textIndex) {
+        codeUnit = C.JSString_methods._codeUnitAt$1(text, textIndex);
+        if (codeUnit === 46) {
+          if (textIndex === t1 - 2 && C.JSString_methods.codeUnitAt$1(text, t1 - 1) === 48)
+            return;
+          t2.writeCharCode$1(codeUnit);
+          ++textIndex;
+          break;
+        }
+        t2.writeCharCode$1(codeUnit);
+      }
+      if (textIndex === t1)
+        return;
+      digits = new Uint8Array(10);
+      t3 = digits.length;
+      digitsIndex = 0;
+      while (true) {
+        if (!(textIndex < t1 && digitsIndex < t3))
+          break;
+        digitsIndex0 = digitsIndex + 1;
+        textIndex0 = textIndex + 1;
+        digits[digitsIndex] = C.JSString_methods._codeUnitAt$1(text, textIndex) - 48;
+        digitsIndex = digitsIndex0;
+        textIndex = textIndex0;
+      }
+      if (textIndex !== t1 && C.JSString_methods._codeUnitAt$1(text, textIndex) - 48 >= 5)
+        for (; digitsIndex >= 0; digitsIndex = digitsIndex0) {
+          digitsIndex0 = digitsIndex - 1;
+          newDigit = digits[digitsIndex0] + 1;
+          digits[digitsIndex0] = newDigit;
+          if (newDigit !== 10)
+            break;
+        }
+      while (true) {
+        if (!(digitsIndex > 0 && digits[digitsIndex - 1] === 0))
+          break;
+        --digitsIndex;
+      }
+      for (i = 0; i < digitsIndex; ++i)
+        t2.writeCharCode$1(48 + digits[i]);
+    },
+    _visitQuotedString$2$forceDoubleQuote: function(string, forceDoubleQuote) {
+      var t1, includesSingleQuote, includesDoubleQuote, i, char, t2, next, quote, _this = this,
+        buffer = forceDoubleQuote ? _this._serialize$_buffer : new P.StringBuffer("");
+      if (forceDoubleQuote)
+        buffer.writeCharCode$1(34);
+      for (t1 = string.length, includesSingleQuote = false, includesDoubleQuote = false, i = 0; i < t1; ++i) {
+        char = C.JSString_methods._codeUnitAt$1(string, i);
+        switch (char) {
+          case 39:
+            if (forceDoubleQuote)
+              buffer.writeCharCode$1(39);
+            else {
+              if (includesDoubleQuote) {
+                _this._visitQuotedString$2$forceDoubleQuote(string, true);
+                return;
+              } else
+                buffer.writeCharCode$1(39);
+              includesSingleQuote = true;
+            }
+            break;
+          case 34:
+            if (forceDoubleQuote) {
+              buffer.writeCharCode$1(92);
+              buffer.writeCharCode$1(34);
+            } else {
+              if (includesSingleQuote) {
+                _this._visitQuotedString$2$forceDoubleQuote(string, true);
+                return;
+              } else
+                buffer.writeCharCode$1(34);
+              includesDoubleQuote = true;
+            }
+            break;
+          case 0:
+          case 1:
+          case 2:
+          case 3:
+          case 4:
+          case 5:
+          case 6:
+          case 7:
+          case 8:
+          case 10:
+          case 11:
+          case 12:
+          case 13:
+          case 14:
+          case 15:
+          case 16:
+          case 17:
+          case 18:
+          case 19:
+          case 20:
+          case 21:
+          case 22:
+          case 23:
+          case 24:
+          case 25:
+          case 26:
+          case 27:
+          case 28:
+          case 29:
+          case 30:
+          case 31:
+            buffer.writeCharCode$1(92);
+            if (char > 15) {
+              t2 = char >>> 4;
+              buffer.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+            }
+            t2 = char & 15;
+            buffer.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+            t2 = i + 1;
+            if (t1 === t2)
+              break;
+            next = C.JSString_methods._codeUnitAt$1(string, t2);
+            if (T.isHex(next) || next === 32 || next === 9)
+              buffer.writeCharCode$1(32);
+            break;
+          case 92:
+            buffer.writeCharCode$1(92);
+            buffer.writeCharCode$1(92);
+            break;
+          default:
+            buffer.writeCharCode$1(char);
+            break;
+        }
+      }
+      if (forceDoubleQuote)
+        buffer.writeCharCode$1(34);
+      else {
+        quote = includesDoubleQuote ? 39 : 34;
+        t1 = _this._serialize$_buffer;
+        t1.writeCharCode$1(quote);
+        t1.write$1(0, buffer);
+        t1.writeCharCode$1(quote);
+      }
+    },
+    _visitQuotedString$1: function(string) {
+      return this._visitQuotedString$2$forceDoubleQuote(string, false);
+    },
+    _visitUnquotedString$1: function(string) {
+      var t1, t2, afterNewline, i, char;
+      for (t1 = string.length, t2 = this._serialize$_buffer, afterNewline = false, i = 0; i < t1; ++i) {
+        char = C.JSString_methods._codeUnitAt$1(string, i);
+        switch (char) {
+          case 10:
+            t2.writeCharCode$1(32);
+            afterNewline = true;
+            break;
+          case 32:
+            if (!afterNewline)
+              t2.writeCharCode$1(32);
+            break;
+          default:
+            t2.writeCharCode$1(char);
+            afterNewline = false;
+            break;
+        }
+      }
+    },
+    visitComplexSelector$1: function(complex) {
+      var t1, t2, t3, t4, lastComponent, _i, component, t5;
+      for (t1 = complex.components, t2 = t1.length, t3 = this._serialize$_buffer, t4 = this._style === C.OutputStyle_compressed, lastComponent = null, _i = 0; _i < t2; ++_i, lastComponent = component) {
+        component = t1[_i];
+        if (lastComponent != null)
+          if (!(t4 && lastComponent instanceof S.Combinator))
+            t5 = !(t4 && component instanceof S.Combinator);
+          else
+            t5 = false;
+        else
+          t5 = false;
+        if (t5)
+          t3.write$1(0, " ");
+        if (component instanceof X.CompoundSelector)
+          this.visitCompoundSelector$1(component);
+        else
+          t3.write$1(0, component);
+      }
+    },
+    visitCompoundSelector$1: function(compound) {
+      var t2, t3, _i,
+        t1 = this._serialize$_buffer,
+        start = t1.get$length(t1);
+      for (t2 = compound.components, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t2[_i].accept$1(this);
+      if (t1.get$length(t1) === start)
+        t1.writeCharCode$1(42);
+    },
+    visitSelectorList$1: function(list) {
+      var complexes, t1, t2, t3, first, t4, _this = this;
+      if (_this._serialize$_inspect)
+        complexes = list.components;
+      else {
+        t1 = list.components;
+        complexes = new H.WhereIterable(t1, new N._SerializeVisitor_visitSelectorList_closure(), H._arrayInstanceType(t1)._eval$1("WhereIterable<1>"));
+      }
+      for (t1 = J.get$iterator$ax(complexes), t2 = _this._style !== C.OutputStyle_compressed, t3 = _this._serialize$_buffer, first = true; t1.moveNext$0();) {
+        t4 = t1.get$current(t1);
+        if (first)
+          first = false;
+        else {
+          t3.writeCharCode$1(44);
+          if (t4.lineBreak) {
+            if (t2)
+              t3.write$1(0, "\n");
+          } else if (t2)
+            t3.writeCharCode$1(32);
+        }
+        _this.visitComplexSelector$1(t4);
+      }
+    },
+    visitPseudoSelector$1: function(pseudo) {
+      var t4, t5, t6,
+        t1 = pseudo.selector,
+        t2 = t1 == null,
+        t3 = !t2;
+      if (t3 && pseudo.name === "not" && t1.get$isInvisible())
+        return;
+      t4 = this._serialize$_buffer;
+      t4.writeCharCode$1(58);
+      if (!pseudo.isSyntacticClass)
+        t4.writeCharCode$1(58);
+      t4.write$1(0, pseudo.name);
+      t5 = pseudo.argument;
+      t6 = t5 == null;
+      if (t6 && t2)
+        return;
+      t4.writeCharCode$1(40);
+      if (!t6) {
+        t4.write$1(0, t5);
+        if (t3)
+          t4.writeCharCode$1(32);
+      }
+      if (t3)
+        this.visitSelectorList$1(t1);
+      t4.writeCharCode$1(41);
+    },
+    _write$1: function(value) {
+      return this._serialize$_buffer.forSpan$2(value.get$span(), new N._SerializeVisitor__write_closure(this, value));
+    },
+    _serialize$_visitChildren$1: function(children) {
+      var _this = this, t1 = {},
+        t2 = _this._serialize$_buffer;
+      t2.writeCharCode$1(123);
+      if (children.every$1(children, _this.get$_isInvisible())) {
+        t2.writeCharCode$1(125);
+        return;
+      }
+      _this._writeLineFeed$0();
+      t1.previous = null;
+      ++_this._indentation;
+      new N._SerializeVisitor__visitChildren_closure(t1, _this, children).call$0();
+      --_this._indentation;
+      t1 = t1.previous;
+      if ((type$.legacy_CssParentNode._is(t1) ? t1.get$isChildless() : !type$.legacy_CssComment._is(t1)) && _this._style !== C.OutputStyle_compressed)
+        t2.writeCharCode$1(59);
+      _this._writeLineFeed$0();
+      _this._writeIndentation$0();
+      t2.writeCharCode$1(125);
+    },
+    _writeLineFeed$0: function() {
+      if (this._style !== C.OutputStyle_compressed)
+        this._serialize$_buffer.write$1(0, "\n");
+    },
+    _writeIndentation$0: function() {
+      var _this = this;
+      if (_this._style === C.OutputStyle_compressed)
+        return;
+      _this._writeTimes$2(_this._indentCharacter, _this._indentation * _this._indentWidth);
+    },
+    _writeTimes$2: function(char, times) {
+      var t1, i;
+      for (t1 = this._serialize$_buffer, i = 0; i < times; ++i)
+        t1.writeCharCode$1(char);
+    },
+    _writeBetween$1$3: function(iterable, text, callback) {
+      var t1, t2, first, value;
+      for (t1 = J.get$iterator$ax(iterable), t2 = this._serialize$_buffer, first = true; t1.moveNext$0();) {
+        value = t1.get$current(t1);
+        if (first)
+          first = false;
+        else
+          t2.write$1(0, text);
+        callback.call$1(value);
+      }
+    },
+    _writeBetween$3: function(iterable, text, callback) {
+      return this._writeBetween$1$3(iterable, text, callback, type$.dynamic);
+    },
+    _isInvisible$1: function(node) {
+      if (this._serialize$_inspect)
+        return false;
+      if (this._style === C.OutputStyle_compressed && type$.legacy_CssComment._is(node) && J._codeUnitAt$1$s(node.text, 2) !== 33)
+        return true;
+      if (type$.legacy_CssParentNode._is(node)) {
+        if (type$.legacy_CssAtRule._is(node))
+          return false;
+        if (type$.legacy_CssStyleRule._is(node) && node.selector.value.get$isInvisible())
+          return true;
+        return J.every$1$ax(node.get$children(node), this.get$_isInvisible());
+      } else
+        return false;
+    }
+  };
+  N._SerializeVisitor_visitCssComment_closure.prototype = {
+    call$0: function() {
+      var t2, t3, minimumIndentation,
+        t1 = this.$this;
+      if (t1._style === C.OutputStyle_compressed && J._codeUnitAt$1$s(this.node.text, 2) !== 33)
+        return;
+      t2 = this.node;
+      t3 = t2.text;
+      minimumIndentation = t1._minimumIndentation$1(t3);
+      if (minimumIndentation == null) {
+        t1._writeIndentation$0();
+        t1._serialize$_buffer.write$1(0, t3);
+        return;
+      }
+      t2 = t2.span;
+      if (t2 != null) {
+        t2 = Y.FileLocation$_(t2.file, t2._file$_start);
+        minimumIndentation = Math.min(minimumIndentation, t2.file.getColumn$1(t2.offset));
+      }
+      t1._writeIndentation$0();
+      t1._writeWithIndent$2(t3, minimumIndentation);
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssAtRule_closure.prototype = {
+    call$0: function() {
+      var t3,
+        t1 = this.$this,
+        t2 = t1._serialize$_buffer;
+      t2.writeCharCode$1(64);
+      t3 = this.node;
+      t1._write$1(t3.name);
+      t3 = t3.value;
+      if (t3 != null) {
+        t2.writeCharCode$1(32);
+        t1._write$1(t3);
+      }
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssMediaRule_closure.prototype = {
+    call$0: function() {
+      var t3, t4,
+        t1 = this.$this,
+        t2 = t1._serialize$_buffer;
+      t2.write$1(0, "@media");
+      t3 = t1._style === C.OutputStyle_compressed;
+      if (t3) {
+        t4 = C.JSArray_methods.get$first(this.node.queries);
+        t4 = !(t4.modifier == null && t4.type == null);
+      } else
+        t4 = true;
+      if (t4)
+        t2.writeCharCode$1(32);
+      t2 = t3 ? "," : ", ";
+      t1._writeBetween$3(this.node.queries, t2, t1.get$_visitMediaQuery());
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssImport_closure.prototype = {
+    call$0: function() {
+      var t3, t4, t5, t6,
+        t1 = this.$this,
+        t2 = t1._serialize$_buffer;
+      t2.write$1(0, "@import");
+      t3 = t1._style === C.OutputStyle_compressed;
+      t4 = !t3;
+      if (t4)
+        t2.writeCharCode$1(32);
+      t5 = this.node;
+      t2.forSpan$2(t5.url.get$span(), new N._SerializeVisitor_visitCssImport__closure(t1, t5));
+      t6 = t5.supports;
+      if (t6 != null) {
+        if (t4)
+          t2.writeCharCode$1(32);
+        t1._write$1(t6);
+      }
+      t5 = t5.media;
+      if (t5 != null) {
+        if (t4)
+          t2.writeCharCode$1(32);
+        t2 = t3 ? "," : ", ";
+        t1._writeBetween$3(t5, t2, t1.get$_visitMediaQuery());
+      }
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssImport__closure.prototype = {
+    call$0: function() {
+      var t1 = this.node.url;
+      return this.$this._writeImportUrl$1(t1.get$value(t1));
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor_visitCssKeyframeBlock_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._style === C.OutputStyle_compressed ? "," : ", ",
+        t3 = t1._serialize$_buffer;
+      return t1._writeBetween$3(this.node.selector.value, t2, t3.get$write(t3));
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor_visitCssStyleRule_closure.prototype = {
+    call$0: function() {
+      var t1 = this.node.selector.value;
+      t1.toString;
+      return this.$this.visitSelectorList$1(t1);
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor_visitCssSupportsRule_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._serialize$_buffer;
+      t2.write$1(0, "@supports");
+      if (!(t1._style === C.OutputStyle_compressed && J.codeUnitAt$1$s(this.node.condition.value, 0) === 40))
+        t2.writeCharCode$1(32);
+      t1._write$1(this.node.condition);
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssDeclaration_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = this.node;
+      if (t1._style === C.OutputStyle_compressed)
+        t1._writeFoldedValue$1(t2);
+      else
+        t1._writeReindentedValue$1(t2);
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssDeclaration_closure0.prototype = {
+    call$0: function() {
+      return this.node.value.value.accept$1(this.$this);
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor_visitList_closure.prototype = {
+    call$1: function(element) {
+      return !element.get$isBlank();
+    },
+    $signature: 53
+  };
+  N._SerializeVisitor_visitList_closure0.prototype = {
+    call$1: function(element) {
+      var t1 = this.$this,
+        needsParens = t1._elementNeedsParens$2(this.value.separator, element);
+      if (needsParens)
+        t1._serialize$_buffer.writeCharCode$1(40);
+      element.accept$1(t1);
+      if (needsParens)
+        t1._serialize$_buffer.writeCharCode$1(41);
+    },
+    $signature: 116
+  };
+  N._SerializeVisitor_visitList_closure1.prototype = {
+    call$1: function(element) {
+      element.accept$1(this.$this);
+    },
+    $signature: 116
+  };
+  N._SerializeVisitor_visitMap_closure.prototype = {
+    call$1: function(key) {
+      var t1 = this.$this;
+      t1._writeMapElement$1(key);
+      t1._serialize$_buffer.write$1(0, ": ");
+      t1._writeMapElement$1(this.map.contents.$index(0, key));
+    },
+    $signature: 116
+  };
+  N._SerializeVisitor_visitSelectorList_closure.prototype = {
+    call$1: function(complex) {
+      return !complex.get$isInvisible();
+    },
+    $signature: 15
+  };
+  N._SerializeVisitor__write_closure.prototype = {
+    call$0: function() {
+      var t1 = this.value;
+      return this.$this._serialize$_buffer.write$1(0, t1.get$value(t1));
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor__visitChildren_closure.prototype = {
+    call$0: function() {
+      var t1, t2, t3, t4, t5, t6, t7, i, child, t8;
+      for (t1 = this.children._collection$_source, t2 = J.getInterceptor$asx(t1), t3 = this._box_0, t4 = this.$this, t5 = type$.legacy_CssComment, t6 = type$.legacy_CssParentNode, t7 = t4._serialize$_buffer, i = 0; i < t2.get$length(t1); ++i) {
+        child = t2.elementAt$1(t1, i);
+        if (t4._isInvisible$1(child))
+          continue;
+        t8 = t3.previous;
+        if (t8 != null) {
+          if (t6._is(t8) ? t8.get$isChildless() : !t5._is(t8))
+            t7.writeCharCode$1(59);
+          t8 = t4._style !== C.OutputStyle_compressed;
+          if (t8)
+            t7.write$1(0, "\n");
+          if (t3.previous.get$isGroupEnd())
+            if (t8)
+              t7.write$1(0, "\n");
+        }
+        t3.previous = child;
+        child.accept$1(t4);
+      }
+    },
+    $signature: 0
+  };
+  N.OutputStyle.prototype = {
+    toString$0: function(_) {
+      return this._serialize$_name;
+    }
+  };
+  N.LineFeed.prototype = {
+    toString$0: function(_) {
+      return "lf";
+    }
+  };
+  N.SerializeResult.prototype = {};
+  N.withWarnCallback_closure.prototype = {
+    call$0: function() {
+      return this.callback.call$0();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: function() {
+      return this.T._eval$1("0*()");
+    }
+  };
+  L.Entry.prototype = {
+    compareTo$1: function(_, other) {
+      var t1, t2, t3,
+        res = this.target.compareTo$1(0, other.target);
+      if (res !== 0)
+        return res;
+      t1 = this.source;
+      t2 = J.toString$0$(t1.file.url);
+      t3 = other.source;
+      res = C.JSString_methods.compareTo$1(t2, J.toString$0$(t3.file.url));
+      if (res !== 0)
+        return res;
+      return t1.compareTo$1(0, t3);
+    },
+    $isComparable: 1,
+    get$source: function() {
+      return this.source;
+    },
+    get$target: function() {
+      return this.target;
+    },
+    get$identifierName: function() {
+      return this.identifierName;
+    }
+  };
+  T.Mapping.prototype = {};
+  T.SingleMapping.prototype = {
+    toJson$1$includeSourceContents: function(includeSourceContents) {
+      var t1, t2, line, column, srcLine, srcColumn, srcUrlId, srcNameId, first, _i, entry, nextLine, i, t3, t4, _i0, segment, column0, t5, newUrlId, srcLine0, srcColumn0, srcNameId0, result, _this = this,
+        buff = new P.StringBuffer("");
+      for (t1 = _this.lines, t2 = t1.length, line = 0, column = 0, srcLine = 0, srcColumn = 0, srcUrlId = 0, srcNameId = 0, first = true, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        entry = t1[_i];
+        nextLine = entry.line;
+        if (nextLine > line) {
+          for (i = line; i < nextLine; ++i)
+            buff._contents += ";";
+          line = nextLine;
+          column = 0;
+          first = true;
+        }
+        for (t3 = entry.entries, t4 = t3.length, _i0 = 0; _i0 < t3.length; t3.length === t4 || (0, H.throwConcurrentModificationError)(t3), ++_i0, column = column0, first = false) {
+          segment = t3[_i0];
+          if (!first)
+            buff._contents += ",";
+          column0 = segment.column;
+          t5 = L.encodeVlq(column0 - column);
+          t5 = P.StringBuffer__writeAll(buff._contents, t5, "");
+          buff._contents = t5;
+          newUrlId = segment.sourceUrlId;
+          if (newUrlId == null)
+            continue;
+          t5 = P.StringBuffer__writeAll(t5, L.encodeVlq(newUrlId - srcUrlId), "");
+          buff._contents = t5;
+          srcLine0 = segment.sourceLine;
+          t5 = P.StringBuffer__writeAll(t5, L.encodeVlq(srcLine0 - srcLine), "");
+          buff._contents = t5;
+          srcColumn0 = segment.sourceColumn;
+          t5 = P.StringBuffer__writeAll(t5, L.encodeVlq(srcColumn0 - srcColumn), "");
+          buff._contents = t5;
+          srcNameId0 = segment.sourceNameId;
+          if (srcNameId0 == null) {
+            srcUrlId = newUrlId;
+            srcColumn = srcColumn0;
+            srcLine = srcLine0;
+            continue;
+          }
+          buff._contents = P.StringBuffer__writeAll(t5, L.encodeVlq(srcNameId0 - srcNameId), "");
+          srcNameId = srcNameId0;
+          srcUrlId = newUrlId;
+          srcColumn = srcColumn0;
+          srcLine = srcLine0;
+        }
+      }
+      t1 = _this.sourceRoot;
+      if (t1 == null)
+        t1 = "";
+      t2 = buff._contents;
+      result = P.LinkedHashMap_LinkedHashMap$_literal(["version", 3, "sourceRoot", t1, "sources", _this.urls, "names", _this.names, "mappings", t2.charCodeAt(0) == 0 ? t2 : t2], type$.legacy_String, type$.legacy_Object);
+      t1 = _this.targetUrl;
+      if (t1 != null)
+        result.$indexSet(0, "file", t1);
+      if (includeSourceContents) {
+        t1 = _this.files;
+        t2 = H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>");
+        result.$indexSet(0, "sourcesContent", P.List_List$from(new H.MappedListIterable(t1, new T.SingleMapping_toJson_closure(), t2), true, t2._eval$1("ListIterable.E")));
+      }
+      _this.extensions.forEach$1(0, new T.SingleMapping_toJson_closure0(result));
+      return result;
+    },
+    toJson$0: function() {
+      return this.toJson$1$includeSourceContents(false);
+    },
+    toString$0: function(_) {
+      var _this = this,
+        t1 = H.getRuntimeType(_this).toString$0(0);
+      t1 + " : [";
+      t1 = t1 + " : [targetUrl: " + H.S(_this.targetUrl) + ", sourceRoot: " + H.S(_this.sourceRoot) + ", urls: " + H.S(_this.urls) + ", names: " + H.S(_this.names) + ", lines: " + H.S(_this.lines) + "]";
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  T.SingleMapping_SingleMapping$fromEntries_closure.prototype = {
+    call$0: function() {
+      var t1 = this.urls;
+      return t1.get$length(t1);
+    },
+    $signature: 11
+  };
+  T.SingleMapping_SingleMapping$fromEntries_closure0.prototype = {
+    call$0: function() {
+      return type$.legacy_FileLocation._as(this.sourceEntry.get$source()).file;
+    },
+    $signature: 124
+  };
+  T.SingleMapping_SingleMapping$fromEntries_closure1.prototype = {
+    call$1: function(i) {
+      return this.files.$index(0, i);
+    },
+    $signature: 245
+  };
+  T.SingleMapping_toJson_closure.prototype = {
+    call$1: function(file) {
+      return file == null ? null : P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(file._decodedChars, 0, null), 0, null);
+    },
+    $signature: 246
+  };
+  T.SingleMapping_toJson_closure0.prototype = {
+    call$2: function($name, value) {
+      this.result.$indexSet(0, $name, value);
+      return value;
+    },
+    $signature: 247
+  };
+  T.TargetLineEntry.prototype = {
+    toString$0: function(_) {
+      return H.getRuntimeType(this).toString$0(0) + ": " + this.line + " " + H.S(this.entries);
+    }
+  };
+  T.TargetEntry.prototype = {
+    toString$0: function(_) {
+      var _this = this;
+      return H.getRuntimeType(_this).toString$0(0) + ": (" + _this.column + ", " + H.S(_this.sourceUrlId) + ", " + H.S(_this.sourceLine) + ", " + H.S(_this.sourceColumn) + ", " + H.S(_this.sourceNameId) + ")";
+    }
+  };
+  Y.SourceFile.prototype = {
+    get$length: function(_) {
+      return this._decodedChars.length;
+    },
+    get$lines: function() {
+      return this._lineStarts.length;
+    },
+    SourceFile$decoded$2$url: function(decodedChars, url) {
+      var t1, t2, t3, i, c, j;
+      for (t1 = this._decodedChars, t2 = t1.length, t3 = this._lineStarts, i = 0; i < t2; ++i) {
+        c = t1[i];
+        if (c === 13) {
+          j = i + 1;
+          if (j >= t2 || t1[j] !== 10)
+            c = 10;
+        }
+        if (c === 10)
+          t3.push(i + 1);
+      }
+    },
+    span$2: function(start, end) {
+      return Y._FileSpan$(this, start, end == null ? this._decodedChars.length : end);
+    },
+    span$1: function(start) {
+      return this.span$2(start, null);
+    },
+    getLine$1: function(offset) {
+      var t1, _this = this;
+      if (offset < 0)
+        throw H.wrapException(P.RangeError$("Offset may not be negative, was " + offset + "."));
+      else if (offset > _this._decodedChars.length)
+        throw H.wrapException(P.RangeError$("Offset " + offset + string$.x20must_ + _this.get$length(_this) + "."));
+      t1 = _this._lineStarts;
+      if (offset < C.JSArray_methods.get$first(t1))
+        return -1;
+      if (offset >= C.JSArray_methods.get$last(t1))
+        return t1.length - 1;
+      if (_this._isNearCachedLine$1(offset))
+        return _this._cachedLine;
+      return _this._cachedLine = _this._binarySearch$1(offset) - 1;
+    },
+    _isNearCachedLine$1: function(offset) {
+      var t2, t3,
+        t1 = this._cachedLine;
+      if (t1 == null)
+        return false;
+      t2 = this._lineStarts;
+      if (offset < t2[t1])
+        return false;
+      t3 = t2.length;
+      if (t1 >= t3 - 1 || offset < t2[t1 + 1])
+        return true;
+      if (t1 >= t3 - 2 || offset < t2[t1 + 2]) {
+        this._cachedLine = t1 + 1;
+        return true;
+      }
+      return false;
+    },
+    _binarySearch$1: function(offset) {
+      var min, half,
+        t1 = this._lineStarts,
+        max = t1.length - 1;
+      for (min = 0; min < max;) {
+        half = min + C.JSInt_methods._tdivFast$1(max - min, 2);
+        if (t1[half] > offset)
+          max = half;
+        else
+          min = half + 1;
+      }
+      return max;
+    },
+    getColumn$1: function(offset) {
+      var line, lineStart, _this = this;
+      if (offset < 0)
+        throw H.wrapException(P.RangeError$("Offset may not be negative, was " + offset + "."));
+      else if (offset > _this._decodedChars.length)
+        throw H.wrapException(P.RangeError$("Offset " + offset + " must be not be greater than the number of characters in the file, " + _this.get$length(_this) + "."));
+      line = _this.getLine$1(offset);
+      lineStart = _this._lineStarts[line];
+      if (lineStart > offset)
+        throw H.wrapException(P.RangeError$("Line " + H.S(line) + " comes after offset " + offset + "."));
+      return offset - lineStart;
+    },
+    getOffset$1: function(line) {
+      var t1, t2, result, t3;
+      if (line < 0)
+        throw H.wrapException(P.RangeError$("Line may not be negative, was " + H.S(line) + "."));
+      else {
+        t1 = this._lineStarts;
+        t2 = t1.length;
+        if (line >= t2)
+          throw H.wrapException(P.RangeError$("Line " + H.S(line) + " must be less than the number of lines in the file, " + this.get$lines() + "."));
+      }
+      result = t1[line];
+      if (result <= this._decodedChars.length) {
+        t3 = line + 1;
+        t1 = t3 < t2 && result >= t1[t3];
+      } else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(P.RangeError$("Line " + H.S(line) + " doesn't have 0 columns."));
+      return result;
+    }
+  };
+  Y.FileLocation.prototype = {
+    get$sourceUrl: function(_) {
+      return this.file.url;
+    },
+    get$line: function() {
+      return this.file.getLine$1(this.offset);
+    },
+    get$column: function() {
+      return this.file.getColumn$1(this.offset);
+    },
+    pointSpan$0: function() {
+      var t1 = this.offset;
+      return Y._FileSpan$(this.file, t1, t1);
+    },
+    get$offset: function() {
+      return this.offset;
+    }
+  };
+  Y._FileSpan.prototype = {
+    get$sourceUrl: function(_) {
+      return this.file.url;
+    },
+    get$length: function(_) {
+      return this._end - this._file$_start;
+    },
+    get$start: function(_) {
+      return Y.FileLocation$_(this.file, this._file$_start);
+    },
+    get$end: function(_) {
+      return Y.FileLocation$_(this.file, this._end);
+    },
+    get$text: function() {
+      return P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(this.file._decodedChars, this._file$_start, this._end), 0, null);
+    },
+    get$context: function(_) {
+      var _this = this,
+        t1 = _this.file,
+        endOffset = _this._end,
+        endLine = t1.getLine$1(endOffset);
+      if (t1.getColumn$1(endOffset) === 0 && endLine !== 0) {
+        if (endOffset - _this._file$_start === 0)
+          return endLine === t1._lineStarts.length - 1 ? "" : P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1._decodedChars, t1.getOffset$1(endLine), t1.getOffset$1(endLine + 1)), 0, null);
+      } else
+        endOffset = endLine === t1._lineStarts.length - 1 ? t1._decodedChars.length : t1.getOffset$1(endLine + 1);
+      return P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1._decodedChars, t1.getOffset$1(t1.getLine$1(_this._file$_start)), endOffset), 0, null);
+    },
+    _FileSpan$3: function(file, _start, _end) {
+      var t3,
+        t1 = this._end,
+        t2 = this._file$_start;
+      if (t1 < t2)
+        throw H.wrapException(P.ArgumentError$("End " + t1 + " must come after start " + t2 + "."));
+      else {
+        t3 = this.file;
+        if (t1 > t3._decodedChars.length)
+          throw H.wrapException(P.RangeError$("End " + t1 + string$.x20must_ + t3.get$length(t3) + "."));
+        else if (t2 < 0)
+          throw H.wrapException(P.RangeError$("Start may not be negative, was " + t2 + "."));
+      }
+    },
+    compareTo$1: function(_, other) {
+      var result;
+      if (!(other instanceof Y._FileSpan))
+        return this.super$SourceSpanMixin$compareTo(0, other);
+      result = C.JSInt_methods.compareTo$1(this._file$_start, other._file$_start);
+      return result === 0 ? C.JSInt_methods.compareTo$1(this._end, other._end) : result;
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      if (!type$.legacy_FileSpan._is(other))
+        return _this.super$SourceSpanMixin$$eq(0, other);
+      return _this._file$_start === other._file$_start && _this._end === other._end && J.$eq$(_this.file.url, other.file.url);
+    },
+    get$hashCode: function(_) {
+      return Y.SourceSpanMixin.prototype.get$hashCode.call(this, this);
+    },
+    expand$1: function(_, other) {
+      var start, _this = this,
+        t1 = _this.file;
+      if (!J.$eq$(t1.url, other.file.url))
+        throw H.wrapException(P.ArgumentError$('Source URLs "' + H.S(_this.get$sourceUrl(_this)) + '" and  "' + H.S(other.get$sourceUrl(other)) + "\" don't match."));
+      start = Math.min(_this._file$_start, other._file$_start);
+      return Y._FileSpan$(t1, start, Math.max(_this._end, other._end));
+    },
+    $isFileSpan: 1,
+    $isSourceSpanWithContext: 1
+  };
+  U.Highlighter.prototype = {
+    highlight$0: function() {
+      var t2, highlightsByColumn, t3, t4, i, line, lastLine, t5, t6, t7, t8, t9, cur, t10, index, primary, _i, highlight, _this = this,
+        t1 = _this._lines;
+      _this._writeFileStart$1(C.JSArray_methods.get$first(t1).url);
+      t2 = new Array(_this._maxMultilineSpans);
+      t2.fixed$length = Array;
+      highlightsByColumn = H.setRuntimeTypeInfo(t2, type$.JSArray_legacy__Highlight);
+      for (t2 = _this._highlighter$_buffer, t3 = highlightsByColumn.length !== 0, t4 = _this._primaryColor, i = 0; i < t1.length; ++i) {
+        line = t1[i];
+        if (i > 0) {
+          lastLine = t1[i - 1];
+          t5 = lastLine.url;
+          t6 = line.url;
+          if (!J.$eq$(t5, t6)) {
+            _this._writeSidebar$1$end($._glyphs.get$upEnd());
+            t2._contents += "\n";
+            _this._writeFileStart$1(t6);
+          } else if (lastLine.number + 1 !== line.number) {
+            _this._writeSidebar$1$text("...");
+            t2._contents += "\n";
+          }
+        }
+        for (t5 = line.highlights, t6 = new H.ReversedListIterable(t5, H._arrayInstanceType(t5)._eval$1("ReversedListIterable<1>")), t6 = new H.ListIterator(t6, t6.get$length(t6)), t7 = line.number, t8 = line.text, t9 = J.getInterceptor$s(t8); t6.moveNext$0();) {
+          cur = t6.__internal$_current;
+          t10 = cur.span;
+          if (t10.get$start(t10).get$line() != t10.get$end(t10).get$line() && t10.get$start(t10).get$line() === t7 && _this._isOnlyWhitespace$1(t9.substring$2(t8, 0, t10.get$start(t10).get$column()))) {
+            index = C.JSArray_methods.indexOf$1(highlightsByColumn, null);
+            if (index < 0)
+              H.throwExpression(P.ArgumentError$(H.S(highlightsByColumn) + " contains no null elements."));
+            highlightsByColumn[index] = cur;
+          }
+        }
+        _this._writeSidebar$1$line(t7);
+        t2._contents += " ";
+        _this._writeMultilineHighlights$2(line, highlightsByColumn);
+        if (t3)
+          t2._contents += " ";
+        primary = C.JSArray_methods.firstWhere$2$orElse(t5, new U.Highlighter_highlight_closure(), new U.Highlighter_highlight_closure0());
+        t6 = primary != null;
+        if (t6) {
+          t9 = primary.span;
+          t10 = t9.get$start(t9).get$line() === t7 ? t9.get$start(t9).get$column() : 0;
+          _this._writeHighlightedText$4$color(t8, t10, t9.get$end(t9).get$line() === t7 ? t9.get$end(t9).get$column() : t8.length, t4);
+        } else
+          _this._writeText$1(t8);
+        t2._contents += "\n";
+        if (t6)
+          _this._writeIndicator$3(line, primary, highlightsByColumn);
+        for (t6 = t5.length, _i = 0; _i < t5.length; t5.length === t6 || (0, H.throwConcurrentModificationError)(t5), ++_i) {
+          highlight = t5[_i];
+          if (highlight.isPrimary)
+            continue;
+          _this._writeIndicator$3(line, highlight, highlightsByColumn);
+        }
+      }
+      _this._writeSidebar$1$end($._glyphs.get$upEnd());
+      t1 = t2._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _writeFileStart$1: function(url) {
+      var _this = this,
+        t1 = !_this._multipleFiles || url == null,
+        t2 = $._glyphs;
+      if (t1)
+        _this._writeSidebar$1$end(t2.get$downEnd());
+      else {
+        _this._writeSidebar$1$end(t2.get$topLeftCorner());
+        _this._colorize$2$color(new U.Highlighter__writeFileStart_closure(_this), "\x1b[34m");
+        _this._highlighter$_buffer._contents += " " + H.S($.$get$context().prettyUri$1(url));
+      }
+      _this._highlighter$_buffer._contents += "\n";
+    },
+    _writeMultilineHighlights$3$current: function(line, highlightsByColumn, current) {
+      var t1, currentColor, t2, t3, t4, t5, foundCurrent, _i, highlight, t6, t7, startLine, endLine, _this = this, _null = null, _box_0 = {};
+      _box_0.openedOnThisLine = false;
+      _box_0.openedOnThisLineColor = null;
+      t1 = current == null;
+      if (t1)
+        currentColor = _null;
+      else
+        currentColor = current.isPrimary ? _this._primaryColor : _this._secondaryColor;
+      for (t2 = highlightsByColumn.length, t3 = _this._secondaryColor, t1 = !t1, t4 = _this._primaryColor, t5 = _this._highlighter$_buffer, foundCurrent = false, _i = 0; _i < t2; ++_i) {
+        highlight = highlightsByColumn[_i];
+        t6 = highlight == null;
+        t7 = t6 ? _null : highlight.span;
+        t7 = t7 == null ? _null : t7.get$start(t7);
+        startLine = t7 == null ? _null : t7.get$line();
+        t7 = t6 ? _null : highlight.span;
+        t7 = t7 == null ? _null : t7.get$end(t7);
+        endLine = t7 == null ? _null : t7.get$line();
+        if (t1 && highlight === current) {
+          _this._colorize$2$color(new U.Highlighter__writeMultilineHighlights_closure(_this, startLine, line), currentColor);
+          foundCurrent = true;
+        } else if (foundCurrent)
+          _this._colorize$2$color(new U.Highlighter__writeMultilineHighlights_closure0(_this, highlight), currentColor);
+        else if (t6)
+          if (_box_0.openedOnThisLine)
+            _this._colorize$2$color(new U.Highlighter__writeMultilineHighlights_closure1(_this), _box_0.openedOnThisLineColor);
+          else
+            t5._contents += " ";
+        else {
+          t6 = highlight.isPrimary ? t4 : t3;
+          _this._colorize$2$color(new U.Highlighter__writeMultilineHighlights_closure2(_box_0, _this, current, startLine, line, highlight, endLine), t6);
+        }
+      }
+    },
+    _writeMultilineHighlights$2: function(line, highlightsByColumn) {
+      return this._writeMultilineHighlights$3$current(line, highlightsByColumn, null);
+    },
+    _writeHighlightedText$4$color: function(text, startColumn, endColumn, color) {
+      var _this = this;
+      _this._writeText$1(J.getInterceptor$s(text).substring$2(text, 0, startColumn));
+      _this._colorize$2$color(new U.Highlighter__writeHighlightedText_closure(_this, text, startColumn, endColumn), color);
+      _this._writeText$1(C.JSString_methods.substring$2(text, endColumn, text.length));
+    },
+    _writeIndicator$3: function(line, highlight, highlightsByColumn) {
+      var t2, coversWholeLine, _this = this,
+        color = highlight.isPrimary ? _this._primaryColor : _this._secondaryColor,
+        t1 = highlight.span;
+      if (t1.get$start(t1).get$line() == t1.get$end(t1).get$line()) {
+        _this._writeSidebar$0();
+        t1 = _this._highlighter$_buffer;
+        t1._contents += " ";
+        _this._writeMultilineHighlights$3$current(line, highlightsByColumn, highlight);
+        if (highlightsByColumn.length !== 0)
+          t1._contents += " ";
+        _this._colorize$2$color(new U.Highlighter__writeIndicator_closure(_this, line, highlight), color);
+        t1._contents += "\n";
+      } else {
+        t2 = line.number;
+        if (t1.get$start(t1).get$line() === t2) {
+          if (C.JSArray_methods.contains$1(highlightsByColumn, highlight))
+            return;
+          B.replaceFirstNull(highlightsByColumn, highlight);
+          _this._writeSidebar$0();
+          t1 = _this._highlighter$_buffer;
+          t1._contents += " ";
+          _this._writeMultilineHighlights$3$current(line, highlightsByColumn, highlight);
+          _this._colorize$2$color(new U.Highlighter__writeIndicator_closure0(_this, line, highlight), color);
+          t1._contents += "\n";
+        } else if (t1.get$end(t1).get$line() === t2) {
+          coversWholeLine = t1.get$end(t1).get$column() === line.text.length;
+          if (coversWholeLine && highlight.label == null) {
+            B.replaceWithNull(highlightsByColumn, highlight);
+            return;
+          }
+          _this._writeSidebar$0();
+          t1 = _this._highlighter$_buffer;
+          t1._contents += " ";
+          _this._writeMultilineHighlights$3$current(line, highlightsByColumn, highlight);
+          _this._colorize$2$color(new U.Highlighter__writeIndicator_closure1(_this, coversWholeLine, line, highlight), color);
+          t1._contents += "\n";
+          B.replaceWithNull(highlightsByColumn, highlight);
+        }
+      }
+    },
+    _writeArrow$3$beginning: function(line, column, beginning) {
+      var t2,
+        t1 = beginning ? 0 : 1,
+        tabs = this._countTabs$1(J.substring$2$s(line.text, 0, column + t1));
+      t1 = this._highlighter$_buffer;
+      t2 = t1._contents += C.JSString_methods.$mul($._glyphs.get$horizontalLine(), 1 + column + tabs * 3);
+      t1._contents = t2 + "^";
+    },
+    _writeArrow$2: function(line, column) {
+      return this._writeArrow$3$beginning(line, column, true);
+    },
+    _writeLabel$1: function(label) {
+      if (label != null)
+        this._highlighter$_buffer._contents += " " + label;
+    },
+    _writeText$1: function(text) {
+      var t1, t2, cur;
+      text.toString;
+      t1 = new H.CodeUnits(text);
+      t1 = new H.ListIterator(t1, t1.get$length(t1));
+      t2 = this._highlighter$_buffer;
+      for (; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur === 9)
+          t2._contents += C.JSString_methods.$mul(" ", 4);
+        else
+          t2._contents += H.Primitives_stringFromCharCode(cur);
+      }
+    },
+    _writeSidebar$3$end$line$text: function(end, line, text) {
+      var t1 = {};
+      t1.text = text;
+      if (line != null)
+        t1.text = C.JSInt_methods.toString$0(line + 1);
+      this._colorize$2$color(new U.Highlighter__writeSidebar_closure(t1, this, end), "\x1b[34m");
+    },
+    _writeSidebar$1$end: function(end) {
+      return this._writeSidebar$3$end$line$text(end, null, null);
+    },
+    _writeSidebar$1$text: function(text) {
+      return this._writeSidebar$3$end$line$text(null, null, text);
+    },
+    _writeSidebar$1$line: function(line) {
+      return this._writeSidebar$3$end$line$text(null, line, null);
+    },
+    _writeSidebar$0: function() {
+      return this._writeSidebar$3$end$line$text(null, null, null);
+    },
+    _countTabs$1: function(text) {
+      var t1, count, cur;
+      for (t1 = new H.CodeUnits(text), t1 = new H.ListIterator(t1, t1.get$length(t1)), count = 0; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur === 9)
+          ++count;
+      }
+      return count;
+    },
+    _isOnlyWhitespace$1: function(text) {
+      var t1, cur;
+      for (t1 = new H.CodeUnits(text), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur !== 32 && cur !== 9)
+          return false;
+      }
+      return true;
+    },
+    _colorize$2$color: function(callback, color) {
+      var t1 = this._primaryColor != null;
+      if (t1 && color != null)
+        this._highlighter$_buffer._contents += color;
+      callback.call$0();
+      if (t1 && color != null)
+        this._highlighter$_buffer._contents += "\x1b[0m";
+    }
+  };
+  U.Highlighter_closure.prototype = {
+    call$0: function() {
+      var t1 = this.color,
+        t2 = J.getInterceptor$(t1);
+      if (t2.$eq(t1, true))
+        return "\x1b[31m";
+      if (t2.$eq(t1, false))
+        return null;
+      return H._asStringS(t1);
+    },
+    $signature: 12
+  };
+  U.Highlighter$__closure.prototype = {
+    call$1: function(line) {
+      var t1 = line.highlights;
+      t1 = new H.WhereIterable(t1, new U.Highlighter$___closure(), H._arrayInstanceType(t1)._eval$1("WhereIterable<1>"));
+      return t1.get$length(t1);
+    },
+    $signature: 249
+  };
+  U.Highlighter$___closure.prototype = {
+    call$1: function(highlight) {
+      var t1 = highlight.span;
+      return t1.get$start(t1).get$line() != t1.get$end(t1).get$line();
+    },
+    $signature: 115
+  };
+  U.Highlighter$__closure0.prototype = {
+    call$1: function(line) {
+      return line.url;
+    },
+    $signature: 251
+  };
+  U.Highlighter__collateLines_closure.prototype = {
+    call$1: function(highlight) {
+      return J.get$sourceUrl$x(highlight.get$span());
+    },
+    $signature: 43
+  };
+  U.Highlighter__collateLines_closure0.prototype = {
+    call$2: function(highlight1, highlight2) {
+      return highlight1.span.compareTo$1(0, highlight2.span);
+    },
+    $signature: 252
+  };
+  U.Highlighter__collateLines_closure1.prototype = {
+    call$1: function(highlightsForFile) {
+      var t1, t2, t3, t4, context, t5, linesBeforeSpan, url, lineNumber, _i, line, activeHighlights, highlightIndex, oldHighlightLength,
+        lines = H.setRuntimeTypeInfo([], type$.JSArray_legacy__Line);
+      for (t1 = J.getInterceptor$ax(highlightsForFile), t2 = t1.get$iterator(highlightsForFile), t3 = type$.JSArray_legacy__Highlight; t2.moveNext$0();) {
+        t4 = t2.get$current(t2).span;
+        context = t4.get$context(t4);
+        t5 = C.JSString_methods.allMatches$1("\n", C.JSString_methods.substring$2(context, 0, B.findLineStart(context, t4.get$text(), t4.get$start(t4).get$column())));
+        linesBeforeSpan = t5.get$length(t5);
+        url = t4.get$sourceUrl(t4);
+        lineNumber = t4.get$start(t4).get$line() - linesBeforeSpan;
+        for (t4 = context.split("\n"), t5 = t4.length, _i = 0; _i < t5; ++_i) {
+          line = t4[_i];
+          if (lines.length === 0 || lineNumber > C.JSArray_methods.get$last(lines).number)
+            lines.push(new U._Line(line, lineNumber, url, H.setRuntimeTypeInfo([], t3)));
+          ++lineNumber;
+        }
+      }
+      activeHighlights = H.setRuntimeTypeInfo([], t3);
+      for (t2 = lines.length, highlightIndex = 0, _i = 0; _i < lines.length; lines.length === t2 || (0, H.throwConcurrentModificationError)(lines), ++_i) {
+        line = lines[_i];
+        if (!!activeHighlights.fixed$length)
+          H.throwExpression(P.UnsupportedError$("removeWhere"));
+        C.JSArray_methods._removeWhere$2(activeHighlights, new U.Highlighter__collateLines__closure(line), true);
+        oldHighlightLength = activeHighlights.length;
+        for (t3 = t1.skip$1(highlightsForFile, highlightIndex), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+          t4 = t3.get$current(t3);
+          t5 = t4.span;
+          if (t5.get$start(t5).get$line() > line.number)
+            break;
+          if (!J.$eq$(t5.get$sourceUrl(t5), line.url))
+            break;
+          activeHighlights.push(t4);
+        }
+        highlightIndex += activeHighlights.length - oldHighlightLength;
+        C.JSArray_methods.addAll$1(line.highlights, activeHighlights);
+      }
+      return lines;
+    },
+    $signature: 253
+  };
+  U.Highlighter__collateLines__closure.prototype = {
+    call$1: function(highlight) {
+      var t1 = highlight.span,
+        t2 = this.line;
+      return !J.$eq$(t1.get$sourceUrl(t1), t2.url) || t1.get$end(t1).get$line() < t2.number;
+    },
+    $signature: 115
+  };
+  U.Highlighter_highlight_closure.prototype = {
+    call$1: function(highlight) {
+      return highlight.isPrimary;
+    },
+    $signature: 115
+  };
+  U.Highlighter_highlight_closure0.prototype = {
+    call$0: function() {
+      return null;
+    },
+    $signature: 0
+  };
+  U.Highlighter__writeFileStart_closure.prototype = {
+    call$0: function() {
+      this.$this._highlighter$_buffer._contents += C.JSString_methods.$mul($._glyphs.get$horizontalLine(), 2) + ">";
+      return null;
+    },
+    $signature: 1
+  };
+  U.Highlighter__writeMultilineHighlights_closure.prototype = {
+    call$0: function() {
+      var t1 = $._glyphs;
+      t1 = this.startLine === this.line.number ? t1.get$topLeftCorner() : t1.get$bottomLeftCorner();
+      this.$this._highlighter$_buffer._contents += t1;
+    },
+    $signature: 0
+  };
+  U.Highlighter__writeMultilineHighlights_closure0.prototype = {
+    call$0: function() {
+      var t1 = $._glyphs;
+      t1 = this.highlight == null ? t1.get$horizontalLine() : t1.get$cross();
+      this.$this._highlighter$_buffer._contents += t1;
+    },
+    $signature: 0
+  };
+  U.Highlighter__writeMultilineHighlights_closure1.prototype = {
+    call$0: function() {
+      this.$this._highlighter$_buffer._contents += $._glyphs.get$horizontalLine();
+      return null;
+    },
+    $signature: 1
+  };
+  U.Highlighter__writeMultilineHighlights_closure2.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this._box_0,
+        t2 = t1.openedOnThisLine,
+        t3 = $._glyphs,
+        vertical = t2 ? t3.get$cross() : t3.get$verticalLine();
+      if (_this.current != null)
+        _this.$this._highlighter$_buffer._contents += vertical;
+      else {
+        t2 = _this.line;
+        t3 = t2.number;
+        if (_this.startLine === t3) {
+          t2 = _this.$this;
+          t2._colorize$2$color(new U.Highlighter__writeMultilineHighlights__closure(t1, t2), t1.openedOnThisLineColor);
+          t1.openedOnThisLine = true;
+          if (t1.openedOnThisLineColor == null)
+            t1.openedOnThisLineColor = _this.highlight.isPrimary ? t2._primaryColor : t2._secondaryColor;
+        } else {
+          if (_this.endLine === t3) {
+            t3 = _this.highlight.span;
+            t2 = t3.get$end(t3).get$column() === t2.text.length;
+          } else
+            t2 = false;
+          t3 = _this.$this;
+          if (t2) {
+            t1 = _this.highlight.label == null ? $._glyphs.glyphOrAscii$2("\u2514", "\\") : vertical;
+            t3._highlighter$_buffer._contents += t1;
+          } else
+            t3._colorize$2$color(new U.Highlighter__writeMultilineHighlights__closure0(t3, vertical), t1.openedOnThisLineColor);
+        }
+      }
+    },
+    $signature: 0
+  };
+  U.Highlighter__writeMultilineHighlights__closure.prototype = {
+    call$0: function() {
+      var t1 = this._box_0.openedOnThisLine ? "\u252c" : "\u250c";
+      this.$this._highlighter$_buffer._contents += $._glyphs.glyphOrAscii$2(t1, "/");
+    },
+    $signature: 0
+  };
+  U.Highlighter__writeMultilineHighlights__closure0.prototype = {
+    call$0: function() {
+      this.$this._highlighter$_buffer._contents += this.vertical;
+    },
+    $signature: 0
+  };
+  U.Highlighter__writeHighlightedText_closure.prototype = {
+    call$0: function() {
+      var _this = this;
+      return _this.$this._writeText$1(C.JSString_methods.substring$2(_this.text, _this.startColumn, _this.endColumn));
+    },
+    $signature: 1
+  };
+  U.Highlighter__writeIndicator_closure.prototype = {
+    call$0: function() {
+      var tabsBefore, tabsInside,
+        t1 = this.$this,
+        t2 = this.highlight,
+        t3 = t2.span,
+        t4 = t2.isPrimary ? "^" : $._glyphs.get$horizontalLineBold(),
+        startColumn = t3.get$start(t3).get$column(),
+        endColumn = t3.get$end(t3).get$column();
+      t3 = this.line.text;
+      tabsBefore = t1._countTabs$1(J.getInterceptor$s(t3).substring$2(t3, 0, startColumn));
+      tabsInside = t1._countTabs$1(C.JSString_methods.substring$2(t3, startColumn, endColumn));
+      startColumn += tabsBefore * 3;
+      t3 = t1._highlighter$_buffer;
+      t3._contents += C.JSString_methods.$mul(" ", startColumn);
+      t3._contents += C.JSString_methods.$mul(t4, Math.max(endColumn + (tabsBefore + tabsInside) * 3 - startColumn, 1));
+      t1._writeLabel$1(t2.label);
+    },
+    $signature: 0
+  };
+  U.Highlighter__writeIndicator_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.highlight.span;
+      return this.$this._writeArrow$2(this.line, t1.get$start(t1).get$column());
+    },
+    $signature: 1
+  };
+  U.Highlighter__writeIndicator_closure1.prototype = {
+    call$0: function() {
+      var t2, _this = this,
+        t1 = _this.$this;
+      if (_this.coversWholeLine)
+        t1._highlighter$_buffer._contents += C.JSString_methods.$mul($._glyphs.get$horizontalLine(), 3);
+      else {
+        t2 = _this.highlight.span;
+        t1._writeArrow$3$beginning(_this.line, Math.max(t2.get$end(t2).get$column() - 1, 0), false);
+      }
+      t1._writeLabel$1(_this.highlight.label);
+    },
+    $signature: 0
+  };
+  U.Highlighter__writeSidebar_closure.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._highlighter$_buffer,
+        t3 = this._box_0.text;
+      if (t3 == null)
+        t3 = "";
+      t2._contents += C.JSString_methods.padRight$1(t3, t1._paddingBeforeSidebar);
+      t1 = this.end;
+      t2._contents += t1 == null ? $._glyphs.get$verticalLine() : t1;
+    },
+    $signature: 0
+  };
+  U._Highlight.prototype = {
+    toString$0: function(_) {
+      var t1 = this.isPrimary ? "primary " : "",
+        t2 = this.span;
+      t2 = t1 + (H.S(t2.get$start(t2).get$line()) + ":" + t2.get$start(t2).get$column() + "-" + H.S(t2.get$end(t2).get$line()) + ":" + t2.get$end(t2).get$column());
+      t1 = this.label;
+      t1 = t1 != null ? t2 + (" (" + t1 + ")") : t2;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  U._Highlight_closure.prototype = {
+    call$0: function() {
+      var t2, t3, t4, t5,
+        t1 = this.span;
+      if (!(type$.legacy_SourceSpanWithContext._is(t1) && B.findLineStart(t1.get$context(t1), t1.get$text(), t1.get$start(t1).get$column()) != null)) {
+        t2 = V.SourceLocation$(t1.get$start(t1).get$offset(), 0, 0, t1.get$sourceUrl(t1));
+        t3 = t1.get$end(t1).get$offset();
+        t4 = t1.get$sourceUrl(t1);
+        t5 = B.countCodeUnits(t1.get$text(), 10);
+        t1 = X.SourceSpanWithContext$(t2, V.SourceLocation$(t3, U._Highlight__lastLineLength(t1.get$text()), t5, t4), t1.get$text(), t1.get$text());
+      }
+      return U._Highlight__normalizeEndOfLine(U._Highlight__normalizeTrailingNewline(U._Highlight__normalizeNewlines(t1)));
+    },
+    $signature: 254
+  };
+  U._Line.prototype = {
+    toString$0: function(_) {
+      return "" + this.number + ': "' + H.S(this.text) + '" (' + C.JSArray_methods.join$1(this.highlights, ", ") + ")";
+    }
+  };
+  V.SourceLocation.prototype = {
+    distance$1: function(other) {
+      var t1 = this.sourceUrl;
+      if (!J.$eq$(t1, other.get$sourceUrl(other)))
+        throw H.wrapException(P.ArgumentError$('Source URLs "' + H.S(t1) + '" and "' + H.S(other.get$sourceUrl(other)) + "\" don't match."));
+      return Math.abs(this.offset - other.get$offset());
+    },
+    compareTo$1: function(_, other) {
+      var t1 = this.sourceUrl;
+      if (!J.$eq$(t1, other.get$sourceUrl(other)))
+        throw H.wrapException(P.ArgumentError$('Source URLs "' + H.S(t1) + '" and "' + H.S(other.get$sourceUrl(other)) + "\" don't match."));
+      return this.offset - other.get$offset();
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return type$.legacy_SourceLocation._is(other) && J.$eq$(this.sourceUrl, other.get$sourceUrl(other)) && this.offset === other.get$offset();
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.sourceUrl) + this.offset;
+    },
+    toString$0: function(_) {
+      var _this = this,
+        t1 = "<" + H.getRuntimeType(_this).toString$0(0) + ": " + _this.offset + " ",
+        source = _this.sourceUrl;
+      return t1 + (H.S(source == null ? "unknown source" : source) + ":" + (_this.line + 1) + ":" + (_this.column + 1)) + ">";
+    },
+    $isComparable: 1,
+    get$sourceUrl: function(receiver) {
+      return this.sourceUrl;
+    },
+    get$offset: function() {
+      return this.offset;
+    },
+    get$line: function() {
+      return this.line;
+    },
+    get$column: function() {
+      return this.column;
+    }
+  };
+  D.SourceLocationMixin.prototype = {
+    distance$1: function(other) {
+      var _this = this;
+      if (!J.$eq$(_this.file.url, other.get$sourceUrl(other)))
+        throw H.wrapException(P.ArgumentError$('Source URLs "' + H.S(_this.get$sourceUrl(_this)) + '" and "' + H.S(other.get$sourceUrl(other)) + "\" don't match."));
+      return Math.abs(_this.offset - other.get$offset());
+    },
+    compareTo$1: function(_, other) {
+      var _this = this;
+      if (!J.$eq$(_this.file.url, other.get$sourceUrl(other)))
+        throw H.wrapException(P.ArgumentError$('Source URLs "' + H.S(_this.get$sourceUrl(_this)) + '" and "' + H.S(other.get$sourceUrl(other)) + "\" don't match."));
+      return _this.offset - other.get$offset();
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return type$.legacy_SourceLocation._is(other) && J.$eq$(this.file.url, other.get$sourceUrl(other)) && this.offset === other.get$offset();
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.file.url) + this.offset;
+    },
+    toString$0: function(_) {
+      var t1 = this.offset,
+        t2 = "<" + H.getRuntimeType(this).toString$0(0) + ": " + t1 + " ",
+        t3 = this.file,
+        source = t3.url;
+      return t2 + (H.S(source == null ? "unknown source" : source) + ":" + (t3.getLine$1(t1) + 1) + ":" + (t3.getColumn$1(t1) + 1)) + ">";
+    },
+    $isComparable: 1,
+    $isSourceLocation: 1
+  };
+  V.SourceSpanBase.prototype = {
+    SourceSpanBase$3: function(start, end, text) {
+      var t3,
+        t1 = this.end,
+        t2 = this.start;
+      if (!J.$eq$(t1.get$sourceUrl(t1), t2.get$sourceUrl(t2)))
+        throw H.wrapException(P.ArgumentError$('Source URLs "' + H.S(t2.get$sourceUrl(t2)) + '" and  "' + H.S(t1.get$sourceUrl(t1)) + "\" don't match."));
+      else if (t1.get$offset() < t2.get$offset())
+        throw H.wrapException(P.ArgumentError$("End " + t1.toString$0(0) + " must come after start " + t2.toString$0(0) + "."));
+      else {
+        t3 = this.text;
+        if (t3.length !== t2.distance$1(t1))
+          throw H.wrapException(P.ArgumentError$('Text "' + t3 + '" must be ' + t2.distance$1(t1) + " characters long."));
+      }
+    },
+    get$start: function(receiver) {
+      return this.start;
+    },
+    get$end: function(receiver) {
+      return this.end;
+    },
+    get$text: function() {
+      return this.text;
+    }
+  };
+  G.SourceSpanException.prototype = {
+    get$message: function(_) {
+      return this._span_exception$_message;
+    },
+    get$span: function() {
+      return this._span;
+    },
+    toString$1$color: function(_, color) {
+      var _this = this;
+      if (_this.get$span() == null)
+        return _this._span_exception$_message;
+      return "Error on " + _this.get$span().message$2$color(0, _this._span_exception$_message, color);
+    },
+    toString$0: function($receiver) {
+      return this.toString$1$color($receiver, null);
+    },
+    $isException: 1
+  };
+  G.SourceSpanFormatException.prototype = {$isFormatException: 1,
+    get$source: function() {
+      return this.source;
+    }
+  };
+  Y.SourceSpanMixin.prototype = {
+    get$sourceUrl: function(_) {
+      var t1 = this.get$start(this);
+      return t1.get$sourceUrl(t1);
+    },
+    get$length: function(_) {
+      var _this = this;
+      return _this.get$end(_this).get$offset() - _this.get$start(_this).get$offset();
+    },
+    compareTo$1: function(_, other) {
+      var _this = this,
+        result = _this.get$start(_this).compareTo$1(0, other.get$start(other));
+      return result === 0 ? _this.get$end(_this).compareTo$1(0, other.get$end(other)) : result;
+    },
+    message$2$color: function(_, message, color) {
+      var t2, highlight, _this = this,
+        t1 = "line " + (_this.get$start(_this).get$line() + 1) + ", column " + (_this.get$start(_this).get$column() + 1);
+      if (_this.get$sourceUrl(_this) != null) {
+        t2 = _this.get$sourceUrl(_this);
+        t2 = t1 + (" of " + H.S($.$get$context().prettyUri$1(t2)));
+        t1 = t2;
+      }
+      t1 += ": " + H.S(message);
+      highlight = _this.highlight$1$color(color);
+      if (highlight.length !== 0)
+        t1 = t1 + "\n" + highlight;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    message$1: function($receiver, message) {
+      return this.message$2$color($receiver, message, null);
+    },
+    highlight$1$color: function(color) {
+      var _this = this;
+      if (!type$.legacy_SourceSpanWithContext._is(_this) && _this.get$length(_this) === 0)
+        return "";
+      return U.Highlighter$(_this, color).highlight$0();
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      return type$.legacy_SourceSpan._is(other) && _this.get$start(_this).$eq(0, other.get$start(other)) && _this.get$end(_this).$eq(0, other.get$end(other));
+    },
+    get$hashCode: function(_) {
+      var t2, _this = this,
+        t1 = _this.get$start(_this);
+      t1 = t1.get$hashCode(t1);
+      t2 = _this.get$end(_this);
+      return t1 + 31 * t2.get$hashCode(t2);
+    },
+    toString$0: function(_) {
+      var _this = this;
+      return "<" + H.getRuntimeType(_this).toString$0(0) + ": from " + _this.get$start(_this).toString$0(0) + " to " + _this.get$end(_this).toString$0(0) + ' "' + _this.get$text() + '">';
+    },
+    $isComparable: 1,
+    $isSourceSpan: 1
+  };
+  X.SourceSpanWithContext.prototype = {
+    get$context: function(_) {
+      return this._context;
+    }
+  };
+  U.Chain.prototype = {
+    toTrace$0: function() {
+      var t1 = this.traces;
+      return new Y.Trace(P.List_List$unmodifiable(new H.ExpandIterable(t1, new U.Chain_toTrace_closure(), H._arrayInstanceType(t1)._eval$1("ExpandIterable<1,Frame*>")), type$.legacy_Frame), new P._StringStackTrace(null));
+    },
+    toString$0: function(_) {
+      var t1 = this.traces,
+        t2 = H._arrayInstanceType(t1);
+      return new H.MappedListIterable(t1, new U.Chain_toString_closure(new H.MappedListIterable(t1, new U.Chain_toString_closure0(), t2._eval$1("MappedListIterable<1,int*>")).fold$2(0, 0, H.instantiate1(P.math__max$closure(), type$.legacy_int))), t2._eval$1("MappedListIterable<1,String*>")).join$1(0, string$.x3d_____);
+    },
+    $isStackTrace: 1
+  };
+  U.Chain_Chain$parse_closure.prototype = {
+    call$1: function(line) {
+      return line.length !== 0;
+    },
+    $signature: 6
+  };
+  U.Chain_Chain$parse_closure0.prototype = {
+    call$1: function(trace) {
+      return new Y.Trace(P.List_List$unmodifiable(Y.Trace__parseVM(trace), type$.legacy_Frame), new P._StringStackTrace(trace));
+    },
+    $signature: 185
+  };
+  U.Chain_Chain$parse_closure1.prototype = {
+    call$1: function(trace) {
+      return Y.Trace$parseFriendly(trace);
+    },
+    $signature: 185
+  };
+  U.Chain_toTrace_closure.prototype = {
+    call$1: function(trace) {
+      return trace.get$frames();
+    },
+    $signature: 257
+  };
+  U.Chain_toString_closure0.prototype = {
+    call$1: function(trace) {
+      var t1 = trace.get$frames();
+      return new H.MappedListIterable(t1, new U.Chain_toString__closure0(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,int*>")).fold$2(0, 0, H.instantiate1(P.math__max$closure(), type$.legacy_int));
+    },
+    $signature: 258
+  };
+  U.Chain_toString__closure0.prototype = {
+    call$1: function(frame) {
+      return frame.get$location().length;
+    },
+    $signature: 184
+  };
+  U.Chain_toString_closure.prototype = {
+    call$1: function(trace) {
+      var t1 = trace.get$frames();
+      return new H.MappedListIterable(t1, new U.Chain_toString__closure(this.longest), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0);
+    },
+    $signature: 260
+  };
+  U.Chain_toString__closure.prototype = {
+    call$1: function(frame) {
+      return J.padRight$1$s(frame.get$location(), this.longest) + "  " + H.S(frame.get$member()) + "\n";
+    },
+    $signature: 183
+  };
+  A.Frame.prototype = {
+    get$isCore: function() {
+      return this.uri.get$scheme() === "dart";
+    },
+    get$library: function() {
+      var t1 = this.uri;
+      if (t1.get$scheme() === "data")
+        return "data:...";
+      return $.$get$context().prettyUri$1(t1);
+    },
+    get$$package: function() {
+      var t1 = this.uri;
+      if (t1.get$scheme() !== "package")
+        return null;
+      return C.JSArray_methods.get$first(t1.get$path(t1).split("/"));
+    },
+    get$location: function() {
+      var t2, _this = this,
+        t1 = _this.line;
+      if (t1 == null)
+        return _this.get$library();
+      t2 = _this.column;
+      if (t2 == null)
+        return H.S(_this.get$library()) + " " + H.S(t1);
+      return H.S(_this.get$library()) + " " + H.S(t1) + ":" + H.S(t2);
+    },
+    toString$0: function(_) {
+      return H.S(this.get$location()) + " in " + H.S(this.member);
+    },
+    get$uri: function() {
+      return this.uri;
+    },
+    get$line: function() {
+      return this.line;
+    },
+    get$column: function() {
+      return this.column;
+    },
+    get$member: function() {
+      return this.member;
+    }
+  };
+  A.Frame_Frame$parseVM_closure.prototype = {
+    call$0: function() {
+      var match, t2, t3, member, uri, lineAndColumn, line, _null = null,
+        t1 = this.frame;
+      if (t1 === "...")
+        return new A.Frame(P._Uri__Uri(_null, _null, _null, _null), _null, _null, "...");
+      match = $.$get$_vmFrame().firstMatch$1(t1);
+      if (match == null)
+        return new N.UnparsedFrame(P._Uri__Uri(_null, "unparsed", _null, _null), t1);
+      t1 = match._match;
+      t2 = t1[1];
+      t3 = $.$get$_asyncBody();
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, t3, "<async>");
+      member = H.stringReplaceAllUnchecked(t2, "<anonymous closure>", "<fn>");
+      t2 = t1[2];
+      uri = J.startsWith$1$s(t2, "<data:") ? P.Uri_Uri$dataFromString("", _null, _null) : P.Uri_parse(t2);
+      lineAndColumn = t1[3].split(":");
+      t1 = lineAndColumn.length;
+      line = t1 > 1 ? P.int_parse(lineAndColumn[1], _null) : _null;
+      return new A.Frame(uri, line, t1 > 2 ? P.int_parse(lineAndColumn[2], _null) : _null, member);
+    },
+    $signature: 60
+  };
+  A.Frame_Frame$parseV8_closure.prototype = {
+    call$0: function() {
+      var t2, t3, _s4_ = "<fn>",
+        t1 = this.frame,
+        match = $.$get$_v8Frame().firstMatch$1(t1);
+      if (match == null)
+        return new N.UnparsedFrame(P._Uri__Uri(null, "unparsed", null, null), t1);
+      t1 = new A.Frame_Frame$parseV8_closure_parseLocation(t1);
+      t2 = match._match;
+      t3 = t2[2];
+      if (t3 != null) {
+        t2 = t2[1];
+        t2.toString;
+        t2 = H.stringReplaceAllUnchecked(t2, "<anonymous>", _s4_);
+        t2 = H.stringReplaceAllUnchecked(t2, "Anonymous function", _s4_);
+        return t1.call$2(t3, H.stringReplaceAllUnchecked(t2, "(anonymous function)", _s4_));
+      } else
+        return t1.call$2(t2[3], _s4_);
+    },
+    $signature: 60
+  };
+  A.Frame_Frame$parseV8_closure_parseLocation.prototype = {
+    call$2: function($location, member) {
+      var urlMatch, uri, line, _null = null,
+        t1 = $.$get$_v8EvalLocation(),
+        evalMatch = t1.firstMatch$1($location);
+      for (; evalMatch != null;) {
+        $location = evalMatch._match[1];
+        evalMatch = t1.firstMatch$1($location);
+      }
+      if ($location === "native")
+        return new A.Frame(P.Uri_parse("native"), _null, _null, member);
+      urlMatch = $.$get$_v8UrlLocation().firstMatch$1($location);
+      if (urlMatch == null)
+        return new N.UnparsedFrame(P._Uri__Uri(_null, "unparsed", _null, _null), this.frame);
+      t1 = urlMatch._match;
+      uri = A.Frame__uriOrPathToUri(t1[1]);
+      line = P.int_parse(t1[2], _null);
+      t1 = t1[3];
+      return new A.Frame(uri, line, t1 != null ? P.int_parse(t1, _null) : _null, member);
+    },
+    $signature: 263
+  };
+  A.Frame_Frame$_parseFirefoxEval_closure.prototype = {
+    call$0: function() {
+      var t2, member, uri, line, _null = null,
+        t1 = this.frame,
+        match = $.$get$_firefoxEvalLocation().firstMatch$1(t1);
+      if (match == null)
+        return new N.UnparsedFrame(P._Uri__Uri(_null, "unparsed", _null, _null), t1);
+      t1 = match._match;
+      t2 = t1[1];
+      t2.toString;
+      member = H.stringReplaceAllUnchecked(t2, "/<", "");
+      uri = A.Frame__uriOrPathToUri(t1[2]);
+      line = P.int_parse(t1[3], _null);
+      return new A.Frame(uri, line, _null, member.length === 0 || member === "anonymous" ? "<fn>" : member);
+    },
+    $signature: 60
+  };
+  A.Frame_Frame$parseFirefox_closure.prototype = {
+    call$0: function() {
+      var t2, t3, uri, member, line, _null = null,
+        t1 = this.frame,
+        match = $.$get$_firefoxSafariFrame().firstMatch$1(t1);
+      if (match == null)
+        return new N.UnparsedFrame(P._Uri__Uri(_null, "unparsed", _null, _null), t1);
+      t2 = match._match;
+      t3 = t2[3];
+      if (J.contains$1$asx(t3, " line "))
+        return A.Frame_Frame$_parseFirefoxEval(t1);
+      uri = A.Frame__uriOrPathToUri(t3);
+      t1 = t2[1];
+      if (t1 != null) {
+        t3 = C.JSString_methods.allMatches$1("/", t2[2]);
+        member = J.$add$ansx(t1, C.JSArray_methods.join$0(P.List_List$filled(t3.get$length(t3), ".<fn>", false, type$.legacy_String)));
+        if (member === "")
+          member = "<fn>";
+        member = C.JSString_methods.replaceFirst$2(member, $.$get$_initialDot(), "");
+      } else
+        member = "<fn>";
+      t1 = t2[4];
+      line = t1 === "" ? _null : P.int_parse(t1, _null);
+      t1 = t2[5];
+      return new A.Frame(uri, line, t1 == null || t1 === "" ? _null : P.int_parse(t1, _null), member);
+    },
+    $signature: 60
+  };
+  A.Frame_Frame$parseFriendly_closure.prototype = {
+    call$0: function() {
+      var t2, uri, line, column, _null = null,
+        t1 = this.frame,
+        match = $.$get$_friendlyFrame().firstMatch$1(t1);
+      if (match == null)
+        throw H.wrapException(P.FormatException$("Couldn't parse package:stack_trace stack trace line '" + H.S(t1) + "'.", _null, _null));
+      t1 = match._match;
+      t2 = t1[1];
+      uri = t2 === "data:..." ? P.Uri_Uri$dataFromString("", _null, _null) : P.Uri_parse(t2);
+      if (uri.get$scheme() === "") {
+        t2 = $.$get$context();
+        uri = t2.toUri$1(D.absolute(t2.style.pathFromUri$1(M._parseUri(uri))));
+      }
+      t2 = t1[2];
+      line = t2 == null ? _null : P.int_parse(t2, _null);
+      t2 = t1[3];
+      column = t2 == null ? _null : P.int_parse(t2, _null);
+      return new A.Frame(uri, line, column, t1[4]);
+    },
+    $signature: 60
+  };
+  T.LazyTrace.prototype = {
+    get$_lazy_trace$_trace: function() {
+      var t1 = this._lazy_trace$_inner;
+      return t1 == null ? this._lazy_trace$_inner = this._thunk.call$0() : t1;
+    },
+    get$frames: function() {
+      return this.get$_lazy_trace$_trace().get$frames();
+    },
+    get$terse: function() {
+      return new T.LazyTrace(new T.LazyTrace_terse_closure(this));
+    },
+    toString$0: function(_) {
+      return J.toString$0$(this.get$_lazy_trace$_trace());
+    },
+    $isStackTrace: 1,
+    $isTrace: 1
+  };
+  T.LazyTrace_terse_closure.prototype = {
+    call$0: function() {
+      return this.$this.get$_lazy_trace$_trace().get$terse();
+    },
+    $signature: 180
+  };
+  Y.Trace.prototype = {
+    get$terse: function() {
+      return this.foldFrames$2$terse(new Y.Trace_terse_closure(), true);
+    },
+    foldFrames$2$terse: function(predicate, terse) {
+      var newFrames, t1, cur, _box_0 = {};
+      _box_0.predicate = predicate;
+      _box_0.predicate = new Y.Trace_foldFrames_closure(predicate);
+      newFrames = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Frame);
+      for (t1 = this.frames, t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>")), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        if (cur instanceof N.UnparsedFrame || !_box_0.predicate.call$1(cur))
+          newFrames.push(cur);
+        else if (newFrames.length === 0 || !_box_0.predicate.call$1(C.JSArray_methods.get$last(newFrames)))
+          newFrames.push(new A.Frame(cur.get$uri(), cur.get$line(), cur.get$column(), cur.get$member()));
+      }
+      t1 = type$.MappedListIterable_of_legacy_Frame_and_legacy_Frame;
+      newFrames = P.List_List$from(new H.MappedListIterable(newFrames, new Y.Trace_foldFrames_closure0(_box_0), t1), true, t1._eval$1("ListIterable.E"));
+      if (newFrames.length > 1 && _box_0.predicate.call$1(C.JSArray_methods.get$first(newFrames)))
+        C.JSArray_methods.removeAt$1(newFrames, 0);
+      return new Y.Trace(P.List_List$unmodifiable(new H.ReversedListIterable(newFrames, H._arrayInstanceType(newFrames)._eval$1("ReversedListIterable<1>")), type$.legacy_Frame), new P._StringStackTrace(this.original._stackTrace));
+    },
+    toString$0: function(_) {
+      var t1 = this.frames,
+        t2 = H._arrayInstanceType(t1);
+      return new H.MappedListIterable(t1, new Y.Trace_toString_closure(new H.MappedListIterable(t1, new Y.Trace_toString_closure0(), t2._eval$1("MappedListIterable<1,int*>")).fold$2(0, 0, H.instantiate1(P.math__max$closure(), type$.legacy_int))), t2._eval$1("MappedListIterable<1,String*>")).join$0(0);
+    },
+    $isStackTrace: 1,
+    get$frames: function() {
+      return this.frames;
+    }
+  };
+  Y.Trace_Trace$from_closure.prototype = {
+    call$0: function() {
+      return Y.Trace_Trace$parse(this.trace.toString$0(0));
+    },
+    $signature: 180
+  };
+  Y.Trace__parseVM_closure.prototype = {
+    call$1: function(line) {
+      return line.length !== 0;
+    },
+    $signature: 6
+  };
+  Y.Trace__parseVM_closure0.prototype = {
+    call$1: function(line) {
+      return A.Frame_Frame$parseVM(line);
+    },
+    $signature: 54
+  };
+  Y.Trace$parseV8_closure.prototype = {
+    call$1: function(line) {
+      return !J.startsWith$1$s(line, $.$get$_v8TraceLine());
+    },
+    $signature: 6
+  };
+  Y.Trace$parseV8_closure0.prototype = {
+    call$1: function(line) {
+      return A.Frame_Frame$parseV8(line);
+    },
+    $signature: 54
+  };
+  Y.Trace$parseJSCore_closure.prototype = {
+    call$1: function(line) {
+      return line !== "\tat ";
+    },
+    $signature: 6
+  };
+  Y.Trace$parseJSCore_closure0.prototype = {
+    call$1: function(line) {
+      return A.Frame_Frame$parseV8(line);
+    },
+    $signature: 54
+  };
+  Y.Trace$parseFirefox_closure.prototype = {
+    call$1: function(line) {
+      return line.length !== 0 && line !== "[native code]";
+    },
+    $signature: 6
+  };
+  Y.Trace$parseFirefox_closure0.prototype = {
+    call$1: function(line) {
+      return A.Frame_Frame$parseFirefox(line);
+    },
+    $signature: 54
+  };
+  Y.Trace$parseFriendly_closure.prototype = {
+    call$1: function(line) {
+      return !J.startsWith$1$s(line, "=====");
+    },
+    $signature: 6
+  };
+  Y.Trace$parseFriendly_closure0.prototype = {
+    call$1: function(line) {
+      return A.Frame_Frame$parseFriendly(line);
+    },
+    $signature: 54
+  };
+  Y.Trace_terse_closure.prototype = {
+    call$1: function(_) {
+      return false;
+    },
+    $signature: 179
+  };
+  Y.Trace_foldFrames_closure.prototype = {
+    call$1: function(frame) {
+      if (this.oldPredicate.call$1(frame))
+        return true;
+      if (frame.get$isCore())
+        return true;
+      if (frame.get$$package() === "stack_trace")
+        return true;
+      if (!J.contains$1$asx(frame.get$member(), "<async>"))
+        return false;
+      return frame.get$line() == null;
+    },
+    $signature: 179
+  };
+  Y.Trace_foldFrames_closure0.prototype = {
+    call$1: function(frame) {
+      var t1, t2;
+      if (frame instanceof N.UnparsedFrame || !this._box_0.predicate.call$1(frame))
+        return frame;
+      t1 = frame.get$library();
+      t2 = $.$get$_terseRegExp();
+      t1.toString;
+      return new A.Frame(P.Uri_parse(H.stringReplaceAllUnchecked(t1, t2, "")), null, null, frame.get$member());
+    },
+    $signature: 267
+  };
+  Y.Trace_toString_closure0.prototype = {
+    call$1: function(frame) {
+      return frame.get$location().length;
+    },
+    $signature: 184
+  };
+  Y.Trace_toString_closure.prototype = {
+    call$1: function(frame) {
+      if (frame instanceof N.UnparsedFrame)
+        return frame.toString$0(0) + "\n";
+      return J.padRight$1$s(frame.get$location(), this.longest) + "  " + H.S(frame.get$member()) + "\n";
+    },
+    $signature: 183
+  };
+  N.UnparsedFrame.prototype = {
+    toString$0: function(_) {
+      return this.member;
+    },
+    $isFrame: 1,
+    get$uri: function() {
+      return this.uri;
+    },
+    get$line: function() {
+      return null;
+    },
+    get$column: function() {
+      return null;
+    },
+    get$isCore: function() {
+      return false;
+    },
+    get$library: function() {
+      return "unparsed";
+    },
+    get$$package: function() {
+      return null;
+    },
+    get$location: function() {
+      return "unparsed";
+    },
+    get$member: function() {
+      return this.member;
+    }
+  };
+  L._StreamTransformer.prototype = {
+    bind$1: function(values) {
+      var controller, _null = null, t1 = {},
+        t2 = this.$ti;
+      if (values.get$isBroadcast())
+        controller = new P._SyncBroadcastStreamController(_null, _null, t2._eval$1("_SyncBroadcastStreamController<2*>"));
+      else
+        controller = P.StreamController_StreamController(_null, _null, _null, _null, true, t2._eval$1("2*"));
+      t1.subscription = null;
+      controller.set$onListen(new L._StreamTransformer_bind_closure(t1, this, values, controller));
+      return controller.get$stream();
+    }
+  };
+  L._StreamTransformer_bind_closure.prototype = {
+    call$0: function() {
+      var t2, t3, t4, t5, _this = this, t1 = {};
+      t1.valuesDone = false;
+      t2 = _this.values;
+      t3 = _this.$this;
+      t4 = _this.controller;
+      t5 = _this._box_1;
+      t5.subscription = t2.listen$3$onDone$onError(0, new L._StreamTransformer_bind__closure(t3, t4), new L._StreamTransformer_bind__closure0(t1, t3, t4), new L._StreamTransformer_bind__closure1(t3, t4));
+      if (!t2.get$isBroadcast()) {
+        t2 = t5.subscription;
+        t4.set$onPause(t2.get$pause(t2));
+        t2 = t5.subscription;
+        t4.set$onResume(t2.get$resume(t2));
+      }
+      t4.set$onCancel(new L._StreamTransformer_bind__closure2(t5, t1));
+    },
+    $signature: 0
+  };
+  L._StreamTransformer_bind__closure.prototype = {
+    call$1: function(value) {
+      return this.$this._from_handlers$_handleData.call$2(value, this.controller);
+    },
+    $signature: function() {
+      return this.$this.$ti._eval$1("~(1*)");
+    }
+  };
+  L._StreamTransformer_bind__closure1.prototype = {
+    call$2: function(error, stackTrace) {
+      this.$this._from_handlers$_handleError.call$3(error, stackTrace, this.controller);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 133
+  };
+  L._StreamTransformer_bind__closure0.prototype = {
+    call$0: function() {
+      this._box_0.valuesDone = true;
+      this.$this._from_handlers$_handleDone.call$1(this.controller);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  L._StreamTransformer_bind__closure2.prototype = {
+    call$0: function() {
+      var t1 = this._box_1,
+        toCancel = t1.subscription;
+      t1.subscription = null;
+      if (!this._box_0.valuesDone)
+        return toCancel.cancel$0();
+      return null;
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 268
+  };
+  R._debounceAggregate_closure.prototype = {
+    call$2: function(value, sink) {
+      var soFar, _this = this,
+        t1 = _this._box_0,
+        t2 = t1.timer;
+      if (t2 != null)
+        t2.cancel$0();
+      soFar = _this.collect.call$2(value, t1.soFar);
+      t1.soFar = soFar;
+      if (t1.timer == null && _this.leading) {
+        t1.emittedLatestAsLeading = true;
+        sink.add$1(0, soFar);
+      } else
+        t1.emittedLatestAsLeading = false;
+      t1.timer = P.Timer_Timer(_this.duration, new R._debounceAggregate__closure(t1, _this.trailing, sink));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: function() {
+      return this.T._eval$1("@<0>")._bind$1(this.R)._eval$1("Null(1*,EventSink<2*>*)");
+    }
+  };
+  R._debounceAggregate__closure.prototype = {
+    call$0: function() {
+      var t1 = this._box_0,
+        t2 = t1.emittedLatestAsLeading;
+      if (!t2)
+        this.sink.add$1(0, t1.soFar);
+      if (t1.shouldClose)
+        this.sink.close$0(0);
+      t1.timer = t1.soFar = null;
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  R._debounceAggregate_closure0.prototype = {
+    call$1: function(sink) {
+      var t1 = this._box_0;
+      if (t1.soFar != null && this.trailing)
+        t1.shouldClose = true;
+      else {
+        t1 = t1.timer;
+        if (t1 != null)
+          t1.cancel$0();
+        sink.close$0(0);
+      }
+    },
+    $signature: function() {
+      return this.R._eval$1("Null(EventSink<0*>*)");
+    }
+  };
+  E.StringScannerException.prototype = {
+    get$source: function() {
+      return H._asStringS(this.source);
+    }
+  };
+  Z.LineScanner.prototype = {
+    get$_betweenCRLF: function() {
+      return this.peekChar$1(-1) === 13 && this.peekChar$0() === 10;
+    },
+    scanChar$1: function(character) {
+      if (!this.super$StringScanner$scanChar(character))
+        return false;
+      this._adjustLineAndColumn$1(character);
+      return true;
+    },
+    _adjustLineAndColumn$1: function(character) {
+      var t1, _this = this;
+      if (character !== 10)
+        t1 = character === 13 && _this.peekChar$0() !== 10;
+      else
+        t1 = true;
+      if (t1) {
+        ++_this._line_scanner$_line;
+        _this._line_scanner$_column = 0;
+      } else
+        ++_this._line_scanner$_column;
+    },
+    scan$1: function(pattern) {
+      var newlines, t1, t2, _this = this;
+      if (!_this.super$StringScanner$scan(pattern))
+        return false;
+      newlines = _this._newlinesIn$1(_this.get$lastMatch().group$1(0, 0));
+      t1 = _this._line_scanner$_line;
+      t2 = newlines.length;
+      _this._line_scanner$_line = t1 + t2;
+      if (t2 === 0)
+        _this._line_scanner$_column = _this._line_scanner$_column + _this.get$lastMatch().group$1(0, 0).length;
+      else
+        _this._line_scanner$_column = _this.get$lastMatch().group$1(0, 0).length - J.get$end$x(C.JSArray_methods.get$last(newlines));
+      return true;
+    },
+    _newlinesIn$1: function(text) {
+      var t1 = $.$get$_newlineRegExp().allMatches$1(0, text),
+        newlines = P.List_List$from(t1, true, H._instanceType(t1)._eval$1("Iterable.E"));
+      if (this.get$_betweenCRLF())
+        C.JSArray_methods.removeLast$0(newlines);
+      return newlines;
+    }
+  };
+  S.SpanScanner.prototype = {
+    set$state: function(state) {
+      if (!(state instanceof S._SpanScannerState) || state._scanner !== this)
+        throw H.wrapException(P.ArgumentError$(string$.The_gi));
+      this.set$position(state.position);
+    },
+    spanFrom$2: function(startState, endState) {
+      var endPosition = endState == null ? this._string_scanner$_position : endState.position;
+      return this._sourceFile.span$2(startState.position, endPosition);
+    },
+    spanFrom$1: function(startState) {
+      return this.spanFrom$2(startState, null);
+    },
+    matches$1: function(pattern) {
+      var t1, t2, _this = this;
+      if (!_this.super$StringScanner$matches(pattern))
+        return false;
+      t1 = _this._string_scanner$_position;
+      t2 = _this.get$lastMatch();
+      _this._sourceFile.span$2(t1, t2.start + t2.pattern.length);
+      return true;
+    },
+    error$3$length$position: function(_, message, $length, position) {
+      var t2, match, _this = this,
+        t1 = _this.string;
+      B.validateErrorArgs(t1, null, position, $length);
+      t2 = position == null && $length == null;
+      match = t2 ? _this.get$lastMatch() : null;
+      if (position == null)
+        position = match == null ? _this._string_scanner$_position : match.start;
+      if ($length == null)
+        if (match == null)
+          $length = 0;
+        else {
+          t2 = match.start;
+          $length = t2 + match.pattern.length - t2;
+        }
+      throw H.wrapException(E.StringScannerException$(message, _this._sourceFile.span$2(position, position + $length), t1));
+    },
+    error$1: function($receiver, message) {
+      return this.error$3$length$position($receiver, message, null, null);
+    },
+    error$2$position: function($receiver, message, position) {
+      return this.error$3$length$position($receiver, message, null, position);
+    },
+    error$2$length: function($receiver, message, $length) {
+      return this.error$3$length$position($receiver, message, $length, null);
+    }
+  };
+  S._SpanScannerState.prototype = {};
+  X.StringScanner.prototype = {
+    set$position: function(position) {
+      if (position < 0 || position > this.string.length)
+        throw H.wrapException(P.ArgumentError$("Invalid position " + position));
+      this._string_scanner$_position = position;
+      this._lastMatch = null;
+    },
+    get$lastMatch: function() {
+      var _this = this;
+      if (_this._string_scanner$_position !== _this._lastMatchPosition)
+        _this._lastMatch = null;
+      return _this._lastMatch;
+    },
+    readChar$0: function() {
+      var _this = this,
+        t1 = _this._string_scanner$_position,
+        t2 = _this.string;
+      if (t1 === t2.length)
+        _this.error$3$length$position(0, "expected more input.", 0, t1);
+      return J.codeUnitAt$1$s(t2, _this._string_scanner$_position++);
+    },
+    peekChar$1: function(offset) {
+      var index;
+      if (offset == null)
+        offset = 0;
+      index = this._string_scanner$_position + offset;
+      if (index < 0 || index >= this.string.length)
+        return null;
+      return J.codeUnitAt$1$s(this.string, index);
+    },
+    peekChar$0: function() {
+      return this.peekChar$1(null);
+    },
+    scanChar$1: function(character) {
+      var t1 = this._string_scanner$_position,
+        t2 = this.string;
+      if (t1 === t2.length)
+        return false;
+      if (J.codeUnitAt$1$s(t2, t1) !== character)
+        return false;
+      this._string_scanner$_position = t1 + 1;
+      return true;
+    },
+    expectChar$2$name: function(character, $name) {
+      if (this.scanChar$1(character))
+        return;
+      if ($name == null)
+        if (character === 92)
+          $name = '"\\"';
+        else
+          $name = character === 34 ? '"\\""' : '"' + H.Primitives_stringFromCharCode(character) + '"';
+      this.error$3$length$position(0, "expected " + $name + ".", 0, this._string_scanner$_position);
+    },
+    expectChar$1: function(character) {
+      return this.expectChar$2$name(character, null);
+    },
+    scan$1: function(pattern) {
+      var t1, _this = this,
+        success = _this.matches$1(pattern);
+      if (success) {
+        t1 = _this._lastMatch;
+        _this._lastMatchPosition = _this._string_scanner$_position = t1.start + t1.pattern.length;
+      }
+      return success;
+    },
+    expect$1: function(pattern) {
+      var t1, $name;
+      if (this.scan$1(pattern))
+        return;
+      t1 = H.stringReplaceAllUnchecked(pattern, "\\", "\\\\");
+      $name = '"' + H.stringReplaceAllUnchecked(t1, '"', '\\"') + '"';
+      this.error$3$length$position(0, "expected " + $name + ".", 0, this._string_scanner$_position);
+    },
+    expectDone$0: function() {
+      var t1 = this._string_scanner$_position;
+      if (t1 === this.string.length)
+        return;
+      this.error$3$length$position(0, "expected no more input.", 0, t1);
+    },
+    matches$1: function(pattern) {
+      var _this = this,
+        t1 = C.JSString_methods.matchAsPrefix$2(pattern, _this.string, _this._string_scanner$_position);
+      _this._lastMatch = t1;
+      _this._lastMatchPosition = _this._string_scanner$_position;
+      return t1 != null;
+    },
+    substring$1: function(_, start) {
+      var end = this._string_scanner$_position;
+      return J.substring$2$s(this.string, start, end);
+    },
+    error$3$length$position: function(_, message, $length, position) {
+      var t1 = this.string;
+      B.validateErrorArgs(t1, null, position, $length);
+      throw H.wrapException(E.StringScannerException$(message, Y.SourceFile$fromString(t1, this.sourceUrl).span$2(position, position + $length), t1));
+    }
+  };
+  A.AsciiGlyphSet.prototype = {
+    glyphOrAscii$2: function(glyph, alternative) {
+      return alternative;
+    },
+    get$horizontalLine: function() {
+      return "-";
+    },
+    get$verticalLine: function() {
+      return "|";
+    },
+    get$topLeftCorner: function() {
+      return ",";
+    },
+    get$bottomLeftCorner: function() {
+      return "'";
+    },
+    get$cross: function() {
+      return "+";
+    },
+    get$upEnd: function() {
+      return "'";
+    },
+    get$downEnd: function() {
+      return ",";
+    },
+    get$horizontalLineBold: function() {
+      return "=";
+    }
+  };
+  K.UnicodeGlyphSet.prototype = {
+    glyphOrAscii$2: function(glyph, alternative) {
+      return glyph;
+    },
+    get$horizontalLine: function() {
+      return "\u2500";
+    },
+    get$verticalLine: function() {
+      return "\u2502";
+    },
+    get$topLeftCorner: function() {
+      return "\u250c";
+    },
+    get$bottomLeftCorner: function() {
+      return "\u2514";
+    },
+    get$cross: function() {
+      return "\u253c";
+    },
+    get$upEnd: function() {
+      return "\u2575";
+    },
+    get$downEnd: function() {
+      return "\u2577";
+    },
+    get$horizontalLineBold: function() {
+      return "\u2501";
+    }
+  };
+  S.Tuple2.prototype = {
+    toString$0: function(_) {
+      return "[" + H.S(this.item1) + ", " + H.S(this.item2) + "]";
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof S.Tuple2 && J.$eq$(other.item1, this.item1) && J.$eq$(other.item2, this.item2);
+    },
+    get$hashCode: function(_) {
+      var t1 = J.get$hashCode$(this.item1),
+        t2 = J.get$hashCode$(this.item2);
+      return A._finish(A._combine(A._combine(0, C.JSInt_methods.get$hashCode(t1)), C.JSInt_methods.get$hashCode(t2)));
+    }
+  };
+  S.Tuple3.prototype = {
+    toString$0: function(_) {
+      return "[" + H.S(this.item1) + ", " + this.item2.toString$0(0) + ", " + H.S(this.item3) + "]";
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof S.Tuple3 && other.item1 == this.item1 && other.item2.$eq(0, this.item2) && J.$eq$(other.item3, this.item3);
+    },
+    get$hashCode: function(_) {
+      var t3,
+        t1 = J.get$hashCode$(this.item1),
+        t2 = this.item2;
+      t2 = t2.get$hashCode(t2);
+      t3 = J.get$hashCode$(this.item3);
+      return A._finish(A._combine(A._combine(A._combine(0, C.JSInt_methods.get$hashCode(t1)), C.JSInt_methods.get$hashCode(t2)), C.JSInt_methods.get$hashCode(t3)));
+    }
+  };
+  E.WatchEvent.prototype = {
+    toString$0: function(_) {
+      return H.S(this.type) + " " + H.S(this.path);
+    },
+    get$path: function(receiver) {
+      return this.path;
+    }
+  };
+  E.ChangeType.prototype = {
+    toString$0: function(_) {
+      return this._watch_event$_name;
+    }
+  };
+  Y.SupportsAnything0.prototype = {
+    toString$0: function(_) {
+      return "(" + this.contents.toString$0(0) + ")";
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Z.Argument0.prototype = {
+    toString$0: function(_) {
+      var t1 = this.defaultValue,
+        t2 = this.name;
+      return t1 == null ? t2 : t2 + ": " + t1.toString$0(0);
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.ArgumentDeclaration0.prototype = {
+    get$spanWithName: function() {
+      var t3, t4,
+        t1 = this.span,
+        t2 = t1.file,
+        text = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t2._decodedChars, 0, null), 0, null),
+        i = Y.FileLocation$_(t2, t1._file$_start).offset - 1;
+      while (true) {
+        if (i > 0) {
+          t3 = C.JSString_methods.codeUnitAt$1(text, i);
+          t3 = t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        --i;
+      }
+      t3 = C.JSString_methods.codeUnitAt$1(text, i);
+      if (!(t3 === 95 || T.isAlphabetic1(t3) || t3 >= 128 || T.isDigit0(t3) || t3 === 45))
+        return t1;
+      --i;
+      while (true) {
+        if (i >= 0) {
+          t3 = C.JSString_methods.codeUnitAt$1(text, i);
+          if (t3 !== 95) {
+            if (!(t3 >= 97 && t3 <= 122))
+              t4 = t3 >= 65 && t3 <= 90;
+            else
+              t4 = true;
+            t4 = t4 || t3 >= 128;
+          } else
+            t4 = true;
+          if (!t4) {
+            t4 = t3 >= 48 && t3 <= 57;
+            t3 = t4 || t3 === 45;
+          } else
+            t3 = true;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        --i;
+      }
+      t3 = i + 1;
+      t4 = C.JSString_methods.codeUnitAt$1(text, t3);
+      if (!(t4 === 95 || T.isAlphabetic1(t4) || t4 >= 128))
+        return t1;
+      return B.SpanExtensions_trim0(t2.span$2(t3, Y.FileLocation$_(t2, t1._end).offset));
+    },
+    get$originalRestArgument: function() {
+      var t1, text;
+      if (this.restArgument == null)
+        return null;
+      t1 = this.span;
+      text = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1.file._decodedChars, t1._file$_start, t1._end), 0, null);
+      return C.JSString_methods.substring$2(C.JSString_methods.substring$1(text, C.JSString_methods.lastIndexOf$1(text, "$")), 0, C.JSString_methods.indexOf$1(text, "."));
+    },
+    verify$2: function(positional, names) {
+      var t1, t2, t3, namedUsed, i, argument, t4, unknownNames, _this = this,
+        _s10_ = "invocation",
+        _s8_ = "argument";
+      for (t1 = _this.$arguments, t2 = t1.length, t3 = names._baseMap, namedUsed = 0, i = 0; i < t2; ++i) {
+        argument = t1[i];
+        if (i < positional) {
+          t4 = argument.name;
+          if (t3.containsKey$1(t4))
+            throw H.wrapException(E.SassScriptException$0("Argument " + H.S(_this._argument_declaration$_originalArgumentName$1(t4)) + string$.x20was_p));
+        } else {
+          t4 = argument.name;
+          if (t3.containsKey$1(t4))
+            ++namedUsed;
+          else if (argument.defaultValue == null)
+            throw H.wrapException(E.MultiSpanSassScriptException$0("Missing argument " + H.S(_this._argument_declaration$_originalArgumentName$1(t4)) + ".", _s10_, P.LinkedHashMap_LinkedHashMap$_literal([_this.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String)));
+        }
+      }
+      if (_this.restArgument != null)
+        return;
+      if (positional > t2) {
+        t1 = "Only " + t2 + " ";
+        throw H.wrapException(E.MultiSpanSassScriptException$0(t1 + (names.get$isEmpty(names) ? "" : "positional ") + B.pluralize0(_s8_, t2, null) + " allowed, but " + positional + " " + B.pluralize0("was", positional, "were") + " passed.", _s10_, P.LinkedHashMap_LinkedHashMap$_literal([_this.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+      if (namedUsed < t3.get$length(t3)) {
+        t2 = type$.legacy_String;
+        unknownNames = P.LinkedHashSet_LinkedHashSet$of(names, t2);
+        unknownNames.removeAll$1(new H.MappedListIterable(t1, new B.ArgumentDeclaration_verify_closure1(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Object*>")));
+        throw H.wrapException(E.MultiSpanSassScriptException$0("No " + B.pluralize0(_s8_, unknownNames._collection$_length, null) + " named " + H.S(B.toSentence0(unknownNames.map$1$1(0, new B.ArgumentDeclaration_verify_closure2(), type$.legacy_Object), "or")) + ".", _s10_, P.LinkedHashMap_LinkedHashMap$_literal([_this.get$spanWithName(), "declaration"], type$.legacy_FileSpan, t2)));
+      }
+    },
+    _argument_declaration$_originalArgumentName$1: function($name) {
+      var t1, t2, _i, argument, t3, t4, text, end;
+      if ($name === this.restArgument)
+        return this.get$originalRestArgument();
+      for (t1 = this.$arguments, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        argument = t1[_i];
+        if (argument.name === $name) {
+          t1 = argument.defaultValue;
+          t2 = argument.span;
+          t3 = t2.file;
+          t4 = t2._file$_start;
+          t2 = t2._end;
+          if (t1 == null) {
+            t1 = t3._decodedChars;
+            t1 = P.String_String$fromCharCodes(new Uint32Array(t1.subarray(t4, H._checkValidRange(t4, t2, t1.length))), 0, null);
+          } else {
+            t1 = t3._decodedChars;
+            text = P.String_String$fromCharCodes(new Uint32Array(t1.subarray(t4, H._checkValidRange(t4, t2, t1.length))), 0, null);
+            t1 = C.JSString_methods.substring$2(text, 0, C.JSString_methods.indexOf$1(text, ":"));
+            end = B._lastNonWhitespace0(t1, false);
+            t1 = end == null ? "" : C.JSString_methods.substring$2(t1, 0, end + 1);
+          }
+          return t1;
+        }
+      }
+      throw H.wrapException(P.ArgumentError$(string$.This_d + $name + '".'));
+    },
+    matches$2: function(positional, names) {
+      var t1, t2, t3, namedUsed, i, argument;
+      for (t1 = this.$arguments, t2 = t1.length, t3 = names._baseMap, namedUsed = 0, i = 0; i < t2; ++i) {
+        argument = t1[i];
+        if (i < positional) {
+          if (t3.containsKey$1(argument.name))
+            return false;
+        } else if (t3.containsKey$1(argument.name))
+          ++namedUsed;
+        else if (argument.defaultValue == null)
+          return false;
+      }
+      if (this.restArgument != null)
+        return true;
+      if (positional > t2)
+        return false;
+      if (namedUsed < t3.get$length(t3))
+        return false;
+      return true;
+    },
+    toString$0: function(_) {
+      var t2, t3, _i,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      for (t2 = this.$arguments, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t1.push(J.toString$0$(t2[_i]));
+      t2 = this.restArgument;
+      if (t2 != null)
+        t1.push(t2 + "...");
+      return C.JSArray_methods.join$1(t1, ", ");
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.ArgumentDeclaration_verify_closure1.prototype = {
+    call$1: function(argument) {
+      return argument.name;
+    },
+    $signature: 269
+  };
+  B.ArgumentDeclaration_verify_closure2.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  X.ArgumentInvocation0.prototype = {
+    get$isEmpty: function(_) {
+      var t1;
+      if (this.positional.length === 0) {
+        t1 = this.named;
+        t1 = t1.get$isEmpty(t1) && this.rest == null;
+      } else
+        t1 = false;
+      return t1;
+    },
+    toString$0: function(_) {
+      var t2, t3, _i, t4, _this = this,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
+      for (t2 = _this.positional, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t1.push(t2[_i]);
+      for (t2 = _this.named, t3 = J.get$iterator$ax(t2.get$keys(t2)); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t1.push(H.S(t4) + ": " + H.S(t2.$index(0, t4)));
+      }
+      t2 = _this.rest;
+      if (t2 != null)
+        t1.push(t2.toString$0(0) + "...");
+      t2 = _this.keywordRest;
+      if (t2 != null)
+        t1.push(t2.toString$0(0) + "...");
+      return "(" + C.JSArray_methods.join$1(t1, ", ") + ")";
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  D.SassArgumentList0.prototype = {};
+  B.AsyncImporter0.prototype = {};
+  S.AsyncBuiltInCallable0.prototype = {
+    callbackFor$2: function(positional, names) {
+      return new S.Tuple2(this._async_built_in0$_arguments, this._async_built_in0$_callback, type$.Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_FutureOr_legacy_Value_Function_legacy_List_legacy_Value_2);
+    },
+    $isAsyncCallable0: 1,
+    get$name: function(receiver) {
+      return this.name;
+    }
+  };
+  S.AsyncBuiltInCallable$mixin_closure0.prototype = {
+    call$1: function($arguments) {
+      return this.$call$body$AsyncBuiltInCallable$mixin_closure0($arguments);
+    },
+    $call$body$AsyncBuiltInCallable$mixin_closure0: function($arguments) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self.callback.call$1($arguments), $async$call$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 176
+  };
+  X._compileStylesheet_closure2.prototype = {
+    call$1: function(url) {
+      var t1, t2, _null = null;
+      if (url === "")
+        t1 = P.Uri_Uri$dataFromString(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(this.stylesheet.span.file._decodedChars, 0, _null), 0, _null), C.C_Utf8Codec, _null).get$_text();
+      else {
+        t1 = P.Uri_parse(url);
+        t2 = this.importCache._async_import_cache0$_resultsCache.$index(0, t1);
+        t2 = t2 == null ? _null : t2.get$sourceMapUrl();
+        t1 = (t2 == null ? t1 : t2).toString$0(0);
+      }
+      return t1;
+    },
+    $signature: 4
+  };
+  X.CompileResult0.prototype = {};
+  Q.AsyncEnvironment0.prototype = {
+    closure$0: function() {
+      var t5, t6, t7, _this = this,
+        t1 = _this._async_environment0$_forwardedModules,
+        t2 = _this._async_environment0$_forwardedModuleNodes,
+        t3 = _this._async_environment0$_nestedForwardedModules,
+        t4 = _this._async_environment0$_variables;
+      t4 = H.setRuntimeTypeInfo(t4.slice(0), H._arrayInstanceType(t4));
+      t5 = _this._async_environment0$_variableNodes;
+      if (t5 == null)
+        t5 = null;
+      else
+        t5 = H.setRuntimeTypeInfo(t5.slice(0), H._arrayInstanceType(t5));
+      t6 = _this._async_environment0$_functions;
+      t6 = H.setRuntimeTypeInfo(t6.slice(0), H._arrayInstanceType(t6));
+      t7 = _this._async_environment0$_mixins;
+      t7 = H.setRuntimeTypeInfo(t7.slice(0), H._arrayInstanceType(t7));
+      return Q.AsyncEnvironment$_0(_this._async_environment0$_modules, _this._async_environment0$_namespaceNodes, _this._async_environment0$_globalModules, _this._async_environment0$_globalModuleNodes, t1, t2, t3, _this._async_environment0$_allModules, t4, t5, t6, t7, _this._async_environment0$_content);
+    },
+    addModule$3$namespace: function(module, nodeWithSpan, namespace) {
+      var t1, t2, _this = this;
+      if (namespace == null) {
+        _this._async_environment0$_globalModules.add$1(0, module);
+        _this._async_environment0$_globalModuleNodes.$indexSet(0, module, nodeWithSpan);
+        _this._async_environment0$_allModules.push(module);
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.get$first(_this._async_environment0$_variables))); t1.moveNext$0();) {
+          t2 = t1.get$current(t1);
+          if (module.get$variables().containsKey$1(t2))
+            throw H.wrapException(E.SassScriptException$0(string$.This_ma + H.S(t2) + '".'));
+        }
+      } else {
+        t1 = _this._async_environment0$_modules;
+        if (t1.containsKey$1(namespace))
+          throw H.wrapException(E.MultiSpanSassScriptException$0(string$.There_ + namespace + '".', "new @use", P.LinkedHashMap_LinkedHashMap$_literal([_this._async_environment0$_namespaceNodes.$index(0, namespace).get$span(), "original @use"], type$.legacy_FileSpan, type$.legacy_String)));
+        t1.$indexSet(0, namespace, module);
+        _this._async_environment0$_namespaceNodes.$indexSet(0, namespace, nodeWithSpan);
+        _this._async_environment0$_allModules.push(module);
+      }
+    },
+    forwardModule$2: function(module, rule) {
+      var view, t1, t2, _this = this;
+      if (_this._async_environment0$_forwardedModules == null)
+        _this._async_environment0$_forwardedModules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_Module_legacy_AsyncCallable_2);
+      if (_this._async_environment0$_forwardedModuleNodes == null)
+        _this._async_environment0$_forwardedModuleNodes = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Module_legacy_AsyncCallable_2, type$.legacy_AstNode_2);
+      view = R.ForwardedModuleView_ifNecessary0(module, rule, type$.legacy_AsyncCallable_2);
+      for (t1 = _this._async_environment0$_forwardedModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();) {
+        t2 = t1._collection$_current;
+        _this._async_environment0$_assertNoConflicts$6(view.get$variables(), t2.get$variables(), view, t2, "variable", rule);
+        _this._async_environment0$_assertNoConflicts$6(view.get$functions(view), t2.get$functions(t2), view, t2, "function", rule);
+        _this._async_environment0$_assertNoConflicts$6(view.get$mixins(), t2.get$mixins(), view, t2, "mixin", rule);
+      }
+      _this._async_environment0$_allModules.push(module);
+      _this._async_environment0$_forwardedModules.add$1(0, view);
+      _this._async_environment0$_forwardedModuleNodes.$indexSet(0, view, rule);
+    },
+    _async_environment0$_assertNoConflicts$6: function(newMembers, oldMembers, newModule, oldModule, type, newModuleNodeWithSpan) {
+      var larger, smaller, t1, t2, $name;
+      if (newMembers.get$length(newMembers) < oldMembers.get$length(oldMembers)) {
+        larger = oldMembers;
+        smaller = newMembers;
+      } else {
+        larger = newMembers;
+        smaller = oldMembers;
+      }
+      for (t1 = J.get$iterator$ax(smaller.get$keys(smaller)), t2 = type === "variable"; t1.moveNext$0();) {
+        $name = t1.get$current(t1);
+        if (!larger.containsKey$1($name))
+          continue;
+        if (t2 ? newModule.variableIdentity$1($name) === oldModule.variableIdentity$1($name) : J.$eq$(larger.$index(0, $name), smaller.$index(0, $name)))
+          continue;
+        if (t2)
+          $name = "$" + H.S($name);
+        throw H.wrapException(E.MultiSpanSassScriptException$0("Two forwarded modules both define a " + type + " named " + H.S($name) + ".", "new @forward", P.LinkedHashMap_LinkedHashMap$_literal([this._async_environment0$_forwardedModuleNodes.$index(0, oldModule).get$span(), "original @forward"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+    },
+    importForwards$1: function(module) {
+      var t2, t3, t4, t5, forwardedVariableNames, forwardedFunctionNames, forwardedMixinNames, t6, t7, _i, shadowed, t8, _this = this,
+        t1 = module._async_environment0$_environment,
+        forwarded = t1._async_environment0$_forwardedModules;
+      if (forwarded == null)
+        return;
+      if (_this._async_environment0$_forwardedModules != null) {
+        t2 = P.LinkedHashSet_LinkedHashSet(type$.legacy_Module_legacy_AsyncCallable_2);
+        for (t3 = P._LinkedHashSetIterator$(forwarded, forwarded._collection$_modifications), t4 = _this._async_environment0$_globalModules; t3.moveNext$0();) {
+          t5 = t3._collection$_current;
+          if (!_this._async_environment0$_forwardedModules.contains$1(0, t5) || !t4.contains$1(0, t5))
+            t2.add$1(0, t5);
+        }
+        forwarded = t2;
+      }
+      if (_this._async_environment0$_forwardedModules == null)
+        _this._async_environment0$_forwardedModules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_Module_legacy_AsyncCallable_2);
+      if (_this._async_environment0$_forwardedModuleNodes == null)
+        _this._async_environment0$_forwardedModuleNodes = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Module_legacy_AsyncCallable_2, type$.legacy_AstNode_2);
+      t2 = H._instanceType(forwarded)._eval$1("ExpandIterable<1,String*>");
+      t3 = t2._eval$1("Iterable.E");
+      forwardedVariableNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new Q.AsyncEnvironment_importForwards_closure3(), t2), t3);
+      forwardedFunctionNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new Q.AsyncEnvironment_importForwards_closure4(), t2), t3);
+      forwardedMixinNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new Q.AsyncEnvironment_importForwards_closure5(), t2), t3);
+      t2 = _this._async_environment0$_variables;
+      t3 = t2.length;
+      if (t3 === 1) {
+        for (t3 = _this._async_environment0$_globalModules, t4 = P.List_List$from(t3, true, H._instanceType(t3)._precomputed1), t5 = t4.length, t6 = type$.legacy_AsyncCallable_2, t7 = _this._async_environment0$_globalModuleNodes, _i = 0; _i < t4.length; t4.length === t5 || (0, H.throwConcurrentModificationError)(t4), ++_i) {
+          module = t4[_i];
+          shadowed = B.ShadowedModuleView_ifNecessary0(module, forwardedFunctionNames, forwardedMixinNames, forwardedVariableNames, t6);
+          if (shadowed != null) {
+            t3.remove$1(0, module);
+            t8 = shadowed.variables;
+            if (t8.get$isEmpty(t8)) {
+              t8 = shadowed.functions;
+              if (t8.get$isEmpty(t8)) {
+                t8 = shadowed.mixins;
+                if (t8.get$isEmpty(t8)) {
+                  t8 = shadowed._shadowed_view0$_inner;
+                  t8 = t8.get$css(t8);
+                  t8 = J.get$isEmpty$asx(t8.get$children(t8));
+                } else
+                  t8 = false;
+              } else
+                t8 = false;
+            } else
+              t8 = false;
+            if (!t8) {
+              t3.add$1(0, shadowed);
+              t7.$indexSet(0, shadowed, t7.remove$1(0, module));
+            }
+          }
+        }
+        t4 = _this._async_environment0$_forwardedModules;
+        t4.toString;
+        t4 = P.List_List$from(t4, true, H._instanceType(t4)._precomputed1);
+        t5 = t4.length;
+        _i = 0;
+        for (; _i < t4.length; t4.length === t5 || (0, H.throwConcurrentModificationError)(t4), ++_i) {
+          module = t4[_i];
+          shadowed = B.ShadowedModuleView_ifNecessary0(module, forwardedFunctionNames, forwardedMixinNames, forwardedVariableNames, t6);
+          if (shadowed != null) {
+            _this._async_environment0$_forwardedModules.remove$1(0, module);
+            t8 = shadowed.variables;
+            if (t8.get$isEmpty(t8)) {
+              t8 = shadowed.functions;
+              if (t8.get$isEmpty(t8)) {
+                t8 = shadowed.mixins;
+                if (t8.get$isEmpty(t8)) {
+                  t8 = shadowed._shadowed_view0$_inner;
+                  t8 = t8.get$css(t8);
+                  t8 = J.get$isEmpty$asx(t8.get$children(t8));
+                } else
+                  t8 = false;
+              } else
+                t8 = false;
+            } else
+              t8 = false;
+            if (!t8) {
+              _this._async_environment0$_forwardedModules.add$1(0, shadowed);
+              t8 = _this._async_environment0$_forwardedModuleNodes;
+              t8.$indexSet(0, shadowed, t8.remove$1(0, module));
+            }
+          }
+        }
+        t3.addAll$1(0, forwarded);
+        t7.addAll$1(0, t1._async_environment0$_forwardedModuleNodes);
+        _this._async_environment0$_forwardedModules.addAll$1(0, forwarded);
+        _this._async_environment0$_forwardedModuleNodes.addAll$1(0, t1._async_environment0$_forwardedModuleNodes);
+      } else {
+        t1 = _this._async_environment0$_nestedForwardedModules;
+        J.addAll$1$ax(C.JSArray_methods.get$last(t1 == null ? _this._async_environment0$_nestedForwardedModules = P.List_List$generate(t3 - 1, new Q.AsyncEnvironment_importForwards_closure6(), true, type$.legacy_List_legacy_Module_legacy_AsyncCallable_2) : t1), forwarded);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedVariableNames, forwardedVariableNames._collection$_modifications), t3 = _this._async_environment0$_variableNodes, t4 = t3 != null, t5 = _this._async_environment0$_variableIndices; t1.moveNext$0();) {
+        t6 = t1._collection$_current;
+        t5.remove$1(0, t6);
+        J.remove$1$ax(C.JSArray_methods.get$last(t2), t6);
+        if (t4)
+          J.remove$1$ax(C.JSArray_methods.get$last(t3), t6);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedFunctionNames, forwardedFunctionNames._collection$_modifications), t2 = _this._async_environment0$_functionIndices, t3 = _this._async_environment0$_functions; t1.moveNext$0();) {
+        t4 = t1._collection$_current;
+        t2.remove$1(0, t4);
+        J.remove$1$ax(C.JSArray_methods.get$last(t3), t4);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedMixinNames, forwardedMixinNames._collection$_modifications), t2 = _this._async_environment0$_mixinIndices, t3 = _this._async_environment0$_mixins; t1.moveNext$0();) {
+        t4 = t1._collection$_current;
+        t2.remove$1(0, t4);
+        J.remove$1$ax(C.JSArray_methods.get$last(t3), t4);
+      }
+    },
+    getVariable$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._async_environment0$_getModule$1(namespace).get$variables().$index(0, $name);
+      if (_this._async_environment0$_lastVariableName === $name) {
+        t1 = J.$index$asx(_this._async_environment0$_variables[_this._async_environment0$_lastVariableIndex], $name);
+        return t1 == null ? _this._async_environment0$_getVariableFromGlobalModule$1($name) : t1;
+      }
+      t1 = _this._async_environment0$_variableIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        _this._async_environment0$_lastVariableName = $name;
+        _this._async_environment0$_lastVariableIndex = index;
+        t1 = J.$index$asx(_this._async_environment0$_variables[index], $name);
+        return t1 == null ? _this._async_environment0$_getVariableFromGlobalModule$1($name) : t1;
+      }
+      index = _this._async_environment0$_variableIndex$1($name);
+      if (index == null)
+        return _this._async_environment0$_getVariableFromGlobalModule$1($name);
+      _this._async_environment0$_lastVariableName = $name;
+      _this._async_environment0$_lastVariableIndex = index;
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._async_environment0$_variables[index], $name);
+      return t1 == null ? _this._async_environment0$_getVariableFromGlobalModule$1($name) : t1;
+    },
+    getVariable$1: function($name) {
+      return this.getVariable$2$namespace($name, null);
+    },
+    _async_environment0$_getVariableFromGlobalModule$1: function($name) {
+      return this._async_environment0$_fromOneModule$3($name, "variable", new Q.AsyncEnvironment__getVariableFromGlobalModule_closure0($name));
+    },
+    getVariableNode$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._async_environment0$_getModule$1(namespace).get$variableNodes().$index(0, $name);
+      if (_this._async_environment0$_lastVariableName === $name) {
+        t1 = J.$index$asx(_this._async_environment0$_variableNodes[_this._async_environment0$_lastVariableIndex], $name);
+        return t1 == null ? _this._async_environment0$_getVariableNodeFromGlobalModule$1($name) : t1;
+      }
+      t1 = _this._async_environment0$_variableIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        _this._async_environment0$_lastVariableName = $name;
+        _this._async_environment0$_lastVariableIndex = index;
+        t1 = J.$index$asx(_this._async_environment0$_variableNodes[index], $name);
+        return t1 == null ? _this._async_environment0$_getVariableNodeFromGlobalModule$1($name) : t1;
+      }
+      index = _this._async_environment0$_variableIndex$1($name);
+      if (index == null)
+        return _this._async_environment0$_getVariableNodeFromGlobalModule$1($name);
+      _this._async_environment0$_lastVariableName = $name;
+      _this._async_environment0$_lastVariableIndex = index;
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._async_environment0$_variableNodes[index], $name);
+      return t1 == null ? _this._async_environment0$_getVariableNodeFromGlobalModule$1($name) : t1;
+    },
+    _async_environment0$_getVariableNodeFromGlobalModule$1: function($name) {
+      var t1, value;
+      for (t1 = this._async_environment0$_globalModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();) {
+        value = t1._collection$_current.get$variableNodes().$index(0, $name);
+        if (value != null)
+          return value;
+      }
+      return null;
+    },
+    globalVariableExists$2$namespace: function($name, namespace) {
+      if (namespace != null)
+        return this._async_environment0$_getModule$1(namespace).get$variables().containsKey$1($name);
+      if (C.JSArray_methods.get$first(this._async_environment0$_variables).containsKey$1($name))
+        return true;
+      return this._async_environment0$_getVariableFromGlobalModule$1($name) != null;
+    },
+    globalVariableExists$1: function($name) {
+      return this.globalVariableExists$2$namespace($name, null);
+    },
+    _async_environment0$_variableIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._async_environment0$_variables, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    setVariable$5$global$namespace: function($name, value, nodeWithSpan, global, namespace) {
+      var t1, moduleWithName, cur, t2, index, _this = this;
+      if (namespace != null) {
+        _this._async_environment0$_getModule$1(namespace).setVariable$3($name, value, nodeWithSpan);
+        return;
+      }
+      if (global || _this._async_environment0$_variables.length === 1) {
+        _this._async_environment0$_variableIndices.putIfAbsent$2($name, new Q.AsyncEnvironment_setVariable_closure2(_this, $name));
+        t1 = _this._async_environment0$_variables;
+        if (!C.JSArray_methods.get$first(t1).containsKey$1($name)) {
+          moduleWithName = _this._async_environment0$_fromOneModule$3($name, "variable", new Q.AsyncEnvironment_setVariable_closure3($name));
+          if (moduleWithName != null) {
+            moduleWithName.setVariable$3($name, value, nodeWithSpan);
+            return;
+          }
+        }
+        J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, value);
+        t1 = _this._async_environment0$_variableNodes;
+        if (t1 != null)
+          J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, nodeWithSpan);
+        return;
+      }
+      if (_this._async_environment0$_nestedForwardedModules != null && !_this._async_environment0$_variableIndices.containsKey$1($name) && _this._async_environment0$_variableIndex$1($name) == null) {
+        t1 = _this._async_environment0$_nestedForwardedModules;
+        t1.toString;
+        t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>"));
+        t1 = new H.ListIterator(t1, t1.get$length(t1));
+        for (; t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          for (t2 = J.get$reversed$ax(cur), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+            cur = t2.__internal$_current;
+            if (cur.get$variables().containsKey$1($name)) {
+              cur.setVariable$3($name, value, nodeWithSpan);
+              return;
+            }
+          }
+        }
+      }
+      index = _this._async_environment0$_lastVariableName === $name ? _this._async_environment0$_lastVariableIndex : _this._async_environment0$_variableIndices.putIfAbsent$2($name, new Q.AsyncEnvironment_setVariable_closure4(_this, $name));
+      if (!_this._async_environment0$_inSemiGlobalScope && index === 0) {
+        index = _this._async_environment0$_variables.length - 1;
+        _this._async_environment0$_variableIndices.$indexSet(0, $name, index);
+      }
+      _this._async_environment0$_lastVariableName = $name;
+      _this._async_environment0$_lastVariableIndex = index;
+      J.$indexSet$ax(_this._async_environment0$_variables[index], $name, value);
+      t1 = _this._async_environment0$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(t1[index], $name, nodeWithSpan);
+    },
+    setVariable$4$global: function($name, value, nodeWithSpan, global) {
+      return this.setVariable$5$global$namespace($name, value, nodeWithSpan, global, null);
+    },
+    setLocalVariable$3: function($name, value, nodeWithSpan) {
+      var index, _this = this,
+        t1 = _this._async_environment0$_variables,
+        t2 = t1.length;
+      _this._async_environment0$_lastVariableName = $name;
+      index = _this._async_environment0$_lastVariableIndex = t2 - 1;
+      _this._async_environment0$_variableIndices.$indexSet(0, $name, index);
+      J.$indexSet$ax(t1[index], $name, value);
+      t1 = _this._async_environment0$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(t1[index], $name, nodeWithSpan);
+    },
+    getFunction$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null) {
+        t1 = _this._async_environment0$_getModule$1(namespace);
+        return t1.get$functions(t1).$index(0, $name);
+      }
+      t1 = _this._async_environment0$_functionIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        t1 = J.$index$asx(_this._async_environment0$_functions[index], $name);
+        return t1 == null ? _this._async_environment0$_getFunctionFromGlobalModule$1($name) : t1;
+      }
+      index = _this._async_environment0$_functionIndex$1($name);
+      if (index == null)
+        return _this._async_environment0$_getFunctionFromGlobalModule$1($name);
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._async_environment0$_functions[index], $name);
+      return t1 == null ? _this._async_environment0$_getFunctionFromGlobalModule$1($name) : t1;
+    },
+    _async_environment0$_getFunctionFromGlobalModule$1: function($name) {
+      return this._async_environment0$_fromOneModule$3($name, "function", new Q.AsyncEnvironment__getFunctionFromGlobalModule_closure0($name));
+    },
+    _async_environment0$_functionIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._async_environment0$_functions, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    getMixin$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._async_environment0$_getModule$1(namespace).get$mixins().$index(0, $name);
+      t1 = _this._async_environment0$_mixinIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        t1 = J.$index$asx(_this._async_environment0$_mixins[index], $name);
+        return t1 == null ? _this._async_environment0$_getMixinFromGlobalModule$1($name) : t1;
+      }
+      index = _this._async_environment0$_mixinIndex$1($name);
+      if (index == null)
+        return _this._async_environment0$_getMixinFromGlobalModule$1($name);
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._async_environment0$_mixins[index], $name);
+      return t1 == null ? _this._async_environment0$_getMixinFromGlobalModule$1($name) : t1;
+    },
+    _async_environment0$_getMixinFromGlobalModule$1: function($name) {
+      return this._async_environment0$_fromOneModule$3($name, "mixin", new Q.AsyncEnvironment__getMixinFromGlobalModule_closure0($name));
+    },
+    _async_environment0$_mixinIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._async_environment0$_mixins, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    withContent$2: function($content, callback) {
+      return this.withContent$body$AsyncEnvironment0($content, callback);
+    },
+    withContent$body$AsyncEnvironment0: function($content, callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, oldContent;
+      var $async$withContent$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldContent = $async$self._async_environment0$_content;
+              $async$self._async_environment0$_content = $content;
+              $async$goto = 2;
+              return P._asyncAwait(callback.call$0(), $async$withContent$2);
+            case 2:
+              // returning from await.
+              $async$self._async_environment0$_content = oldContent;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$withContent$2, $async$completer);
+    },
+    asMixin$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, oldInMixin;
+      var $async$asMixin$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldInMixin = $async$self._async_environment0$_inMixin;
+              $async$self._async_environment0$_inMixin = true;
+              $async$goto = 2;
+              return P._asyncAwait(callback.call$0(), $async$asMixin$1);
+            case 2:
+              // returning from await.
+              $async$self._async_environment0$_inMixin = oldInMixin;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$asMixin$1, $async$completer);
+    },
+    scope$1$3$semiGlobal$when: function(callback, semiGlobal, when, $T) {
+      return this.scope$body$AsyncEnvironment0(callback, semiGlobal, when, $T, $T._eval$1("0*"));
+    },
+    scope$1$1: function(callback, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, false, true, $T);
+    },
+    scope$1$2$when: function(callback, when, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, false, when, $T);
+    },
+    scope$1$2$semiGlobal: function(callback, semiGlobal, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, semiGlobal, true, $T);
+    },
+    scope$body$AsyncEnvironment0: function(callback, semiGlobal, when, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, wasInSemiGlobalScope, wasInSemiGlobalScope0, $name, name0, name1, t1, t2, t3, t4, t5;
+      var $async$scope$1$3$semiGlobal$when = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = !when ? 3 : 4;
+              break;
+            case 3:
+              // then
+              wasInSemiGlobalScope = $async$self._async_environment0$_inSemiGlobalScope;
+              $async$self._async_environment0$_inSemiGlobalScope = semiGlobal;
+              $async$handler = 5;
+              $async$goto = 8;
+              return P._asyncAwait(callback.call$0(), $async$scope$1$3$semiGlobal$when);
+            case 8:
+              // returning from await.
+              t1 = $async$result;
+              $async$returnValue = t1;
+              $async$next = [1];
+              // goto finally
+              $async$goto = 6;
+              break;
+              $async$next.push(7);
+              // goto finally
+              $async$goto = 6;
+              break;
+            case 5:
+              // uncaught
+              $async$next = [2];
+            case 6:
+              // finally
+              $async$handler = 2;
+              $async$self._async_environment0$_inSemiGlobalScope = wasInSemiGlobalScope;
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 7:
+              // after finally
+            case 4:
+              // join
+              semiGlobal = semiGlobal && $async$self._async_environment0$_inSemiGlobalScope;
+              wasInSemiGlobalScope0 = $async$self._async_environment0$_inSemiGlobalScope;
+              $async$self._async_environment0$_inSemiGlobalScope = semiGlobal;
+              t1 = $async$self._async_environment0$_variables;
+              t2 = type$.legacy_String;
+              C.JSArray_methods.add$1(t1, P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_Value_2));
+              t3 = $async$self._async_environment0$_variableNodes;
+              if (t3 != null)
+                C.JSArray_methods.add$1(t3, P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_AstNode_2));
+              t3 = $async$self._async_environment0$_functions;
+              t4 = type$.legacy_AsyncCallable_2;
+              C.JSArray_methods.add$1(t3, P.LinkedHashMap_LinkedHashMap$_empty(t2, t4));
+              t5 = $async$self._async_environment0$_mixins;
+              C.JSArray_methods.add$1(t5, P.LinkedHashMap_LinkedHashMap$_empty(t2, t4));
+              t4 = $async$self._async_environment0$_nestedForwardedModules;
+              if (t4 != null)
+                C.JSArray_methods.add$1(t4, H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_AsyncCallable_2));
+              $async$handler = 9;
+              $async$goto = 12;
+              return P._asyncAwait(callback.call$0(), $async$scope$1$3$semiGlobal$when);
+            case 12:
+              // returning from await.
+              t2 = $async$result;
+              $async$returnValue = t2;
+              $async$next = [1];
+              // goto finally
+              $async$goto = 10;
+              break;
+              $async$next.push(11);
+              // goto finally
+              $async$goto = 10;
+              break;
+            case 9:
+              // uncaught
+              $async$next = [2];
+            case 10:
+              // finally
+              $async$handler = 2;
+              $async$self._async_environment0$_inSemiGlobalScope = wasInSemiGlobalScope0;
+              $async$self._async_environment0$_lastVariableIndex = $async$self._async_environment0$_lastVariableName = null;
+              for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t1))), t2 = $async$self._async_environment0$_variableIndices; t1.moveNext$0();) {
+                $name = t1.get$current(t1);
+                t2.remove$1(0, $name);
+              }
+              for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t3))), t2 = $async$self._async_environment0$_functionIndices; t1.moveNext$0();) {
+                name0 = t1.get$current(t1);
+                t2.remove$1(0, name0);
+              }
+              for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t5))), t2 = $async$self._async_environment0$_mixinIndices; t1.moveNext$0();) {
+                name1 = t1.get$current(t1);
+                t2.remove$1(0, name1);
+              }
+              t1 = $async$self._async_environment0$_nestedForwardedModules;
+              if (t1 != null)
+                C.JSArray_methods.removeLast$0(t1);
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 11:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$scope$1$3$semiGlobal$when, $async$completer);
+    },
+    toImplicitConfiguration$0: function() {
+      var t2, t3, t4, t5, i, values, nodes, t6, t7,
+        t1 = type$.legacy_String,
+        configuration = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_ConfiguredValue_2);
+      for (t2 = this._async_environment0$_variables, t3 = this._async_environment0$_variableNodes, t4 = t3 == null, t5 = type$.legacy_AstNode_2, i = 0; i < t2.length; ++i) {
+        values = t2[i];
+        nodes = t4 ? P.LinkedHashMap_LinkedHashMap$_empty(t1, t5) : t3[i];
+        for (t6 = J.get$iterator$ax(values.get$keys(values)); t6.moveNext$0();) {
+          t7 = t6.get$current(t6);
+          configuration.$indexSet(0, t7, new Z.ConfiguredValue0(values.$index(0, t7), null, nodes.$index(0, t7)));
+        }
+      }
+      return new A.Configuration0(configuration, null, true);
+    },
+    _async_environment0$_getModule$1: function(namespace) {
+      var module = this._async_environment0$_modules.$index(0, namespace);
+      if (module != null)
+        return module;
+      throw H.wrapException(E.SassScriptException$0('There is no module with the namespace "' + namespace + '".'));
+    },
+    _async_environment0$_fromOneModule$1$3: function($name, type, callback) {
+      var cur, t2, value, identity, t3, valueInModule, identityFromModule, t4, t5,
+        t1 = this._async_environment0$_nestedForwardedModules;
+      if (t1 != null)
+        for (t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>")), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          for (t2 = J.get$reversed$ax(cur), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+            cur = t2.__internal$_current;
+            value = callback.call$1(cur);
+            if (value != null)
+              return value;
+          }
+        }
+      for (t1 = this._async_environment0$_globalModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications), t2 = type$.legacy_AsyncCallable_2, value = null, identity = null; t1.moveNext$0();) {
+        t3 = t1._collection$_current;
+        valueInModule = callback.call$1(t3);
+        if (valueInModule == null)
+          continue;
+        identityFromModule = t2._is(valueInModule) ? valueInModule : t3.variableIdentity$1($name);
+        if (identityFromModule.$eq(0, identity))
+          continue;
+        if (value != null) {
+          t1 = "This " + type + string$.x20is_av;
+          t2 = type + " use";
+          t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_FileSpan, type$.legacy_String);
+          for (t4 = this._async_environment0$_globalModuleNodes, t4 = t4.get$entries(t4), t4 = t4.get$iterator(t4); t4.moveNext$0();) {
+            t5 = t4.get$current(t4);
+            if (callback.call$1(t5.key) != null)
+              t3.$indexSet(0, t5.value.get$span(), "includes " + type);
+          }
+          throw H.wrapException(E.MultiSpanSassScriptException$0(t1, t2, t3));
+        }
+        identity = identityFromModule;
+        value = valueInModule;
+      }
+      return value;
+    },
+    _async_environment0$_fromOneModule$3: function($name, type, callback) {
+      return this._async_environment0$_fromOneModule$1$3($name, type, callback, type$.dynamic);
+    }
+  };
+  Q.AsyncEnvironment_importForwards_closure3.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$variables();
+      return t1.get$keys(t1);
+    },
+    $signature: 112
+  };
+  Q.AsyncEnvironment_importForwards_closure4.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$functions(module);
+      return t1.get$keys(t1);
+    },
+    $signature: 112
+  };
+  Q.AsyncEnvironment_importForwards_closure5.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$mixins();
+      return t1.get$keys(t1);
+    },
+    $signature: 112
+  };
+  Q.AsyncEnvironment_importForwards_closure6.prototype = {
+    call$1: function(_) {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_AsyncCallable_2);
+    },
+    $signature: 272
+  };
+  Q.AsyncEnvironment__getVariableFromGlobalModule_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$variables().$index(0, this.name);
+    },
+    $signature: 273
+  };
+  Q.AsyncEnvironment_setVariable_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._async_environment0$_lastVariableName = this.name;
+      return t1._async_environment0$_lastVariableIndex = 0;
+    },
+    $signature: 11
+  };
+  Q.AsyncEnvironment_setVariable_closure3.prototype = {
+    call$1: function(module) {
+      return module.get$variables().containsKey$1(this.name) ? module : null;
+    },
+    $signature: 168
+  };
+  Q.AsyncEnvironment_setVariable_closure4.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._async_environment0$_variableIndex$1(this.name);
+      return t2 == null ? t1._async_environment0$_variables.length - 1 : t2;
+    },
+    $signature: 11
+  };
+  Q.AsyncEnvironment__getFunctionFromGlobalModule_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$functions(module).$index(0, this.name);
+    },
+    $signature: 166
+  };
+  Q.AsyncEnvironment__getMixinFromGlobalModule_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$mixins().$index(0, this.name);
+    },
+    $signature: 166
+  };
+  Q._EnvironmentModule2.prototype = {
+    get$url: function() {
+      return this.css.get$span().file.url;
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      var t1, t2,
+        module = this._async_environment0$_modulesByVariable.$index(0, $name);
+      if (module != null) {
+        module.setVariable$3($name, value, nodeWithSpan);
+        return;
+      }
+      t1 = this._async_environment0$_environment;
+      t2 = t1._async_environment0$_variables;
+      if (!C.JSArray_methods.get$first(t2).containsKey$1($name))
+        throw H.wrapException(E.SassScriptException$0("Undefined variable."));
+      J.$indexSet$ax(C.JSArray_methods.get$first(t2), $name, value);
+      t1 = t1._async_environment0$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, nodeWithSpan);
+      return;
+    },
+    variableIdentity$1: function($name) {
+      var module = this._async_environment0$_modulesByVariable.$index(0, $name);
+      return module == null ? this : module.variableIdentity$1($name);
+    },
+    cloneCss$0: function() {
+      var newCssAndExtender, _this = this,
+        t1 = _this.css;
+      if (J.get$isEmpty$asx(t1.get$children(t1)))
+        return _this;
+      newCssAndExtender = V.cloneCssStylesheet0(t1, _this.extender);
+      return Q._EnvironmentModule$_2(_this._async_environment0$_environment, newCssAndExtender.item1, newCssAndExtender.item2, _this._async_environment0$_modulesByVariable, _this.variables, _this.variableNodes, _this.functions, _this.mixins, _this.transitivelyContainsCss, _this.transitivelyContainsExtensions);
+    },
+    toString$0: function(_) {
+      var t1 = this.css;
+      if (t1.get$span().file.url == null)
+        t1 = "<unknown url>";
+      else {
+        t1 = t1.get$span();
+        t1 = $.$get$context().prettyUri$1(t1.file.url);
+      }
+      return t1;
+    },
+    $isModule0: 1,
+    get$upstream: function() {
+      return this.upstream;
+    },
+    get$variables: function() {
+      return this.variables;
+    },
+    get$variableNodes: function() {
+      return this.variableNodes;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    },
+    get$extender: function() {
+      return this.extender;
+    },
+    get$css: function(receiver) {
+      return this.css;
+    },
+    get$transitivelyContainsCss: function() {
+      return this.transitivelyContainsCss;
+    },
+    get$transitivelyContainsExtensions: function() {
+      return this.transitivelyContainsExtensions;
+    }
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure17.prototype = {
+    call$1: function(module) {
+      return module.get$variables();
+    },
+    $signature: 276
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure18.prototype = {
+    call$1: function(module) {
+      return module.get$variableNodes();
+    },
+    $signature: 277
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure19.prototype = {
+    call$1: function(module) {
+      return module.get$functions(module);
+    },
+    $signature: 215
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure20.prototype = {
+    call$1: function(module) {
+      return module.get$mixins();
+    },
+    $signature: 215
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure21.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsCss();
+    },
+    $signature: 111
+  };
+  Q._EnvironmentModule__EnvironmentModule_closure22.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsExtensions();
+    },
+    $signature: 111
+  };
+  E._EvaluateVisitor2.prototype = {
+    _EvaluateVisitor$5$functions$importCache$logger$nodeImporter$sourceMap2: function(functions, importCache, logger, nodeImporter, sourceMap) {
+      var t2, cur, _i, metaModule, t3, module, $function, t4, _this = this,
+        _s20_ = "$name, $module: null",
+        _s9_ = "sass:meta",
+        metaFunctions = [Q.BuiltInCallable$function0("global-variable-exists", _s20_, new E._EvaluateVisitor_closure29(_this), _s9_), Q.BuiltInCallable$function0("variable-exists", "$name", new E._EvaluateVisitor_closure30(_this), _s9_), Q.BuiltInCallable$function0("function-exists", _s20_, new E._EvaluateVisitor_closure31(_this), _s9_), Q.BuiltInCallable$function0("mixin-exists", _s20_, new E._EvaluateVisitor_closure32(_this), _s9_), Q.BuiltInCallable$function0("content-exists", "", new E._EvaluateVisitor_closure33(_this), _s9_), Q.BuiltInCallable$function0("module-variables", "$module", new E._EvaluateVisitor_closure34(_this), _s9_), Q.BuiltInCallable$function0("module-functions", "$module", new E._EvaluateVisitor_closure35(_this), _s9_), Q.BuiltInCallable$function0("get-function", "$name, $css: false, $module: null", new E._EvaluateVisitor_closure36(_this), _s9_), new S.AsyncBuiltInCallable0("call", L.ScssParser$0("@function call($function, $args...) {", null, _s9_).parseArgumentDeclaration$0(), new E._EvaluateVisitor_closure37(_this))],
+        t1 = type$.JSArray_legacy_AsyncBuiltInCallable_2,
+        metaMixins = H.setRuntimeTypeInfo([S.AsyncBuiltInCallable$mixin0("load-css", "$url, $with: null", new E._EvaluateVisitor_closure38(_this), _s9_)], t1);
+      t1 = H.setRuntimeTypeInfo([], t1);
+      for (t2 = $.$get$global6(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (_i = 0; _i < 9; ++_i)
+        t1.push(metaFunctions[_i]);
+      metaModule = Q.BuiltInModule$0("meta", t1, metaMixins, null, type$.legacy_AsyncBuiltInCallable_2);
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_BuiltInModule_legacy_AsyncBuiltInCallable_2);
+      for (t2 = $.$get$coreModules0(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      t1.push(metaModule);
+      t2 = t1.length;
+      t3 = _this._async_evaluate0$_builtInModules;
+      _i = 0;
+      for (; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        module = t1[_i];
+        t3.$indexSet(0, module.url, module);
+      }
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AsyncCallable);
+      for (t2 = functions.length, _i = 0; _i < functions.length; functions.length === t2 || (0, H.throwConcurrentModificationError)(functions), ++_i)
+        t1.push(functions[_i]);
+      for (t2 = $.$get$globalFunctions0(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (_i = 0; _i < 9; ++_i)
+        t1.push(metaFunctions[_i]);
+      for (t2 = t1.length, t3 = _this._async_evaluate0$_builtInFunctions, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        $function = t1[_i];
+        t4 = $function.get$name($function);
+        t4.toString;
+        t3.$indexSet(0, H.stringReplaceAllUnchecked(t4, "_", "-"), $function);
+      }
+    },
+    run$2: function(_, importer, node) {
+      return this.run$body$_EvaluateVisitor0(_, importer, node);
+    },
+    run$body$_EvaluateVisitor0: function(_, importer, node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_EvaluateResult_2),
+        $async$returnValue, $async$self = this;
+      var $async$run$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = $async$self._async_evaluate0$_withWarnCallback$1$1(new E._EvaluateVisitor_run_closure2($async$self, node, importer), type$.legacy_FutureOr_legacy_EvaluateResult_2);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$run$2, $async$completer);
+    },
+    _async_evaluate0$_withWarnCallback$1$1: function(callback, $T) {
+      return N.withWarnCallback0(new E._EvaluateVisitor__withWarnCallback_closure2(this), callback, $T._eval$1("0*"));
+    },
+    _async_evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors: function(url, stackFrame, nodeWithSpan, callback, baseUrl, configuration, namesInErrors) {
+      return this._loadModule$body$_EvaluateVisitor0(url, stackFrame, nodeWithSpan, callback, baseUrl, configuration, namesInErrors);
+    },
+    _async_evaluate0$_loadModule$5$configuration: function(url, stackFrame, nodeWithSpan, callback, configuration) {
+      return this._async_evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors(url, stackFrame, nodeWithSpan, callback, null, configuration, false);
+    },
+    _async_evaluate0$_loadModule$4: function(url, stackFrame, nodeWithSpan, callback) {
+      return this._async_evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors(url, stackFrame, nodeWithSpan, callback, null, null, false);
+    },
+    _loadModule$body$_EvaluateVisitor0: function(url, stackFrame, nodeWithSpan, callback, baseUrl, configuration, namesInErrors) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$self = this, t1, builtInModule;
+      var $async$_async_evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              builtInModule = $async$self._async_evaluate0$_builtInModules.$index(0, url);
+              if (builtInModule != null) {
+                if (configuration != null && !configuration.isImplicit) {
+                  t1 = namesInErrors ? "Built-in module " + H.S(url) + " can't be configured." : "Built-in modules can't be configured.";
+                  throw H.wrapException($async$self._async_evaluate0$_exception$2(t1, nodeWithSpan.get$span()));
+                }
+                $async$self._async_evaluate0$_addExceptionSpan$2(nodeWithSpan, new E._EvaluateVisitor__loadModule_closure5(callback, builtInModule));
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_withStackFrame$1$3(stackFrame, nodeWithSpan, new E._EvaluateVisitor__loadModule_closure6($async$self, url, nodeWithSpan, baseUrl, namesInErrors, configuration, callback), type$.Null), $async$_async_evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors);
+            case 3:
+              // returning from await.
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors, $async$completer);
+    },
+    _async_evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan: function(importer, stylesheet, configuration, namesInErrors, nodeWithSpan) {
+      return this._execute$body$_EvaluateVisitor0(importer, stylesheet, configuration, namesInErrors, nodeWithSpan);
+    },
+    _async_evaluate0$_execute$2: function(importer, stylesheet) {
+      return this._async_evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan(importer, stylesheet, null, false, null);
+    },
+    _execute$body$_EvaluateVisitor0: function(importer, stylesheet, configuration, namesInErrors, nodeWithSpan) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Module_legacy_AsyncCallable_2),
+        $async$returnValue, $async$self = this, message, existingNode, environment, extender, module, t1, url, t2, alreadyLoaded;
+      var $async$_async_evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              url = stylesheet.span.file.url;
+              t2 = $async$self._async_evaluate0$_modules;
+              alreadyLoaded = t2.$index(0, url);
+              if (alreadyLoaded != null) {
+                t1 = configuration == null;
+                if (!(t1 ? $async$self._async_evaluate0$_configuration : configuration).isImplicit) {
+                  message = namesInErrors ? H.S($.$get$context().prettyUri$1(url)) + string$.x20was_a : string$.This_mw;
+                  existingNode = $async$self._async_evaluate0$_moduleNodes.$index(0, url);
+                  t2 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_FileSpan, type$.legacy_String);
+                  if (existingNode != null)
+                    t2.$indexSet(0, existingNode.get$span(), "original load");
+                  if (t1)
+                    t2.$indexSet(0, $async$self._async_evaluate0$_configuration.nodeWithSpan.get$span(), "configuration");
+                  throw H.wrapException(t2.get$isEmpty(t2) ? $async$self._async_evaluate0$_exception$1(message) : $async$self._async_evaluate0$_multiSpanException$3(message, "new load", t2));
+                }
+                $async$returnValue = alreadyLoaded;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              environment = Q.AsyncEnvironment$0($async$self._async_evaluate0$_sourceMap);
+              t1.css = null;
+              extender = F.Extender$0();
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_withEnvironment$1$2(environment, new E._EvaluateVisitor__execute_closure2(t1, $async$self, importer, stylesheet, extender, configuration), type$.Null), $async$_async_evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan);
+            case 3:
+              // returning from await.
+              module = Q._EnvironmentModule__EnvironmentModule2(environment, t1.css, extender, environment._async_environment0$_forwardedModules);
+              t2.$indexSet(0, url, module);
+              $async$self._async_evaluate0$_moduleNodes.$indexSet(0, url, nodeWithSpan);
+              $async$returnValue = module;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan, $async$completer);
+    },
+    _async_evaluate0$_addOutOfOrderImports$0: function() {
+      var t1, statements, _this = this;
+      if (_this._async_evaluate0$_outOfOrderImports == null)
+        return _this._async_evaluate0$_root.children;
+      t1 = new Array(J.get$length$asx(_this._async_evaluate0$_root.children._collection$_source) + _this._async_evaluate0$_outOfOrderImports.length);
+      t1.fixed$length = Array;
+      statements = new G.FixedLengthListBuilder0(H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_ModifiableCssNode_2), type$.FixedLengthListBuilder_legacy_ModifiableCssNode_2);
+      statements.addRange$3(_this._async_evaluate0$_root.children, 0, _this._async_evaluate0$_endOfImports);
+      statements.addAll$1(0, _this._async_evaluate0$_outOfOrderImports);
+      statements.addRange$2(_this._async_evaluate0$_root.children, _this._async_evaluate0$_endOfImports);
+      return statements.build$0();
+    },
+    _async_evaluate0$_combineCss$2$clone: function(root, clone) {
+      var selectors, unsatisfiedExtension, sortedModules, t1, imports, css, cur, t2, statements, index, _this = this;
+      if (!C.JSArray_methods.any$1(root.get$upstream(), new E._EvaluateVisitor__combineCss_closure8())) {
+        selectors = root.get$extender().get$simpleSelectors();
+        unsatisfiedExtension = B.firstOrNull0(root.get$extender().extensionsWhereTarget$1(new E._EvaluateVisitor__combineCss_closure9(selectors)));
+        if (unsatisfiedExtension != null)
+          _this._async_evaluate0$_throwForUnsatisfiedExtension$1(unsatisfiedExtension);
+        return root.get$css(root);
+      }
+      sortedModules = _this._async_evaluate0$_topologicalModules$1(root);
+      if (clone) {
+        t1 = sortedModules.$ti._eval$1("MappedListIterable<ListMixin.E,Module0<AsyncCallable0*>*>");
+        sortedModules = P.List_List$from(new H.MappedListIterable(sortedModules, new E._EvaluateVisitor__combineCss_closure10(), t1), true, t1._eval$1("ListIterable.E"));
+      }
+      _this._async_evaluate0$_extendModules$1(sortedModules);
+      t1 = type$.JSArray_legacy_CssNode_2;
+      imports = H.setRuntimeTypeInfo([], t1);
+      css = H.setRuntimeTypeInfo([], t1);
+      for (t1 = J.get$reversed$ax(sortedModules), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        t2 = cur.get$css(cur);
+        statements = t2.get$children(t2);
+        index = _this._async_evaluate0$_indexAfterImports$1(statements);
+        t2 = J.getInterceptor$ax(statements);
+        C.JSArray_methods.addAll$1(imports, t2.getRange$2(statements, 0, index));
+        C.JSArray_methods.addAll$1(css, t2.getRange$2(statements, index, t2.get$length(statements)));
+      }
+      return new V.CssStylesheet0(new P.UnmodifiableListView(C.JSArray_methods.$add(imports, css), type$.UnmodifiableListView_legacy_CssNode_2), root.get$css(root).get$span());
+    },
+    _async_evaluate0$_combineCss$1: function(root) {
+      return this._async_evaluate0$_combineCss$2$clone(root, false);
+    },
+    _async_evaluate0$_extendModules$1: function(sortedModules) {
+      var t1, t2, originalSelectors, extenders, t3, t4, _i,
+        downstreamExtenders = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Uri, type$.legacy_List_legacy_Extender_2),
+        unsatisfiedExtensions = new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_Extension_2);
+      for (t1 = J.get$iterator$ax(sortedModules); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        originalSelectors = t2.get$extender().get$simpleSelectors().toSet$0(0);
+        unsatisfiedExtensions.addAll$1(0, t2.get$extender().extensionsWhereTarget$1(new E._EvaluateVisitor__extendModules_closure5(originalSelectors)));
+        extenders = downstreamExtenders.$index(0, t2.get$url());
+        if (extenders != null)
+          t2.get$extender().addExtensions$1(extenders);
+        t3 = t2.get$extender();
+        if (t3.get$isEmpty(t3))
+          continue;
+        for (t3 = t2.get$upstream(), t4 = t3.length, _i = 0; _i < t3.length; t3.length === t4 || (0, H.throwConcurrentModificationError)(t3), ++_i)
+          J.add$1$ax(downstreamExtenders.putIfAbsent$2(t3[_i].get$url(), new E._EvaluateVisitor__extendModules_closure6()), t2.get$extender());
+        unsatisfiedExtensions.removeAll$1(t2.get$extender().extensionsWhereTarget$1(originalSelectors.get$contains(originalSelectors)));
+      }
+      if (unsatisfiedExtensions._collection$_length !== 0)
+        this._async_evaluate0$_throwForUnsatisfiedExtension$1(unsatisfiedExtensions.get$first(unsatisfiedExtensions));
+    },
+    _async_evaluate0$_throwForUnsatisfiedExtension$1: function(extension) {
+      throw H.wrapException(E.SassException$0(string$.The_ta + H.S(extension.target) + ' !optional" to avoid this error.', extension.span));
+    },
+    _async_evaluate0$_topologicalModules$1: function(root) {
+      var t1 = type$.legacy_Module_legacy_AsyncCallable_2,
+        sorted = Q.QueueList$(null, t1);
+      new E._EvaluateVisitor__topologicalModules_visitModule2(P.LinkedHashSet_LinkedHashSet$_empty(t1), sorted).call$1(root);
+      return sorted;
+    },
+    _async_evaluate0$_indexAfterImports$1: function(statements) {
+      var t1, t2, t3, lastImport, i, statement;
+      for (t1 = J.getInterceptor$asx(statements), t2 = type$.legacy_CssComment_2, t3 = type$.legacy_CssImport_2, lastImport = -1, i = 0; i < t1.get$length(statements); ++i) {
+        statement = t1.$index(statements, i);
+        if (t3._is(statement))
+          lastImport = i;
+        else if (!t2._is(statement))
+          break;
+      }
+      return lastImport + 1;
+    },
+    visitStylesheet$1: function(node) {
+      return this.visitStylesheet$body$_EvaluateVisitor0(node);
+    },
+    visitStylesheet$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, _i;
+      var $async$visitStylesheet$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.children, t2 = t1.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(t1[_i].accept$1($async$self), $async$visitStylesheet$1);
+            case 6:
+              // returning from await.
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitStylesheet$1, $async$completer);
+    },
+    visitAtRootRule$1: function(node) {
+      return this.visitAtRootRule$body$_EvaluateVisitor0(node);
+    },
+    visitAtRootRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, root, innerCopy, outerCopy, cur, copy, t1, query, $parent, included, $async$temp1, $async$temp2;
+      var $async$visitAtRootRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.query;
+              $async$goto = t1 != null ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$temp1 = t1;
+              $async$temp2 = E;
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate0$_performInterpolation$2$warnForColor(t1, true), $async$visitAtRootRule$1);
+            case 6:
+              // returning from await.
+              $async$result = $async$self._async_evaluate0$_adjustParseError$2($async$temp1, new $async$temp2._EvaluateVisitor_visitAtRootRule_closure8($async$self, $async$result));
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$result = C.AtRootQuery_UsS0;
+            case 4:
+              // join
+              query = $async$result;
+              $parent = $async$self._async_evaluate0$_parent;
+              included = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssParentNode_2);
+              for (t1 = type$.legacy_CssStylesheet_2; !t1._is($parent);) {
+                if (!query.excludes$1($parent))
+                  included.push($parent);
+                $parent = $parent._node2$_parent;
+              }
+              root = $async$self._async_evaluate0$_trimIncluded$1(included);
+              $async$goto = root == $async$self._async_evaluate0$_parent ? 7 : 8;
+              break;
+            case 7:
+              // then
+              $async$goto = 9;
+              return P._asyncAwait($async$self._async_evaluate0$_environment.scope$1$2$when(new E._EvaluateVisitor_visitAtRootRule_closure9($async$self, node), node.hasDeclarations, type$.Null), $async$visitAtRootRule$1);
+            case 9:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 8:
+              // join
+              innerCopy = included.length === 0 ? null : C.JSArray_methods.get$first(included).copyWithoutChildren$0();
+              for (t1 = H.SubListIterable$(included, 1, null, type$.legacy_ModifiableCssParentNode_2), t1 = new H.ListIterator(t1, t1.get$length(t1)), outerCopy = innerCopy; t1.moveNext$0(); outerCopy = copy) {
+                cur = t1.__internal$_current;
+                copy = cur.copyWithoutChildren$0();
+                copy.addChild$1(outerCopy);
+              }
+              if (outerCopy != null)
+                root.addChild$1(outerCopy);
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate0$_scopeForAtRoot$4(node, innerCopy == null ? root : innerCopy, query, included).call$1(new E._EvaluateVisitor_visitAtRootRule_closure10($async$self, node)), $async$visitAtRootRule$1);
+            case 10:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitAtRootRule$1, $async$completer);
+    },
+    _async_evaluate0$_trimIncluded$1: function(nodes) {
+      var $parent, innermostContiguous, i, t2, root,
+        t1 = nodes.length;
+      if (t1 === 0)
+        return this._async_evaluate0$_root;
+      $parent = this._async_evaluate0$_parent;
+      for (innermostContiguous = null, i = 0; i < t1; ++i) {
+        for (; $parent != nodes[i]; innermostContiguous = null)
+          $parent = $parent._node2$_parent;
+        if (innermostContiguous == null)
+          innermostContiguous = i;
+        $parent = $parent._node2$_parent;
+      }
+      t2 = this._async_evaluate0$_root;
+      if ($parent != t2)
+        return t2;
+      root = nodes[innermostContiguous];
+      C.JSArray_methods.removeRange$2(nodes, innermostContiguous, t1);
+      return root;
+    },
+    _async_evaluate0$_scopeForAtRoot$4: function(node, newParent, query, included) {
+      var _this = this,
+        scope = new E._EvaluateVisitor__scopeForAtRoot_closure17(_this, newParent, node),
+        t1 = query._at_root_query0$_all || query._at_root_query0$_rule;
+      if (t1 !== query.include)
+        scope = new E._EvaluateVisitor__scopeForAtRoot_closure18(_this, scope);
+      if (_this._async_evaluate0$_mediaQueries != null && query.excludesName$1("media"))
+        scope = new E._EvaluateVisitor__scopeForAtRoot_closure19(_this, scope);
+      if (_this._async_evaluate0$_inKeyframes && query.excludesName$1("keyframes"))
+        scope = new E._EvaluateVisitor__scopeForAtRoot_closure20(_this, scope);
+      return _this._async_evaluate0$_inUnknownAtRule && !C.JSArray_methods.any$1(included, new E._EvaluateVisitor__scopeForAtRoot_closure21()) ? new E._EvaluateVisitor__scopeForAtRoot_closure22(_this, scope) : scope;
+    },
+    visitContentBlock$1: function(node) {
+      return H.throwExpression(P.UnsupportedError$(string$.Evalua));
+    },
+    visitContentRule$1: function(node) {
+      return this.visitContentRule$body$_EvaluateVisitor0(node);
+    },
+    visitContentRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, $content;
+      var $async$visitContentRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $content = $async$self._async_evaluate0$_environment._async_environment0$_content;
+              if ($content == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_runUserDefinedCallable$4(node.$arguments, $content, node, new E._EvaluateVisitor_visitContentRule_closure2($async$self, $content)), $async$visitContentRule$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitContentRule$1, $async$completer);
+    },
+    visitDebugRule$1: function(node) {
+      return this.visitDebugRule$body$_EvaluateVisitor0(node);
+    },
+    visitDebugRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, value, t1;
+      var $async$visitDebugRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(node.expression.accept$1($async$self), $async$visitDebugRule$1);
+            case 3:
+              // returning from await.
+              value = $async$result;
+              t1 = value instanceof D.SassString0 ? value.text : J.toString$0$(value);
+              $async$self._async_evaluate0$_logger.debug$2(0, t1, node.span);
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitDebugRule$1, $async$completer);
+    },
+    visitDeclaration$1: function(node) {
+      return this.visitDeclaration$body$_EvaluateVisitor0(node);
+    },
+    visitDeclaration$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, $name, t2, cssValue, t3, oldDeclarationName, $async$temp1;
+      var $async$visitDeclaration$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (!($async$self._async_evaluate0$_styleRule != null && !$async$self._async_evaluate0$_atRootExcludingStyleRule) && !$async$self._async_evaluate0$_inUnknownAtRule && !$async$self._async_evaluate0$_inKeyframes)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Declarm, node.span));
+              t1 = node.name;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_interpolationToValue$2$warnForColor(t1, true), $async$visitDeclaration$1);
+            case 3:
+              // returning from await.
+              $name = $async$result;
+              t2 = $async$self._async_evaluate0$_declarationName;
+              if (t2 != null)
+                $name = new F.CssValue0(t2 + "-" + H.S($name.get$value($name)), $name.get$span(), type$.CssValue_legacy_String_2);
+              t2 = node.value;
+              $async$goto = t2 == null ? 4 : 6;
+              break;
+            case 4:
+              // then
+              $async$result = null;
+              // goto join
+              $async$goto = 5;
+              break;
+            case 6:
+              // else
+              $async$temp1 = F;
+              $async$goto = 7;
+              return P._asyncAwait(t2.accept$1($async$self), $async$visitDeclaration$1);
+            case 7:
+              // returning from await.
+              $async$result = new $async$temp1.CssValue0($async$result, t2.get$span(), type$.CssValue_legacy_Value_2);
+            case 5:
+              // join
+              cssValue = $async$result;
+              if (cssValue != null) {
+                t3 = cssValue.value;
+                t3 = !t3.get$isBlank() || t3.get$asList().length === 0;
+              } else
+                t3 = false;
+              if (t3) {
+                t3 = $async$self._async_evaluate0$_parent;
+                t1 = C.JSString_methods.startsWith$1(t1.get$initialPlain(), "--");
+                t2 = $async$self._async_evaluate0$_expressionNode$1(t2);
+                t2 = t2 == null ? null : t2.get$span();
+                t3.addChild$1(L.ModifiableCssDeclaration$0($name, cssValue, node.span, t1, t2));
+              } else if (J.startsWith$1$s($name.get$value($name), "--") && node.children == null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2("Custom property values may not be empty.", t2.get$span()));
+              $async$goto = node.children != null ? 8 : 9;
+              break;
+            case 8:
+              // then
+              oldDeclarationName = $async$self._async_evaluate0$_declarationName;
+              $async$self._async_evaluate0$_declarationName = $name.get$value($name);
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate0$_environment.scope$1$2$when(new E._EvaluateVisitor_visitDeclaration_closure2($async$self, node), node.hasDeclarations, type$.Null), $async$visitDeclaration$1);
+            case 10:
+              // returning from await.
+              $async$self._async_evaluate0$_declarationName = oldDeclarationName;
+            case 9:
+              // join
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitDeclaration$1, $async$completer);
+    },
+    visitEachRule$1: function(node) {
+      return this.visitEachRule$body$_EvaluateVisitor0(node);
+    },
+    visitEachRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, list, nodeWithSpan, setVariables;
+      var $async$visitEachRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.list;
+              $async$goto = 3;
+              return P._asyncAwait(t1.accept$1($async$self), $async$visitEachRule$1);
+            case 3:
+              // returning from await.
+              list = $async$result;
+              nodeWithSpan = $async$self._async_evaluate0$_expressionNode$1(t1);
+              setVariables = node.variables.length === 1 ? new E._EvaluateVisitor_visitEachRule_closure8($async$self, node, nodeWithSpan) : new E._EvaluateVisitor_visitEachRule_closure9($async$self, node, nodeWithSpan);
+              $async$returnValue = $async$self._async_evaluate0$_environment.scope$1$2$semiGlobal(new E._EvaluateVisitor_visitEachRule_closure10($async$self, list, setVariables, node), true, type$.legacy_Value_2);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitEachRule$1, $async$completer);
+    },
+    _async_evaluate0$_setMultipleVariables$3: function(variables, value, nodeWithSpan) {
+      var i,
+        list = value.get$asList(),
+        t1 = variables.length,
+        minLength = Math.min(t1, list.length);
+      for (i = 0; i < minLength; ++i)
+        this._async_evaluate0$_environment.setLocalVariable$3(variables[i], list[i].withoutSlash$0(), nodeWithSpan);
+      for (i = minLength; i < t1; ++i)
+        this._async_evaluate0$_environment.setLocalVariable$3(variables[i], C.C_SassNull, nodeWithSpan);
+    },
+    visitErrorRule$1: function(node) {
+      return this.visitErrorRule$body$_EvaluateVisitor0(node);
+    },
+    visitErrorRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$self = this, $async$temp1, $async$temp2;
+      var $async$visitErrorRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = H;
+              $async$temp2 = J;
+              $async$goto = 2;
+              return P._asyncAwait(node.expression.accept$1($async$self), $async$visitErrorRule$1);
+            case 2:
+              // returning from await.
+              throw $async$temp1.wrapException($async$self._async_evaluate0$_exception$2($async$temp2.toString$0$($async$result), node.span));
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitErrorRule$1, $async$completer);
+    },
+    visitExtendRule$1: function(node) {
+      return this.visitExtendRule$body$_EvaluateVisitor0(node);
+    },
+    visitExtendRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, targetText, t1, t2, t3, _i, t4;
+      var $async$visitExtendRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (!($async$self._async_evaluate0$_styleRule != null && !$async$self._async_evaluate0$_atRootExcludingStyleRule) || $async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.x40exten, node.span));
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_interpolationToValue$2$warnForColor(node.selector, true), $async$visitExtendRule$1);
+            case 3:
+              // returning from await.
+              targetText = $async$result;
+              for (t1 = $async$self._async_evaluate0$_adjustParseError$2(targetText, new E._EvaluateVisitor_visitExtendRule_closure2($async$self, targetText)).components, t2 = t1.length, t3 = type$.legacy_CompoundSelector_2, _i = 0; _i < t2; ++_i) {
+                t4 = t1[_i].components;
+                if (t4.length !== 1 || !(C.JSArray_methods.get$first(t4) instanceof X.CompoundSelector0))
+                  throw H.wrapException(E.SassFormatException$0("complex selectors may not be extended.", targetText.get$span()));
+                t4 = t3._as(C.JSArray_methods.get$first(t4)).components;
+                if (t4.length !== 1)
+                  throw H.wrapException(E.SassFormatException$0(string$.compou + C.JSArray_methods.join$1(t4, ", ") + string$.x60_inst, targetText.get$span()));
+                $async$self._async_evaluate0$_extender.addExtension$4($async$self._async_evaluate0$_styleRule.selector, C.JSArray_methods.get$first(t4), node, $async$self._async_evaluate0$_mediaQueries);
+              }
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitExtendRule$1, $async$completer);
+    },
+    visitAtRule$1: function(node) {
+      return this.visitAtRule$body$_EvaluateVisitor0(node);
+    },
+    visitAtRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, $name, t1, value, wasInKeyframes, wasInUnknownAtRule;
+      var $async$visitAtRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.At_rul, node.span));
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_interpolationToValue$1(node.name), $async$visitAtRule$1);
+            case 3:
+              // returning from await.
+              $name = $async$result;
+              t1 = node.value;
+              $async$goto = t1 == null ? 4 : 6;
+              break;
+            case 4:
+              // then
+              $async$result = null;
+              // goto join
+              $async$goto = 5;
+              break;
+            case 6:
+              // else
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate0$_interpolationToValue$3$trim$warnForColor(t1, true, true), $async$visitAtRule$1);
+            case 7:
+              // returning from await.
+            case 5:
+              // join
+              value = $async$result;
+              if (node.children == null) {
+                $async$self._async_evaluate0$_parent.addChild$1(U.ModifiableCssAtRule$0($name, node.span, true, value));
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              wasInKeyframes = $async$self._async_evaluate0$_inKeyframes;
+              wasInUnknownAtRule = $async$self._async_evaluate0$_inUnknownAtRule;
+              if (B.unvendor0($name.get$value($name)) === "keyframes")
+                $async$self._async_evaluate0$_inKeyframes = true;
+              else
+                $async$self._async_evaluate0$_inUnknownAtRule = true;
+              $async$goto = 8;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(U.ModifiableCssAtRule$0($name, node.span, false, value), new E._EvaluateVisitor_visitAtRule_closure5($async$self, node), node.hasDeclarations, new E._EvaluateVisitor_visitAtRule_closure6(), type$.legacy_ModifiableCssAtRule_2, type$.Null), $async$visitAtRule$1);
+            case 8:
+              // returning from await.
+              $async$self._async_evaluate0$_inUnknownAtRule = wasInUnknownAtRule;
+              $async$self._async_evaluate0$_inKeyframes = wasInKeyframes;
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitAtRule$1, $async$completer);
+    },
+    visitForRule$1: function(node) {
+      return this.visitForRule$body$_EvaluateVisitor0(node);
+    },
+    visitForRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, t3, fromNumber, t4, toNumber, from, to, direction;
+      var $async$visitForRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              t2 = node.from;
+              t3 = type$.legacy_SassNumber_2;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_addExceptionSpanAsync$1$2(t2, new E._EvaluateVisitor_visitForRule_closure14($async$self, node), t3), $async$visitForRule$1);
+            case 3:
+              // returning from await.
+              fromNumber = $async$result;
+              t4 = node.to;
+              $async$goto = 4;
+              return P._asyncAwait($async$self._async_evaluate0$_addExceptionSpanAsync$1$2(t4, new E._EvaluateVisitor_visitForRule_closure15($async$self, node), t3), $async$visitForRule$1);
+            case 4:
+              // returning from await.
+              toNumber = $async$result;
+              from = $async$self._async_evaluate0$_addExceptionSpan$2(t2, new E._EvaluateVisitor_visitForRule_closure16(fromNumber));
+              to = t1.to = $async$self._async_evaluate0$_addExceptionSpan$2(t4, new E._EvaluateVisitor_visitForRule_closure17(toNumber, fromNumber));
+              direction = from > to ? -1 : 1;
+              if (from === (!node.isExclusive ? t1.to = to + direction : to)) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$returnValue = $async$self._async_evaluate0$_environment.scope$1$2$semiGlobal(new E._EvaluateVisitor_visitForRule_closure18(t1, $async$self, node, from, direction, fromNumber), true, type$.legacy_Value_2);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitForRule$1, $async$completer);
+    },
+    visitForwardRule$1: function(node) {
+      return this.visitForwardRule$body$_EvaluateVisitor0(node);
+    },
+    visitForwardRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, newConfiguration, t4, _i, variable, oldConfiguration, adjustedConfiguration, t1, t2, t3;
+      var $async$visitForwardRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldConfiguration = $async$self._async_evaluate0$_configuration;
+              adjustedConfiguration = oldConfiguration.throughForward$1(node);
+              t1 = node.configuration;
+              t2 = t1.length;
+              t3 = node.url;
+              $async$goto = t2 !== 0 ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate0$_addForwardConfiguration$2(adjustedConfiguration, node), $async$visitForwardRule$1);
+            case 6:
+              // returning from await.
+              newConfiguration = $async$result;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate0$_loadModule$5$configuration(t3, "@forward", node, new E._EvaluateVisitor_visitForwardRule_closure5($async$self, node), newConfiguration), $async$visitForwardRule$1);
+            case 7:
+              // returning from await.
+              t3 = type$.legacy_String;
+              t4 = P.LinkedHashSet_LinkedHashSet(t3);
+              for (_i = 0; _i < t2; ++_i) {
+                variable = t1[_i];
+                if (!variable.isGuarded)
+                  t4.add$1(0, variable.name);
+              }
+              $async$self._async_evaluate0$_removeUsedConfiguration$3$except(adjustedConfiguration, newConfiguration, t4);
+              t3 = P.LinkedHashSet_LinkedHashSet(t3);
+              for (_i = 0; _i < t2; ++_i)
+                t3.add$1(0, t1[_i].name);
+              $async$self._async_evaluate0$_assertConfigurationIsEmpty$2$only(newConfiguration, t3);
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$self._async_evaluate0$_configuration = adjustedConfiguration;
+              $async$goto = 8;
+              return P._asyncAwait($async$self._async_evaluate0$_loadModule$4(t3, "@forward", node, new E._EvaluateVisitor_visitForwardRule_closure6($async$self, node)), $async$visitForwardRule$1);
+            case 8:
+              // returning from await.
+              $async$self._async_evaluate0$_configuration = oldConfiguration;
+            case 4:
+              // join
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitForwardRule$1, $async$completer);
+    },
+    _async_evaluate0$_addForwardConfiguration$2: function(configuration, node) {
+      return this._addForwardConfiguration$body$_EvaluateVisitor0(configuration, node);
+    },
+    _addForwardConfiguration$body$_EvaluateVisitor0: function(configuration, node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Configuration_2),
+        $async$returnValue, $async$self = this, t2, t3, _i, variable, t4, t5, t1, newValues, $async$temp1, $async$temp2, $async$temp3;
+      var $async$_async_evaluate0$_addForwardConfiguration$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = configuration._configuration$_values;
+              newValues = P.LinkedHashMap_LinkedHashMap$of(new P.UnmodifiableMapView(t1, type$.UnmodifiableMapView_of_legacy_String_and_legacy_ConfiguredValue_2), type$.legacy_String, type$.legacy_ConfiguredValue_2);
+              t2 = node.configuration, t3 = t2.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              variable = t2[_i];
+              if (variable.isGuarded) {
+                t4 = variable.name;
+                t5 = t1.get$isEmpty(t1) ? null : t1.remove$1(0, t4);
+                if (t5 != null && !J.$eq$(t5.value, C.C_SassNull)) {
+                  newValues.$indexSet(0, t4, t5);
+                  // goto for update
+                  $async$goto = 4;
+                  break;
+                }
+              }
+              t4 = variable.name;
+              t5 = variable.expression;
+              $async$temp1 = newValues;
+              $async$temp2 = t4;
+              $async$temp3 = Z;
+              $async$goto = 6;
+              return P._asyncAwait(t5.accept$1($async$self), $async$_async_evaluate0$_addForwardConfiguration$2);
+            case 6:
+              // returning from await.
+              $async$temp1.$indexSet(0, $async$temp2, new $async$temp3.ConfiguredValue0($async$result.withoutSlash$0(), variable.span, $async$self._async_evaluate0$_expressionNode$1(t5)));
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = new A.Configuration0(newValues, node, false);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_addForwardConfiguration$2, $async$completer);
+    },
+    _async_evaluate0$_removeUsedConfiguration$3$except: function(upstream, downstream, except) {
+      var t1, t2, t3, _i, $name;
+      for (t1 = upstream._configuration$_values, t2 = J.toList$0$ax(t1.get$keys(t1)), t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i) {
+        $name = t2[_i];
+        if (except.contains$1(0, $name))
+          continue;
+        if (!downstream._configuration$_values.containsKey$1($name))
+          if (!t1.get$isEmpty(t1))
+            t1.remove$1(0, $name);
+      }
+    },
+    _async_evaluate0$_assertConfigurationIsEmpty$3$nameInError$only: function(configuration, nameInError, only) {
+      configuration._configuration$_values.forEach$1(0, new E._EvaluateVisitor__assertConfigurationIsEmpty_closure2(this, only, nameInError));
+    },
+    _async_evaluate0$_assertConfigurationIsEmpty$1: function(configuration) {
+      return this._async_evaluate0$_assertConfigurationIsEmpty$3$nameInError$only(configuration, false, null);
+    },
+    _async_evaluate0$_assertConfigurationIsEmpty$2$only: function(configuration, only) {
+      return this._async_evaluate0$_assertConfigurationIsEmpty$3$nameInError$only(configuration, false, only);
+    },
+    _async_evaluate0$_assertConfigurationIsEmpty$2$nameInError: function(configuration, nameInError) {
+      return this._async_evaluate0$_assertConfigurationIsEmpty$3$nameInError$only(configuration, nameInError, null);
+    },
+    visitFunctionRule$1: function(node) {
+      return this.visitFunctionRule$body$_EvaluateVisitor0(node);
+    },
+    visitFunctionRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, t3, index, t4;
+      var $async$visitFunctionRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate0$_environment;
+              t2 = t1.closure$0();
+              t3 = t1._async_environment0$_functions;
+              index = t3.length - 1;
+              t4 = node.name;
+              t1._async_environment0$_functionIndices.$indexSet(0, t4, index);
+              J.$indexSet$ax(t3[index], t4, new E.UserDefinedCallable0(node, t2, type$.UserDefinedCallable_legacy_AsyncEnvironment_2));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitFunctionRule$1, $async$completer);
+    },
+    visitIfRule$1: function(node) {
+      return this.visitIfRule$body$_EvaluateVisitor0(node);
+    },
+    visitIfRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, _i, clauseToCheck, _box_0;
+      var $async$visitIfRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              _box_0 = {};
+              _box_0.clause = node.lastClause;
+              t1 = node.clauses, t2 = t1.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              clauseToCheck = t1[_i];
+              $async$goto = 6;
+              return P._asyncAwait(clauseToCheck.expression.accept$1($async$self), $async$visitIfRule$1);
+            case 6:
+              // returning from await.
+              if ($async$result.get$isTruthy()) {
+                _box_0.clause = clauseToCheck;
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              t1 = _box_0.clause;
+              if (t1 == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate0$_environment.scope$1$3$semiGlobal$when(new E._EvaluateVisitor_visitIfRule_closure2(_box_0, $async$self), true, t1.hasDeclarations, type$.legacy_Value_2), $async$visitIfRule$1);
+            case 7:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitIfRule$1, $async$completer);
+    },
+    visitImportRule$1: function(node) {
+      return this.visitImportRule$body$_EvaluateVisitor0(node);
+    },
+    visitImportRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, t3, _i, $import;
+      var $async$visitImportRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.imports, t2 = t1.length, t3 = type$.legacy_StaticImport_2, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $import = t1[_i];
+              $async$goto = $import instanceof B.DynamicImport0 ? 6 : 8;
+              break;
+            case 6:
+              // then
+              $async$goto = 9;
+              return P._asyncAwait($async$self._async_evaluate0$_visitDynamicImport$1($import), $async$visitImportRule$1);
+            case 9:
+              // returning from await.
+              // goto join
+              $async$goto = 7;
+              break;
+            case 8:
+              // else
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate0$_visitStaticImport$1(t3._as($import)), $async$visitImportRule$1);
+            case 10:
+              // returning from await.
+            case 7:
+              // join
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitImportRule$1, $async$completer);
+    },
+    _async_evaluate0$_visitDynamicImport$1: function($import) {
+      return this._async_evaluate0$_withStackFrame$1$3("@import", $import, new E._EvaluateVisitor__visitDynamicImport_closure2(this, $import), type$.void);
+    },
+    _async_evaluate0$_loadStylesheet$4$baseUrl$forImport: function(url, span, baseUrl, forImport) {
+      return this._loadStylesheet$body$_EvaluateVisitor0(url, span, baseUrl, forImport);
+    },
+    _async_evaluate0$_loadStylesheet$3$baseUrl: function(url, span, baseUrl) {
+      return this._async_evaluate0$_loadStylesheet$4$baseUrl$forImport(url, span, baseUrl, false);
+    },
+    _async_evaluate0$_loadStylesheet$3$forImport: function(url, span, forImport) {
+      return this._async_evaluate0$_loadStylesheet$4$baseUrl$forImport(url, span, null, forImport);
+    },
+    _loadStylesheet$body$_EvaluateVisitor0: function(url, span, baseUrl, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet_2),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, stylesheet, tuple, error, error0, message, t1, t2, t3, exception, message0, $async$exception;
+      var $async$_async_evaluate0$_loadStylesheet$4$baseUrl$forImport = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$handler = 4;
+              $async$self._async_evaluate0$_importSpan = span;
+              $async$goto = $async$self._async_evaluate0$_nodeImporter != null ? 7 : 9;
+              break;
+            case 7:
+              // then
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate0$_importLikeNode$2(url, forImport), $async$_async_evaluate0$_loadStylesheet$4$baseUrl$forImport);
+            case 10:
+              // returning from await.
+              stylesheet = $async$result;
+              if (stylesheet != null) {
+                $async$returnValue = new S.Tuple2(null, stylesheet, type$.Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet_2);
+                $async$next = [1];
+                // goto finally
+                $async$goto = 5;
+                break;
+              }
+              // goto join
+              $async$goto = 8;
+              break;
+            case 9:
+              // else
+              t1 = P.Uri_parse(url);
+              t2 = $async$self._async_evaluate0$_importer;
+              if (baseUrl == null) {
+                t3 = $async$self._async_evaluate0$_stylesheet;
+                t3 = t3 == null ? null : t3.span;
+                t3 = t3 == null ? null : t3.file.url;
+              } else
+                t3 = baseUrl;
+              $async$goto = 11;
+              return P._asyncAwait($async$self._async_evaluate0$_importCache.import$4$baseImporter$baseUrl$forImport(t1, t2, t3, forImport), $async$_async_evaluate0$_loadStylesheet$4$baseUrl$forImport);
+            case 11:
+              // returning from await.
+              tuple = $async$result;
+              if (tuple != null) {
+                $async$returnValue = tuple;
+                $async$next = [1];
+                // goto finally
+                $async$goto = 5;
+                break;
+              }
+            case 8:
+              // join
+              if (C.JSString_methods.startsWith$1(url, "package:") && true)
+                throw H.wrapException(string$.x22packa);
+              else
+                throw H.wrapException("Can't find stylesheet to import.");
+              $async$next.push(6);
+              // goto finally
+              $async$goto = 5;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (t1 instanceof E.SassException0) {
+                error = t1;
+                t1 = $async$self._async_evaluate0$_exception$2(error._span_exception$_message, error.get$span());
+                throw H.wrapException(t1);
+              } else {
+                error0 = t1;
+                message = null;
+                try {
+                  message = H._asStringS(J.get$message$x(error0));
+                } catch (exception) {
+                  H.unwrapException($async$exception);
+                  message0 = J.toString$0$(error0);
+                  message = message0;
+                }
+                t1 = $async$self._async_evaluate0$_exception$1(message);
+                throw H.wrapException(t1);
+              }
+              $async$next.push(6);
+              // goto finally
+              $async$goto = 5;
+              break;
+            case 3:
+              // uncaught
+              $async$next = [2];
+            case 5:
+              // finally
+              $async$handler = 2;
+              $async$self._async_evaluate0$_importSpan = null;
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 6:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_loadStylesheet$4$baseUrl$forImport, $async$completer);
+    },
+    _async_evaluate0$_importLikeNode$2: function(originalUrl, forImport) {
+      return this._importLikeNode$body$_EvaluateVisitor(originalUrl, forImport);
+    },
+    _importLikeNode$body$_EvaluateVisitor: function(originalUrl, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Stylesheet),
+        $async$returnValue, $async$self = this, contents, url, t1, result;
+      var $async$_async_evaluate0$_importLikeNode$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate0$_stylesheet.span;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_nodeImporter.loadAsync$3(originalUrl, t1.file.url, forImport), $async$_async_evaluate0$_importLikeNode$2);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              if (result == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              contents = result.item1;
+              url = result.item2;
+              t1 = J.getInterceptor$s(url).startsWith$1(url, "file:") ? $.$get$context().style.pathFromUri$1(M._parseUri(url)) : url;
+              $async$self._async_evaluate0$_includedFiles.add$1(0, t1);
+              t1 = C.JSString_methods.startsWith$1(url, "file") ? M.Syntax_forPath0(url) : C.Syntax_SCSS0;
+              $async$returnValue = V.Stylesheet_Stylesheet$parse0(contents, t1, $async$self._async_evaluate0$_logger, url);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_importLikeNode$2, $async$completer);
+    },
+    _async_evaluate0$_visitStaticImport$1: function($import) {
+      return this._visitStaticImport$body$_EvaluateVisitor0($import);
+    },
+    _visitStaticImport$body$_EvaluateVisitor0: function($import) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$self = this, resolvedSupports, t1, mediaQuery, node, t2, url, supports, $async$temp1, $async$temp2;
+      var $async$_async_evaluate0$_visitStaticImport$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_interpolationToValue$1($import.url), $async$_async_evaluate0$_visitStaticImport$1);
+            case 3:
+              // returning from await.
+              url = $async$result;
+              supports = $import.supports;
+              $async$goto = supports instanceof L.SupportsDeclaration0 ? 4 : 6;
+              break;
+            case 4:
+              // then
+              $async$temp1 = H;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateToCss$1(supports.name), $async$_async_evaluate0$_visitStaticImport$1);
+            case 7:
+              // returning from await.
+              $async$temp1 = $async$temp1.S($async$result) + ": ";
+              $async$temp2 = H;
+              $async$goto = 8;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateToCss$1(supports.value), $async$_async_evaluate0$_visitStaticImport$1);
+            case 8:
+              // returning from await.
+              resolvedSupports = $async$temp1 + $async$temp2.S($async$result);
+              // goto join
+              $async$goto = 5;
+              break;
+            case 6:
+              // else
+              $async$goto = supports == null ? 9 : 11;
+              break;
+            case 9:
+              // then
+              $async$result = null;
+              // goto join
+              $async$goto = 10;
+              break;
+            case 11:
+              // else
+              $async$goto = 12;
+              return P._asyncAwait($async$self._async_evaluate0$_visitSupportsCondition$1(supports), $async$_async_evaluate0$_visitStaticImport$1);
+            case 12:
+              // returning from await.
+            case 10:
+              // join
+              resolvedSupports = $async$result;
+            case 5:
+              // join
+              t1 = $import.media;
+              $async$goto = t1 == null ? 13 : 15;
+              break;
+            case 13:
+              // then
+              $async$result = null;
+              // goto join
+              $async$goto = 14;
+              break;
+            case 15:
+              // else
+              $async$goto = 16;
+              return P._asyncAwait($async$self._async_evaluate0$_visitMediaQueries$1(t1), $async$_async_evaluate0$_visitStaticImport$1);
+            case 16:
+              // returning from await.
+            case 14:
+              // join
+              mediaQuery = $async$result;
+              t1 = $import.span;
+              node = F.ModifiableCssImport$0(url, t1, mediaQuery, resolvedSupports == null ? null : new F.CssValue0("supports(" + resolvedSupports + ")", supports.get$span(), type$.CssValue_legacy_String_2));
+              t1 = $async$self._async_evaluate0$_parent;
+              t2 = $async$self._async_evaluate0$_root;
+              if (t1 != t2)
+                t1.addChild$1(node);
+              else if ($async$self._async_evaluate0$_endOfImports === J.get$length$asx(t2.children._collection$_source)) {
+                $async$self._async_evaluate0$_root.addChild$1(node);
+                $async$self._async_evaluate0$_endOfImports = $async$self._async_evaluate0$_endOfImports + 1;
+              } else {
+                t1 = $async$self._async_evaluate0$_outOfOrderImports;
+                (t1 == null ? $async$self._async_evaluate0$_outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport_2) : t1).push(node);
+              }
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_visitStaticImport$1, $async$completer);
+    },
+    visitIncludeRule$1: function(node) {
+      return this.visitIncludeRule$body$_EvaluateVisitor0(node);
+    },
+    visitIncludeRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, nodeWithSpan, t1, t2, contentCallable, mixin;
+      var $async$visitIncludeRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              mixin = $async$self._async_evaluate0$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitIncludeRule_closure8($async$self, node));
+              if (mixin == null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2("Undefined mixin.", node.span));
+              nodeWithSpan = new B._FakeAstNode0(new E._EvaluateVisitor_visitIncludeRule_closure9(node));
+              $async$goto = type$.legacy_AsyncBuiltInCallable_2._is(mixin) ? 3 : 5;
+              break;
+            case 3:
+              // then
+              if (node.content != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2("Mixin doesn't accept a content block.", node.span));
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate0$_runBuiltInCallable$3(node.$arguments, mixin, nodeWithSpan), $async$visitIncludeRule$1);
+            case 6:
+              // returning from await.
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = type$.legacy_UserDefinedCallable_legacy_AsyncEnvironment_2._is(mixin) ? 7 : 9;
+              break;
+            case 7:
+              // then
+              t1 = node.content;
+              t2 = t1 == null;
+              if (!t2 && !type$.legacy_MixinRule_2._as(mixin.declaration).hasContent)
+                throw H.wrapException(E.MultiSpanSassRuntimeException$0("Mixin doesn't accept a content block.", node.get$spanWithoutContent(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([mixin.declaration.$arguments.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), $async$self._async_evaluate0$_stackTrace$1(node.get$spanWithoutContent())));
+              contentCallable = t2 ? null : new E.UserDefinedCallable0(t1, $async$self._async_evaluate0$_environment.closure$0(), type$.UserDefinedCallable_legacy_AsyncEnvironment_2);
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate0$_runUserDefinedCallable$4(node.$arguments, mixin, nodeWithSpan, new E._EvaluateVisitor_visitIncludeRule_closure10($async$self, contentCallable, mixin, nodeWithSpan)), $async$visitIncludeRule$1);
+            case 10:
+              // returning from await.
+              // goto join
+              $async$goto = 8;
+              break;
+            case 9:
+              // else
+              throw H.wrapException(P.UnsupportedError$("Unknown callable type " + mixin.toString$0(0) + "."));
+            case 8:
+              // join
+            case 4:
+              // join
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitIncludeRule$1, $async$completer);
+    },
+    visitMixinRule$1: function(node) {
+      return this.visitMixinRule$body$_EvaluateVisitor0(node);
+    },
+    visitMixinRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, t3, index, t4;
+      var $async$visitMixinRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate0$_environment;
+              t2 = t1.closure$0();
+              t3 = t1._async_environment0$_mixins;
+              index = t3.length - 1;
+              t4 = node.name;
+              t1._async_environment0$_mixinIndices.$indexSet(0, t4, index);
+              J.$indexSet$ax(t3[index], t4, new E.UserDefinedCallable0(node, t2, type$.UserDefinedCallable_legacy_AsyncEnvironment_2));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitMixinRule$1, $async$completer);
+    },
+    visitLoudComment$1: function(node) {
+      return this.visitLoudComment$body$_EvaluateVisitor0(node);
+    },
+    visitLoudComment$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, $async$temp1, $async$temp2;
+      var $async$visitLoudComment$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate0$_inFunction) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = $async$self._async_evaluate0$_parent;
+              t2 = $async$self._async_evaluate0$_root;
+              if (t1 == t2 && $async$self._async_evaluate0$_endOfImports === J.get$length$asx(t2.children._collection$_source))
+                $async$self._async_evaluate0$_endOfImports = $async$self._async_evaluate0$_endOfImports + 1;
+              t1 = node.text;
+              $async$temp1 = $async$self._async_evaluate0$_parent;
+              $async$temp2 = R;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_performInterpolation$1(t1), $async$visitLoudComment$1);
+            case 3:
+              // returning from await.
+              $async$temp1.addChild$1(new $async$temp2.ModifiableCssComment0($async$result, t1.span));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitLoudComment$1, $async$completer);
+    },
+    visitMediaRule$1: function(node) {
+      return this.visitMediaRule$body$_EvaluateVisitor0(node);
+    },
+    visitMediaRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, queries, t1, mergedQueries;
+      var $async$visitMediaRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Media_, node.span));
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_visitMediaQueries$1(node.query), $async$visitMediaRule$1);
+            case 3:
+              // returning from await.
+              queries = $async$result;
+              t1 = $async$self._async_evaluate0$_mediaQueries;
+              mergedQueries = t1 == null ? null : $async$self._async_evaluate0$_mergeMediaQueries$2(t1, queries);
+              t1 = mergedQueries == null;
+              if (!t1 && mergedQueries.length === 0) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = t1 ? queries : mergedQueries;
+              $async$goto = 4;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(G.ModifiableCssMediaRule$0(t1, node.span), new E._EvaluateVisitor_visitMediaRule_closure5($async$self, mergedQueries, queries, node), node.hasDeclarations, new E._EvaluateVisitor_visitMediaRule_closure6(mergedQueries), type$.legacy_ModifiableCssMediaRule_2, type$.Null), $async$visitMediaRule$1);
+            case 4:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitMediaRule$1, $async$completer);
+    },
+    _async_evaluate0$_visitMediaQueries$1: function(interpolation) {
+      return this._visitMediaQueries$body$_EvaluateVisitor0(interpolation);
+    },
+    _visitMediaQueries$body$_EvaluateVisitor0: function(interpolation) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_List_legacy_CssMediaQuery_2),
+        $async$returnValue, $async$self = this, $async$temp1, $async$temp2;
+      var $async$_async_evaluate0$_visitMediaQueries$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = interpolation;
+              $async$temp2 = E;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_performInterpolation$2$warnForColor(interpolation, true), $async$_async_evaluate0$_visitMediaQueries$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$self._async_evaluate0$_adjustParseError$2($async$temp1, new $async$temp2._EvaluateVisitor__visitMediaQueries_closure2($async$self, $async$result));
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_visitMediaQueries$1, $async$completer);
+    },
+    _async_evaluate0$_mergeMediaQueries$2: function(queries1, queries2) {
+      var t1, t2, t3, t4, t5, result,
+        queries = H.setRuntimeTypeInfo([], type$.JSArray_legacy_CssMediaQuery_2);
+      for (t1 = J.get$iterator$ax(queries1), t2 = J.getInterceptor$ax(queries2), t3 = type$.legacy_MediaQuerySuccessfulMergeResult_2; t1.moveNext$0();) {
+        t4 = t1.get$current(t1);
+        for (t5 = t2.get$iterator(queries2); t5.moveNext$0();) {
+          result = t4.merge$1(t5.get$current(t5));
+          if (result === C._SingletonCssMediaQueryMergeResult_empty0)
+            continue;
+          if (result === C._SingletonCssMediaQueryMergeResult_unrepresentable0)
+            return null;
+          queries.push(t3._as(result).query);
+        }
+      }
+      return queries;
+    },
+    visitReturnRule$1: function(node) {
+      return node.expression.accept$1(this);
+    },
+    visitSilentComment$1: function(node) {
+      return this.visitSilentComment$body$_EvaluateVisitor0(node);
+    },
+    visitSilentComment$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue;
+      var $async$visitSilentComment$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitSilentComment$1, $async$completer);
+    },
+    visitStyleRule$1: function(node) {
+      return this.visitStyleRule$body$_EvaluateVisitor0(node);
+    },
+    visitStyleRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t2, selectorText, parsedSelector, rule, oldAtRootExcludingStyleRule, t1;
+      var $async$visitStyleRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              if ($async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Style_, node.span));
+              t2 = node.selector;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_interpolationToValue$3$trim$warnForColor(t2, true, true), $async$visitStyleRule$1);
+            case 3:
+              // returning from await.
+              selectorText = $async$result;
+              $async$goto = $async$self._async_evaluate0$_inKeyframes ? 4 : 5;
+              break;
+            case 4:
+              // then
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(U.ModifiableCssKeyframeBlock$0(new F.CssValue0(P.List_List$unmodifiable($async$self._async_evaluate0$_adjustParseError$2(t2, new E._EvaluateVisitor_visitStyleRule_closure20($async$self, selectorText)), type$.legacy_String), t2.span, type$.CssValue_legacy_List_legacy_String_2), node.span), new E._EvaluateVisitor_visitStyleRule_closure21($async$self, node), node.hasDeclarations, new E._EvaluateVisitor_visitStyleRule_closure22(), type$.legacy_ModifiableCssKeyframeBlock_2, type$.Null), $async$visitStyleRule$1);
+            case 6:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 5:
+              // join
+              t1.parsedSelector = $async$self._async_evaluate0$_adjustParseError$2(t2, new E._EvaluateVisitor_visitStyleRule_closure23($async$self, selectorText));
+              parsedSelector = $async$self._async_evaluate0$_addExceptionSpan$2(t2, new E._EvaluateVisitor_visitStyleRule_closure24(t1, $async$self));
+              t1.parsedSelector = parsedSelector;
+              rule = X.ModifiableCssStyleRule$0($async$self._async_evaluate0$_extender.addSelector$3(parsedSelector, t2.span, $async$self._async_evaluate0$_mediaQueries), node.span, t1.parsedSelector);
+              oldAtRootExcludingStyleRule = $async$self._async_evaluate0$_atRootExcludingStyleRule;
+              $async$self._async_evaluate0$_atRootExcludingStyleRule = false;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(rule, new E._EvaluateVisitor_visitStyleRule_closure25($async$self, rule, node), node.hasDeclarations, new E._EvaluateVisitor_visitStyleRule_closure26(), type$.legacy_ModifiableCssStyleRule_2, type$.Null), $async$visitStyleRule$1);
+            case 7:
+              // returning from await.
+              $async$self._async_evaluate0$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+              if (!($async$self._async_evaluate0$_styleRule != null && !oldAtRootExcludingStyleRule)) {
+                t1 = $async$self._async_evaluate0$_parent.children;
+                t1 = !t1.get$isEmpty(t1);
+              } else
+                t1 = false;
+              if (t1) {
+                t1 = $async$self._async_evaluate0$_parent.children;
+                t1.get$last(t1).isGroupEnd = true;
+              }
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitStyleRule$1, $async$completer);
+    },
+    visitSupportsRule$1: function(node) {
+      return this.visitSupportsRule$body$_EvaluateVisitor0(node);
+    },
+    visitSupportsRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, $async$temp1, $async$temp2;
+      var $async$visitSupportsRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Suppor, node.span));
+              t1 = node.condition;
+              $async$temp1 = B;
+              $async$temp2 = F;
+              $async$goto = 4;
+              return P._asyncAwait($async$self._async_evaluate0$_visitSupportsCondition$1(t1), $async$visitSupportsRule$1);
+            case 4:
+              // returning from await.
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through($async$temp1.ModifiableCssSupportsRule$0(new $async$temp2.CssValue0($async$result, t1.get$span(), type$.CssValue_legacy_String_2), node.span), new E._EvaluateVisitor_visitSupportsRule_closure5($async$self, node), node.hasDeclarations, new E._EvaluateVisitor_visitSupportsRule_closure6(), type$.legacy_ModifiableCssSupportsRule_2, type$.Null), $async$visitSupportsRule$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitSupportsRule$1, $async$completer);
+    },
+    _async_evaluate0$_visitSupportsCondition$1: function(condition) {
+      return this._visitSupportsCondition$body$_EvaluateVisitor0(condition);
+    },
+    _visitSupportsCondition$body$_EvaluateVisitor0: function(condition) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, t1, $async$temp1, $async$temp2;
+      var $async$_async_evaluate0$_visitSupportsCondition$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = condition instanceof U.SupportsOperation0 ? 3 : 5;
+              break;
+            case 3:
+              // then
+              t1 = condition.operator;
+              $async$temp1 = H;
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate0$_parenthesize$2(condition.left, t1), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 6:
+              // returning from await.
+              $async$temp1 = $async$temp1.S($async$result) + " " + t1 + " ";
+              $async$temp2 = H;
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate0$_parenthesize$2(condition.right, t1), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 7:
+              // returning from await.
+              $async$returnValue = $async$temp1 + $async$temp2.S($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = condition instanceof M.SupportsNegation0 ? 8 : 10;
+              break;
+            case 8:
+              // then
+              $async$temp1 = H;
+              $async$goto = 11;
+              return P._asyncAwait($async$self._async_evaluate0$_parenthesize$1(condition.condition), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 11:
+              // returning from await.
+              $async$returnValue = "not " + $async$temp1.S($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 9;
+              break;
+            case 10:
+              // else
+              $async$goto = condition instanceof X.SupportsInterpolation0 ? 12 : 14;
+              break;
+            case 12:
+              // then
+              $async$goto = 15;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateToCss$2$quote(condition.expression, false), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 15:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 13;
+              break;
+            case 14:
+              // else
+              $async$goto = condition instanceof L.SupportsDeclaration0 ? 16 : 18;
+              break;
+            case 16:
+              // then
+              $async$temp1 = H;
+              $async$goto = 19;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateToCss$1(condition.name), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 19:
+              // returning from await.
+              $async$temp1 = "(" + $async$temp1.S($async$result) + ": ";
+              $async$temp2 = H;
+              $async$goto = 20;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateToCss$1(condition.value), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 20:
+              // returning from await.
+              $async$returnValue = $async$temp1 + $async$temp2.S($async$result) + ")";
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 17;
+              break;
+            case 18:
+              // else
+              $async$goto = condition instanceof F.SupportsFunction0 ? 21 : 23;
+              break;
+            case 21:
+              // then
+              $async$temp1 = H;
+              $async$goto = 24;
+              return P._asyncAwait($async$self._async_evaluate0$_performInterpolation$1(condition.name), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 24:
+              // returning from await.
+              $async$temp1 = $async$temp1.S($async$result) + "(";
+              $async$temp2 = H;
+              $async$goto = 25;
+              return P._asyncAwait($async$self._async_evaluate0$_performInterpolation$1(condition.$arguments), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 25:
+              // returning from await.
+              $async$returnValue = $async$temp1 + $async$temp2.S($async$result) + ")";
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 22;
+              break;
+            case 23:
+              // else
+              $async$goto = condition instanceof Y.SupportsAnything0 ? 26 : 28;
+              break;
+            case 26:
+              // then
+              $async$temp1 = H;
+              $async$goto = 29;
+              return P._asyncAwait($async$self._async_evaluate0$_performInterpolation$1(condition.contents), $async$_async_evaluate0$_visitSupportsCondition$1);
+            case 29:
+              // returning from await.
+              $async$returnValue = "(" + $async$temp1.S($async$result) + ")";
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 27;
+              break;
+            case 28:
+              // else
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 27:
+              // join
+            case 22:
+              // join
+            case 17:
+              // join
+            case 13:
+              // join
+            case 9:
+              // join
+            case 4:
+              // join
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_visitSupportsCondition$1, $async$completer);
+    },
+    _async_evaluate0$_parenthesize$2: function(condition, operator) {
+      return this._parenthesize$body$_EvaluateVisitor0(condition, operator);
+    },
+    _async_evaluate0$_parenthesize$1: function(condition) {
+      return this._async_evaluate0$_parenthesize$2(condition, null);
+    },
+    _parenthesize$body$_EvaluateVisitor0: function(condition, operator) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, t1, $async$temp1;
+      var $async$_async_evaluate0$_parenthesize$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (!(condition instanceof M.SupportsNegation0))
+                if (condition instanceof U.SupportsOperation0)
+                  t1 = operator == null || operator !== condition.operator;
+                else
+                  t1 = false;
+              else
+                t1 = true;
+              $async$goto = t1 ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$temp1 = H;
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate0$_visitSupportsCondition$1(condition), $async$_async_evaluate0$_parenthesize$2);
+            case 6:
+              // returning from await.
+              $async$returnValue = "(" + $async$temp1.S($async$result) + ")";
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = 7;
+              return P._asyncAwait($async$self._async_evaluate0$_visitSupportsCondition$1(condition), $async$_async_evaluate0$_parenthesize$2);
+            case 7:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 4:
+              // join
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_parenthesize$2, $async$completer);
+    },
+    visitVariableDeclaration$1: function(node) {
+      return this.visitVariableDeclaration$body$_EvaluateVisitor0(node);
+    },
+    visitVariableDeclaration$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, value, t2, $async$temp1, $async$temp2, $async$temp3;
+      var $async$visitVariableDeclaration$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (node.isGuarded) {
+                if (node.namespace == null && $async$self._async_evaluate0$_environment._async_environment0$_variables.length === 1) {
+                  t1 = $async$self._async_evaluate0$_configuration._configuration$_values;
+                  t1 = t1.get$isEmpty(t1) ? null : t1.remove$1(0, node.name);
+                  if (t1 != null) {
+                    $async$self._async_evaluate0$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitVariableDeclaration_closure8($async$self, node, t1));
+                    $async$returnValue = null;
+                    // goto return
+                    $async$goto = 1;
+                    break;
+                  }
+                }
+                value = $async$self._async_evaluate0$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitVariableDeclaration_closure9($async$self, node));
+                if (value != null && !value.$eq(0, C.C_SassNull)) {
+                  $async$returnValue = null;
+                  // goto return
+                  $async$goto = 1;
+                  break;
+                }
+              }
+              if (node.isGlobal && !$async$self._async_evaluate0$_environment.globalVariableExists$1(node.name)) {
+                t1 = $async$self._async_evaluate0$_environment._async_environment0$_variables.length === 1 ? string$.As_of_S : string$.As_of_C + B.declarationName0(node.span) + ": null` at the root of the\nstylesheet.";
+                t2 = node.span;
+                $async$self._async_evaluate0$_logger.warn$4$deprecation$span$trace(0, t1, true, t2, $async$self._async_evaluate0$_stackTrace$1(t2));
+              }
+              $async$temp1 = node;
+              $async$temp2 = E;
+              $async$temp3 = node;
+              $async$goto = 3;
+              return P._asyncAwait(node.expression.accept$1($async$self), $async$visitVariableDeclaration$1);
+            case 3:
+              // returning from await.
+              $async$self._async_evaluate0$_addExceptionSpan$2($async$temp1, new $async$temp2._EvaluateVisitor_visitVariableDeclaration_closure10($async$self, $async$temp3, $async$result.withoutSlash$0()));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitVariableDeclaration$1, $async$completer);
+    },
+    visitUseRule$1: function(node) {
+      return this.visitUseRule$body$_EvaluateVisitor0(node);
+    },
+    visitUseRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, configuration, t3, _i, variable, t4, t5, t1, t2, $async$temp1, $async$temp2, $async$temp3;
+      var $async$visitUseRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.configuration;
+              t2 = t1.length;
+              $async$goto = t2 === 0 ? 3 : 5;
+              break;
+            case 3:
+              // then
+              configuration = C.Configuration_Map_empty_null_true0;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_ConfiguredValue_2);
+              _i = 0;
+            case 6:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 8;
+                break;
+              }
+              variable = t1[_i];
+              t4 = variable.name;
+              t5 = variable.expression;
+              $async$temp1 = t3;
+              $async$temp2 = t4;
+              $async$temp3 = Z;
+              $async$goto = 9;
+              return P._asyncAwait(t5.accept$1($async$self), $async$visitUseRule$1);
+            case 9:
+              // returning from await.
+              $async$temp1.$indexSet(0, $async$temp2, new $async$temp3.ConfiguredValue0($async$result.withoutSlash$0(), variable.span, $async$self._async_evaluate0$_expressionNode$1(t5)));
+            case 7:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 6;
+              break;
+            case 8:
+              // after for
+              configuration = new A.Configuration0(t3, node, false);
+            case 4:
+              // join
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate0$_loadModule$5$configuration(node.url, "@use", node, new E._EvaluateVisitor_visitUseRule_closure2($async$self, node), configuration), $async$visitUseRule$1);
+            case 10:
+              // returning from await.
+              $async$self._async_evaluate0$_assertConfigurationIsEmpty$1(configuration);
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitUseRule$1, $async$completer);
+    },
+    visitWarnRule$1: function(node) {
+      return this.visitWarnRule$body$_EvaluateVisitor0(node);
+    },
+    visitWarnRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, value, t1;
+      var $async$visitWarnRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_addExceptionSpanAsync$1$2(node, new E._EvaluateVisitor_visitWarnRule_closure2($async$self, node), type$.legacy_Value_2), $async$visitWarnRule$1);
+            case 3:
+              // returning from await.
+              value = $async$result;
+              t1 = value instanceof D.SassString0 ? value.text : $async$self._async_evaluate0$_serialize$2(value, node.expression);
+              $async$self._async_evaluate0$_logger.warn$2$trace(0, t1, $async$self._async_evaluate0$_stackTrace$1(node.span));
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitWarnRule$1, $async$completer);
+    },
+    visitWhileRule$1: function(node) {
+      return this._async_evaluate0$_environment.scope$1$3$semiGlobal$when(new E._EvaluateVisitor_visitWhileRule_closure2(this, node), true, node.hasDeclarations, type$.legacy_Value_2);
+    },
+    visitBinaryOperationExpression$1: function(node) {
+      return this._async_evaluate0$_addExceptionSpanAsync$1$2(node, new E._EvaluateVisitor_visitBinaryOperationExpression_closure2(this, node), type$.legacy_Value_2);
+    },
+    visitValueExpression$1: function(node) {
+      return this.visitValueExpression$body$_EvaluateVisitor0(node);
+    },
+    visitValueExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue;
+      var $async$visitValueExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = node.value;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitValueExpression$1, $async$completer);
+    },
+    visitVariableExpression$1: function(node) {
+      return this.visitVariableExpression$body$_EvaluateVisitor0(node);
+    },
+    visitVariableExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, result;
+      var $async$visitVariableExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              result = $async$self._async_evaluate0$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitVariableExpression_closure2($async$self, node));
+              if (result != null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              throw H.wrapException($async$self._async_evaluate0$_exception$2("Undefined variable.", node.span));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitVariableExpression$1, $async$completer);
+    },
+    visitUnaryOperationExpression$1: function(node) {
+      return this.visitUnaryOperationExpression$body$_EvaluateVisitor0(node);
+    },
+    visitUnaryOperationExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, operand, t1;
+      var $async$visitUnaryOperationExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          $async$outer:
+            switch ($async$goto) {
+              case 0:
+                // Function start
+                $async$goto = 3;
+                return P._asyncAwait(node.operand.accept$1($async$self), $async$visitUnaryOperationExpression$1);
+              case 3:
+                // returning from await.
+                operand = $async$result;
+                t1 = node.operator;
+                switch (t1) {
+                  case C.UnaryOperator_j2w0:
+                    $async$returnValue = operand.unaryPlus$0();
+                    // goto return
+                    $async$goto = 1;
+                    break $async$outer;
+                  case C.UnaryOperator_U4G0:
+                    $async$returnValue = operand.unaryMinus$0();
+                    // goto return
+                    $async$goto = 1;
+                    break $async$outer;
+                  case C.UnaryOperator_zDx0:
+                    operand.toString;
+                    $async$returnValue = new D.SassString0("/" + N.serializeValue(operand, false, true), false);
+                    // goto return
+                    $async$goto = 1;
+                    break $async$outer;
+                  case C.UnaryOperator_not_not0:
+                    $async$returnValue = operand.unaryNot$0();
+                    // goto return
+                    $async$goto = 1;
+                    break $async$outer;
+                  default:
+                    throw H.wrapException(P.StateError$("Unknown unary operator " + H.S(t1) + "."));
+                }
+              case 1:
+                // return
+                return P._asyncReturn($async$returnValue, $async$completer);
+            }
+      });
+      return P._asyncStartSync($async$visitUnaryOperationExpression$1, $async$completer);
+    },
+    visitBooleanExpression$1: function(node) {
+      return this.visitBooleanExpression$body$_EvaluateVisitor0(node);
+    },
+    visitBooleanExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassBoolean_2),
+        $async$returnValue;
+      var $async$visitBooleanExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = node.value ? C.SassBoolean_true : C.SassBoolean_false;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitBooleanExpression$1, $async$completer);
+    },
+    visitIfExpression$1: function(node) {
+      return this.visitIfExpression$body$_EvaluateVisitor0(node);
+    },
+    visitIfExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, condition, ifTrue, ifFalse, pair, positional, named, t1;
+      var $async$visitIfExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateMacroArguments$1(node), $async$visitIfExpression$1);
+            case 3:
+              // returning from await.
+              pair = $async$result;
+              positional = pair.item1;
+              named = pair.item2;
+              t1 = J.getInterceptor$asx(positional);
+              $async$self._async_evaluate0$_verifyArguments$4(t1.get$length(positional), named, $.$get$IfExpression_declaration0(), node);
+              condition = t1.get$length(positional) > 0 ? t1.$index(positional, 0) : named.$index(0, "condition");
+              ifTrue = t1.get$length(positional) > 1 ? t1.$index(positional, 1) : named.$index(0, "if-true");
+              ifFalse = t1.get$length(positional) > 2 ? t1.$index(positional, 2) : named.$index(0, "if-false");
+              $async$goto = 5;
+              return P._asyncAwait(condition.accept$1($async$self), $async$visitIfExpression$1);
+            case 5:
+              // returning from await.
+              $async$goto = 4;
+              return P._asyncAwait(($async$result.get$isTruthy() ? ifTrue : ifFalse).accept$1($async$self), $async$visitIfExpression$1);
+            case 4:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitIfExpression$1, $async$completer);
+    },
+    visitNullExpression$1: function(node) {
+      return this.visitNullExpression$body$_EvaluateVisitor0(node);
+    },
+    visitNullExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassNull_2),
+        $async$returnValue;
+      var $async$visitNullExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = C.C_SassNull;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitNullExpression$1, $async$completer);
+    },
+    visitNumberExpression$1: function(node) {
+      return this.visitNumberExpression$body$_EvaluateVisitor0(node);
+    },
+    visitNumberExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassNumber_2),
+        $async$returnValue, t1, t2;
+      var $async$visitNumberExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.value;
+              t2 = node.unit;
+              $async$returnValue = t2 == null ? new N.UnitlessSassNumber0(t1, null) : new L.SingleUnitSassNumber0(t2, t1, null);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitNumberExpression$1, $async$completer);
+    },
+    visitParenthesizedExpression$1: function(node) {
+      return node.expression.accept$1(this);
+    },
+    visitColorExpression$1: function(node) {
+      return this.visitColorExpression$body$_EvaluateVisitor0(node);
+    },
+    visitColorExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassColor_2),
+        $async$returnValue;
+      var $async$visitColorExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$returnValue = node.value;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitColorExpression$1, $async$completer);
+    },
+    visitListExpression$1: function(node) {
+      return this.visitListExpression$body$_EvaluateVisitor0(node);
+    },
+    visitListExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassList_2),
+        $async$returnValue, $async$self = this, $async$temp1;
+      var $async$visitListExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = D;
+              $async$goto = 3;
+              return P._asyncAwait(B.mapAsync0(node.contents, new E._EvaluateVisitor_visitListExpression_closure2($async$self), type$.legacy_Expression_2, type$.legacy_Value_2), $async$visitListExpression$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$temp1.SassList$0($async$result, node.separator, node.hasBrackets);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitListExpression$1, $async$completer);
+    },
+    visitMapExpression$1: function(node) {
+      return this.visitMapExpression$body$_EvaluateVisitor0(node);
+    },
+    visitMapExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassMap_2),
+        $async$returnValue, $async$self = this, t2, t3, _i, pair, t4, keyValue, valueValue, t1, map, keyNodes;
+      var $async$visitMapExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = type$.legacy_Value_2;
+              map = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+              keyNodes = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_AstNode_2);
+              t2 = node.pairs, t3 = t2.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              pair = t2[_i];
+              t4 = pair.item1;
+              $async$goto = 6;
+              return P._asyncAwait(t4.accept$1($async$self), $async$visitMapExpression$1);
+            case 6:
+              // returning from await.
+              keyValue = $async$result;
+              $async$goto = 7;
+              return P._asyncAwait(pair.item2.accept$1($async$self), $async$visitMapExpression$1);
+            case 7:
+              // returning from await.
+              valueValue = $async$result;
+              if (map.containsKey$1(keyValue))
+                throw H.wrapException(E.MultiSpanSassRuntimeException$0("Duplicate key.", t4.get$span(), "second key", P.LinkedHashMap_LinkedHashMap$_literal([keyNodes.$index(0, keyValue).get$span(), "first key"], type$.legacy_FileSpan, type$.legacy_String), $async$self._async_evaluate0$_stackTrace$1(t4.get$span())));
+              map.$indexSet(0, keyValue, valueValue);
+              keyNodes.$indexSet(0, keyValue, t4);
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = new A.SassMap0(H.ConstantMap_ConstantMap$from(map, t1, t1));
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitMapExpression$1, $async$completer);
+    },
+    visitFunctionExpression$1: function(node) {
+      return this.visitFunctionExpression$body$_EvaluateVisitor0(node);
+    },
+    visitFunctionExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, oldInFunction, result, t1, t2, plainName, $async$temp1, $async$temp2;
+      var $async$visitFunctionExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = {};
+              t2 = node.name;
+              plainName = t2.get$asPlain();
+              t1.$function = null;
+              $async$goto = (plainName != null ? t1.$function = $async$self._async_evaluate0$_addExceptionSpan$2(node, new E._EvaluateVisitor_visitFunctionExpression_closure5($async$self, node, plainName)) : null) == null ? 3 : 4;
+              break;
+            case 3:
+              // then
+              if (node.namespace != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2("Undefined function.", node.span));
+              $async$temp1 = t1;
+              $async$temp2 = L;
+              $async$goto = 5;
+              return P._asyncAwait($async$self._async_evaluate0$_performInterpolation$1(t2), $async$visitFunctionExpression$1);
+            case 5:
+              // returning from await.
+              $async$temp1.$function = new $async$temp2.PlainCssCallable0($async$result);
+            case 4:
+              // join
+              oldInFunction = $async$self._async_evaluate0$_inFunction;
+              $async$self._async_evaluate0$_inFunction = true;
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate0$_addErrorSpan$1$2(node, new E._EvaluateVisitor_visitFunctionExpression_closure6(t1, $async$self, node), type$.legacy_Value_2), $async$visitFunctionExpression$1);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate0$_inFunction = oldInFunction;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitFunctionExpression$1, $async$completer);
+    },
+    _async_evaluate0$_getFunction$2$namespace: function($name, namespace) {
+      var local = this._async_evaluate0$_environment.getFunction$2$namespace($name, namespace);
+      if (local != null || namespace != null)
+        return local;
+      return this._async_evaluate0$_builtInFunctions.$index(0, $name);
+    },
+    _async_evaluate0$_runUserDefinedCallable$4: function($arguments, callable, nodeWithSpan, run) {
+      return this._runUserDefinedCallable$body$_EvaluateVisitor0($arguments, callable, nodeWithSpan, run);
+    },
+    _runUserDefinedCallable$body$_EvaluateVisitor0: function($arguments, callable, nodeWithSpan, run) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, evaluated, t1, $name;
+      var $async$_async_evaluate0$_runUserDefinedCallable$4 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateArguments$1($arguments), $async$_async_evaluate0$_runUserDefinedCallable$4);
+            case 3:
+              // returning from await.
+              evaluated = $async$result;
+              t1 = callable.declaration.name;
+              $name = t1 == null ? "@content" : t1 + "()";
+              $async$goto = 4;
+              return P._asyncAwait($async$self._async_evaluate0$_withStackFrame$1$3($name, nodeWithSpan, new E._EvaluateVisitor__runUserDefinedCallable_closure2($async$self, callable, evaluated, nodeWithSpan, run), type$.legacy_Value_2), $async$_async_evaluate0$_runUserDefinedCallable$4);
+            case 4:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_runUserDefinedCallable$4, $async$completer);
+    },
+    _async_evaluate0$_runFunctionCallable$3: function($arguments, callable, nodeWithSpan) {
+      return this._runFunctionCallable$body$_EvaluateVisitor0($arguments, callable, nodeWithSpan);
+    },
+    _runFunctionCallable$body$_EvaluateVisitor0: function($arguments, callable, nodeWithSpan) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, result, t1, t2, t3, first, _i, argument, rest, $async$temp1;
+      var $async$_async_evaluate0$_runFunctionCallable$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = type$.legacy_AsyncBuiltInCallable_2._is(callable) ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$goto = 6;
+              return P._asyncAwait($async$self._async_evaluate0$_runBuiltInCallable$3($arguments, callable, nodeWithSpan), $async$_async_evaluate0$_runFunctionCallable$3);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              if (result == null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Custom, nodeWithSpan.get$span()));
+              $async$returnValue = result.withoutSlash$0();
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$goto = type$.legacy_UserDefinedCallable_legacy_AsyncEnvironment_2._is(callable) ? 7 : 9;
+              break;
+            case 7:
+              // then
+              $async$goto = 10;
+              return P._asyncAwait($async$self._async_evaluate0$_runUserDefinedCallable$4($arguments, callable, nodeWithSpan, new E._EvaluateVisitor__runFunctionCallable_closure2($async$self, callable)), $async$_async_evaluate0$_runFunctionCallable$3);
+            case 10:
+              // returning from await.
+              $async$returnValue = $async$result.withoutSlash$0();
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 8;
+              break;
+            case 9:
+              // else
+              $async$goto = callable instanceof L.PlainCssCallable0 ? 11 : 13;
+              break;
+            case 11:
+              // then
+              t1 = $arguments.named;
+              if (t1.get$isNotEmpty(t1) || $arguments.keywordRest != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Plain_, nodeWithSpan.get$span()));
+              t1 = H.S(callable.name) + "(";
+              t2 = $arguments.positional, t3 = t2.length, first = true, _i = 0;
+            case 14:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 16;
+                break;
+              }
+              argument = t2[_i];
+              if (first)
+                first = false;
+              else
+                t1 += ", ";
+              $async$temp1 = H;
+              $async$goto = 17;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateToCss$1(argument), $async$_async_evaluate0$_runFunctionCallable$3);
+            case 17:
+              // returning from await.
+              t1 += $async$temp1.S($async$result);
+            case 15:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 14;
+              break;
+            case 16:
+              // after for
+              t2 = $arguments.rest;
+              $async$goto = 18;
+              return P._asyncAwait(t2 == null ? null : t2.accept$1($async$self), $async$_async_evaluate0$_runFunctionCallable$3);
+            case 18:
+              // returning from await.
+              rest = $async$result;
+              if (rest != null) {
+                if (!first)
+                  t1 += ", ";
+                t2 = t1 + H.S($async$self._async_evaluate0$_serialize$2(rest, t2));
+                t1 = t2;
+              }
+              t1 += H.Primitives_stringFromCharCode(41);
+              $async$returnValue = new D.SassString0(t1.charCodeAt(0) == 0 ? t1 : t1, false);
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 12;
+              break;
+            case 13:
+              // else
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 12:
+              // join
+            case 8:
+              // join
+            case 4:
+              // join
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_runFunctionCallable$3, $async$completer);
+    },
+    _async_evaluate0$_runBuiltInCallable$3: function($arguments, callable, nodeWithSpan) {
+      return this._runBuiltInCallable$body$_EvaluateVisitor0($arguments, callable, nodeWithSpan);
+    },
+    _runBuiltInCallable$body$_EvaluateVisitor0: function($arguments, callable, nodeWithSpan) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, callback, result, error, error0, error1, message, namedSet, tuple, overload, declaredArguments, i, t1, argument, t2, t3, rest, argumentList, exception, message0, evaluated, oldCallableNode, $async$exception;
+      var $async$_async_evaluate0$_runBuiltInCallable$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_evaluateArguments$2$trackSpans($arguments, false), $async$_async_evaluate0$_runBuiltInCallable$3);
+            case 3:
+              // returning from await.
+              evaluated = $async$result;
+              oldCallableNode = $async$self._async_evaluate0$_callableNode;
+              $async$self._async_evaluate0$_callableNode = nodeWithSpan;
+              namedSet = new M.MapKeySet(evaluated.named, type$.MapKeySet_legacy_String);
+              tuple = callable.callbackFor$2(evaluated.positional.length, namedSet);
+              overload = tuple.item1;
+              callback = tuple.item2;
+              $async$self._async_evaluate0$_addExceptionSpan$2(nodeWithSpan, new E._EvaluateVisitor__runBuiltInCallable_closure5(overload, evaluated, namedSet));
+              declaredArguments = overload.$arguments;
+              i = evaluated.positional.length, t1 = declaredArguments.length;
+            case 4:
+              // for condition
+              if (!(i < t1)) {
+                // goto after for
+                $async$goto = 6;
+                break;
+              }
+              argument = declaredArguments[i];
+              t2 = evaluated.positional;
+              t3 = evaluated.named.remove$1(0, argument.name);
+              $async$goto = t3 == null ? 7 : 8;
+              break;
+            case 7:
+              // then
+              t3 = argument.defaultValue;
+              $async$goto = 9;
+              return P._asyncAwait(t3 == null ? null : t3.accept$1($async$self), $async$_async_evaluate0$_runBuiltInCallable$3);
+            case 9:
+              // returning from await.
+              t3 = $async$result;
+            case 8:
+              // join
+              t2.push(t3);
+            case 5:
+              // for update
+              ++i;
+              // goto for condition
+              $async$goto = 4;
+              break;
+            case 6:
+              // after for
+              if (overload.restArgument != null) {
+                if (evaluated.positional.length > t1) {
+                  rest = C.JSArray_methods.sublist$1(evaluated.positional, t1);
+                  C.JSArray_methods.removeRange$2(evaluated.positional, t1, evaluated.positional.length);
+                } else
+                  rest = C.List_empty16;
+                t1 = evaluated.named;
+                argumentList = D.SassArgumentList$0(rest, t1, evaluated.separator === C.ListSeparator_undecided0 ? C.ListSeparator_comma0 : evaluated.separator);
+                evaluated.positional.push(argumentList);
+              } else
+                argumentList = null;
+              result = null;
+              $async$handler = 11;
+              $async$goto = 14;
+              return P._asyncAwait(callback.call$1(evaluated.positional), $async$_async_evaluate0$_runBuiltInCallable$3);
+            case 14:
+              // returning from await.
+              result = $async$result;
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 13;
+              break;
+            case 11:
+              // catch
+              $async$handler = 10;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (type$.legacy_SassRuntimeException_2._is(t1))
+                throw $async$exception;
+              else if (t1 instanceof E.MultiSpanSassScriptException0) {
+                error = t1;
+                throw H.wrapException(E.MultiSpanSassRuntimeException$0(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, $async$self._async_evaluate0$_stackTrace$1(nodeWithSpan.get$span())));
+              } else if (t1 instanceof E.MultiSpanSassException0) {
+                error0 = t1;
+                throw H.wrapException(E.MultiSpanSassRuntimeException$0(error0._span_exception$_message, error0.get$span(), error0.primaryLabel, error0.secondarySpans, $async$self._async_evaluate0$_stackTrace$1(error0.get$span())));
+              } else {
+                error1 = t1;
+                message = null;
+                try {
+                  message = H._asStringS(J.get$message$x(error1));
+                } catch (exception) {
+                  H.unwrapException($async$exception);
+                  message0 = J.toString$0$(error1);
+                  message = message0;
+                }
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(message, nodeWithSpan.get$span()));
+              }
+              // goto after finally
+              $async$goto = 13;
+              break;
+            case 10:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 13:
+              // after finally
+              $async$self._async_evaluate0$_callableNode = oldCallableNode;
+              if (argumentList == null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = evaluated.named;
+              if (t1.get$isEmpty(t1)) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              if (argumentList._argument_list$_wereKeywordsAccessed) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = evaluated.named;
+              t1 = t1.get$keys(t1);
+              t1 = "No " + B.pluralize0("argument", t1.get$length(t1), null) + " named ";
+              t2 = evaluated.named;
+              throw H.wrapException(E.MultiSpanSassRuntimeException$0(t1 + H.S(B.toSentence0(t2.get$keys(t2).map$1$1(0, new E._EvaluateVisitor__runBuiltInCallable_closure6(), type$.legacy_Object), "or")) + ".", nodeWithSpan.get$span(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([overload.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), $async$self._async_evaluate0$_stackTrace$1(nodeWithSpan.get$span())));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_runBuiltInCallable$3, $async$completer);
+    },
+    _async_evaluate0$_evaluateArguments$2$trackSpans: function($arguments, trackSpans) {
+      return this._evaluateArguments$body$_EvaluateVisitor0($arguments, trackSpans);
+    },
+    _async_evaluate0$_evaluateArguments$1: function($arguments) {
+      return this._async_evaluate0$_evaluateArguments$2$trackSpans($arguments, null);
+    },
+    _evaluateArguments$body$_EvaluateVisitor0: function($arguments, trackSpans) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy__ArgumentResults_2),
+        $async$returnValue, $async$self = this, t1, t2, t3, _i, t4, t5, t6, t7, t8, t9, positionalNodes, namedNodes, rest, restNodeForSpan, separator, keywordRest, keywordRestNodeForSpan, $async$temp1, $async$temp2;
+      var $async$_async_evaluate0$_evaluateArguments$2$trackSpans = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (trackSpans == null)
+                trackSpans = $async$self._async_evaluate0$_sourceMap;
+              t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+              t2 = $arguments.positional, t3 = t2.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$temp1 = t1;
+              $async$goto = 6;
+              return P._asyncAwait(t2[_i].accept$1($async$self), $async$_async_evaluate0$_evaluateArguments$2$trackSpans);
+            case 6:
+              // returning from await.
+              $async$temp1.push($async$result);
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              t4 = type$.legacy_String;
+              t5 = type$.legacy_Value_2;
+              t6 = P.LinkedHashMap_LinkedHashMap$_empty(t4, t5);
+              t7 = $arguments.named, t8 = t7.get$entries(t7), t8 = t8.get$iterator(t8);
+            case 7:
+              // for condition
+              if (!t8.moveNext$0()) {
+                // goto after for
+                $async$goto = 8;
+                break;
+              }
+              t9 = t8.get$current(t8);
+              $async$temp1 = t6;
+              $async$temp2 = t9.key;
+              $async$goto = 9;
+              return P._asyncAwait(t9.value.accept$1($async$self), $async$_async_evaluate0$_evaluateArguments$2$trackSpans);
+            case 9:
+              // returning from await.
+              $async$temp1.$indexSet(0, $async$temp2, $async$result);
+              // goto for condition
+              $async$goto = 7;
+              break;
+            case 8:
+              // after for
+              if (trackSpans) {
+                t8 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AstNode_2);
+                for (_i = 0; _i < t3; ++_i)
+                  t8.push($async$self._async_evaluate0$_expressionNode$1(t2[_i]));
+                positionalNodes = t8;
+              } else
+                positionalNodes = null;
+              if (trackSpans) {
+                t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode_2);
+                for (t3 = t7.get$entries(t7), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+                  t7 = t3.get$current(t3);
+                  t2.$indexSet(0, t7.key, $async$self._async_evaluate0$_expressionNode$1(t7.value));
+                }
+                namedNodes = t2;
+              } else
+                namedNodes = null;
+              t2 = $arguments.rest;
+              if (t2 == null) {
+                $async$returnValue = new E._ArgumentResults2(t1, positionalNodes, t6, namedNodes, C.ListSeparator_undecided0);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 10;
+              return P._asyncAwait(t2.accept$1($async$self), $async$_async_evaluate0$_evaluateArguments$2$trackSpans);
+            case 10:
+              // returning from await.
+              rest = $async$result;
+              restNodeForSpan = trackSpans ? $async$self._async_evaluate0$_expressionNode$1(t2) : null;
+              if (rest instanceof A.SassMap0) {
+                $async$self._async_evaluate0$_addRestMap$1$3(t6, rest, t2, t5);
+                if (namedNodes != null) {
+                  t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode_2);
+                  for (t3 = rest.contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), t7 = type$.legacy_SassString_2; t3.moveNext$0();)
+                    t2.$indexSet(0, t7._as(t3.get$current(t3)).text, restNodeForSpan);
+                  namedNodes.addAll$1(0, t2);
+                }
+                separator = C.ListSeparator_undecided0;
+              } else if (rest instanceof D.SassList0) {
+                t2 = rest._list1$_contents;
+                C.JSArray_methods.addAll$1(t1, t2);
+                if (positionalNodes != null)
+                  C.JSArray_methods.addAll$1(positionalNodes, P.List_List$filled(t2.length, restNodeForSpan, false, type$.legacy_AstNode_2));
+                separator = rest.separator;
+                if (rest instanceof D.SassArgumentList0) {
+                  rest._argument_list$_wereKeywordsAccessed = true;
+                  rest._argument_list$_keywords.forEach$1(0, new E._EvaluateVisitor__evaluateArguments_closure2(t6, namedNodes, restNodeForSpan));
+                }
+              } else {
+                t1.push(rest);
+                if (positionalNodes != null)
+                  positionalNodes.push(restNodeForSpan);
+                separator = C.ListSeparator_undecided0;
+              }
+              t2 = $arguments.keywordRest;
+              if (t2 == null) {
+                $async$returnValue = new E._ArgumentResults2(t1, positionalNodes, t6, namedNodes, separator);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 11;
+              return P._asyncAwait(t2.accept$1($async$self), $async$_async_evaluate0$_evaluateArguments$2$trackSpans);
+            case 11:
+              // returning from await.
+              keywordRest = $async$result;
+              keywordRestNodeForSpan = trackSpans ? $async$self._async_evaluate0$_expressionNode$1(t2) : null;
+              if (keywordRest instanceof A.SassMap0) {
+                $async$self._async_evaluate0$_addRestMap$1$3(t6, keywordRest, t2, t5);
+                if (namedNodes != null) {
+                  t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode_2);
+                  for (t3 = keywordRest.contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), t4 = type$.legacy_SassString_2; t3.moveNext$0();)
+                    t2.$indexSet(0, t4._as(t3.get$current(t3)).text, keywordRestNodeForSpan);
+                  namedNodes.addAll$1(0, t2);
+                }
+                $async$returnValue = new E._ArgumentResults2(t1, positionalNodes, t6, namedNodes, separator);
+                // goto return
+                $async$goto = 1;
+                break;
+              } else
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Variabs + H.S(keywordRest) + ").", t2.get$span()));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_evaluateArguments$2$trackSpans, $async$completer);
+    },
+    _async_evaluate0$_evaluateMacroArguments$1: function(invocation) {
+      return this._evaluateMacroArguments$body$_EvaluateVisitor0(invocation);
+    },
+    _evaluateMacroArguments$body$_EvaluateVisitor0: function(invocation) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2),
+        $async$returnValue, $async$self = this, t3, positional, named, rest, keywordRest, t1, t2;
+      var $async$_async_evaluate0$_evaluateMacroArguments$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = invocation.$arguments;
+              t2 = t1.rest;
+              if (t2 == null) {
+                $async$returnValue = new S.Tuple2(t1.positional, t1.named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t3 = t1.positional;
+              positional = H.setRuntimeTypeInfo(t3.slice(0), H._arrayInstanceType(t3)._eval$1("JSArray<1>"));
+              t3 = type$.legacy_Expression_2;
+              named = P.LinkedHashMap_LinkedHashMap$of(t1.named, type$.legacy_String, t3);
+              $async$goto = 3;
+              return P._asyncAwait(t2.accept$1($async$self), $async$_async_evaluate0$_evaluateMacroArguments$1);
+            case 3:
+              // returning from await.
+              rest = $async$result;
+              if (rest instanceof A.SassMap0)
+                $async$self._async_evaluate0$_addRestMap$1$4(named, rest, invocation, new E._EvaluateVisitor__evaluateMacroArguments_closure11(), t3);
+              else if (rest instanceof D.SassList0) {
+                t2 = rest._list1$_contents;
+                C.JSArray_methods.addAll$1(positional, new H.MappedListIterable(t2, new E._EvaluateVisitor__evaluateMacroArguments_closure12(), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Expression0*>")));
+                if (rest instanceof D.SassArgumentList0) {
+                  rest._argument_list$_wereKeywordsAccessed = true;
+                  rest._argument_list$_keywords.forEach$1(0, new E._EvaluateVisitor__evaluateMacroArguments_closure13(named));
+                }
+              } else
+                positional.push(new F.ValueExpression0(rest, null));
+              t1 = t1.keywordRest;
+              if (t1 == null) {
+                $async$returnValue = new S.Tuple2(positional, named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$goto = 4;
+              return P._asyncAwait(t1.accept$1($async$self), $async$_async_evaluate0$_evaluateMacroArguments$1);
+            case 4:
+              // returning from await.
+              keywordRest = $async$result;
+              if (keywordRest instanceof A.SassMap0) {
+                $async$self._async_evaluate0$_addRestMap$1$4(named, keywordRest, invocation, new E._EvaluateVisitor__evaluateMacroArguments_closure14(), t3);
+                $async$returnValue = new S.Tuple2(positional, named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2);
+                // goto return
+                $async$goto = 1;
+                break;
+              } else
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Variabs + H.S(keywordRest) + ").", invocation.span));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_evaluateMacroArguments$1, $async$completer);
+    },
+    _async_evaluate0$_addRestMap$1$4: function(values, map, nodeWithSpan, convert, $T) {
+      var t1 = {};
+      t1.convert = convert;
+      if (convert == null)
+        t1.convert = new E._EvaluateVisitor__addRestMap_closure5($T);
+      map.contents.forEach$1(0, new E._EvaluateVisitor__addRestMap_closure6(t1, this, values, map, nodeWithSpan));
+    },
+    _async_evaluate0$_addRestMap$1$3: function(values, map, nodeWithSpan, $T) {
+      return this._async_evaluate0$_addRestMap$1$4(values, map, nodeWithSpan, null, $T);
+    },
+    _async_evaluate0$_verifyArguments$4: function(positional, named, $arguments, nodeWithSpan) {
+      return this._async_evaluate0$_addExceptionSpan$2(nodeWithSpan, new E._EvaluateVisitor__verifyArguments_closure2($arguments, positional, named));
+    },
+    visitSelectorExpression$1: function(node) {
+      return this.visitSelectorExpression$body$_EvaluateVisitor0(node);
+    },
+    visitSelectorExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1;
+      var $async$visitSelectorExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate0$_styleRule;
+              if (t1 == null) {
+                $async$returnValue = C.C_SassNull;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$returnValue = t1.originalSelector.get$asSassList();
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitSelectorExpression$1, $async$completer);
+    },
+    visitStringExpression$1: function(node) {
+      return this.visitStringExpression$body$_EvaluateVisitor0(node);
+    },
+    visitStringExpression$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassString_2),
+        $async$returnValue, $async$self = this, $async$temp1, $async$temp2;
+      var $async$visitStringExpression$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = D;
+              $async$temp2 = J;
+              $async$goto = 3;
+              return P._asyncAwait(B.mapAsync0(node.text.contents, new E._EvaluateVisitor_visitStringExpression_closure2($async$self), type$.legacy_Object, type$.legacy_String), $async$visitStringExpression$1);
+            case 3:
+              // returning from await.
+              $async$returnValue = new $async$temp1.SassString0($async$temp2.join$0$ax($async$result), node.hasQuotes);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitStringExpression$1, $async$completer);
+    },
+    visitCssAtRule$1: function(node) {
+      return this.visitCssAtRule$body$_EvaluateVisitor0(node);
+    },
+    visitCssAtRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$self = this, wasInKeyframes, wasInUnknownAtRule, t1;
+      var $async$visitCssAtRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.At_rul, node.span));
+              if (node.isChildless) {
+                $async$self._async_evaluate0$_parent.addChild$1(U.ModifiableCssAtRule$0(node.name, node.span, true, node.value));
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              wasInKeyframes = $async$self._async_evaluate0$_inKeyframes;
+              wasInUnknownAtRule = $async$self._async_evaluate0$_inUnknownAtRule;
+              t1 = node.name;
+              if (B.unvendor0(t1.get$value(t1)) === "keyframes")
+                $async$self._async_evaluate0$_inKeyframes = true;
+              else
+                $async$self._async_evaluate0$_inUnknownAtRule = true;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(U.ModifiableCssAtRule$0(t1, node.span, false, node.value), new E._EvaluateVisitor_visitCssAtRule_closure5($async$self, node), false, new E._EvaluateVisitor_visitCssAtRule_closure6(), type$.legacy_ModifiableCssAtRule_2, type$.Null), $async$visitCssAtRule$1);
+            case 3:
+              // returning from await.
+              $async$self._async_evaluate0$_inUnknownAtRule = wasInUnknownAtRule;
+              $async$self._async_evaluate0$_inKeyframes = wasInKeyframes;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssAtRule$1, $async$completer);
+    },
+    visitCssComment$1: function(node) {
+      return this.visitCssComment$body$_EvaluateVisitor0(node);
+    },
+    visitCssComment$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, t1, t2;
+      var $async$visitCssComment$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate0$_parent;
+              t2 = $async$self._async_evaluate0$_root;
+              if (t1 == t2 && $async$self._async_evaluate0$_endOfImports === J.get$length$asx(t2.children._collection$_source))
+                $async$self._async_evaluate0$_endOfImports = $async$self._async_evaluate0$_endOfImports + 1;
+              $async$self._async_evaluate0$_parent.addChild$1(new R.ModifiableCssComment0(node.text, node.span));
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssComment$1, $async$completer);
+    },
+    visitCssDeclaration$1: function(node) {
+      return this.visitCssDeclaration$body$_EvaluateVisitor0(node);
+    },
+    visitCssDeclaration$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, t1;
+      var $async$visitCssDeclaration$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = node.name;
+              $async$self._async_evaluate0$_parent.addChild$1(L.ModifiableCssDeclaration$0(t1, node.value, node.span, J.startsWith$1$s(t1.get$value(t1), "--"), node.valueSpanForMap));
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssDeclaration$1, $async$completer);
+    },
+    visitCssImport$1: function(node) {
+      return this.visitCssImport$body$_EvaluateVisitor0(node);
+    },
+    visitCssImport$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, modifiableNode, t1, t2;
+      var $async$visitCssImport$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              modifiableNode = F.ModifiableCssImport$0(node.url, node.span, node.media, node.supports);
+              t1 = $async$self._async_evaluate0$_parent;
+              t2 = $async$self._async_evaluate0$_root;
+              if (t1 != t2)
+                t1.addChild$1(modifiableNode);
+              else if ($async$self._async_evaluate0$_endOfImports === J.get$length$asx(t2.children._collection$_source)) {
+                $async$self._async_evaluate0$_root.addChild$1(modifiableNode);
+                $async$self._async_evaluate0$_endOfImports = $async$self._async_evaluate0$_endOfImports + 1;
+              } else {
+                t1 = $async$self._async_evaluate0$_outOfOrderImports;
+                (t1 == null ? $async$self._async_evaluate0$_outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport_2) : t1).push(modifiableNode);
+              }
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssImport$1, $async$completer);
+    },
+    visitCssKeyframeBlock$1: function(node) {
+      return this.visitCssKeyframeBlock$body$_EvaluateVisitor0(node);
+    },
+    visitCssKeyframeBlock$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this;
+      var $async$visitCssKeyframeBlock$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 2;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(U.ModifiableCssKeyframeBlock$0(node.selector, node.span), new E._EvaluateVisitor_visitCssKeyframeBlock_closure5($async$self, node), false, new E._EvaluateVisitor_visitCssKeyframeBlock_closure6(), type$.legacy_ModifiableCssKeyframeBlock_2, type$.Null), $async$visitCssKeyframeBlock$1);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssKeyframeBlock$1, $async$completer);
+    },
+    visitCssMediaRule$1: function(node) {
+      return this.visitCssMediaRule$body$_EvaluateVisitor0(node);
+    },
+    visitCssMediaRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$returnValue, $async$self = this, t1, mergedQueries;
+      var $async$visitCssMediaRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Media_, node.span));
+              t1 = $async$self._async_evaluate0$_mediaQueries;
+              mergedQueries = t1 == null ? null : $async$self._async_evaluate0$_mergeMediaQueries$2(t1, node.queries);
+              t1 = mergedQueries == null;
+              if (!t1 && mergedQueries.length === 0) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = t1 ? node.queries : mergedQueries;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(G.ModifiableCssMediaRule$0(t1, node.span), new E._EvaluateVisitor_visitCssMediaRule_closure5($async$self, mergedQueries, node), false, new E._EvaluateVisitor_visitCssMediaRule_closure6(mergedQueries), type$.legacy_ModifiableCssMediaRule_2, type$.Null), $async$visitCssMediaRule$1);
+            case 3:
+              // returning from await.
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssMediaRule$1, $async$completer);
+    },
+    visitCssStyleRule$1: function(node) {
+      return this.visitCssStyleRule$body$_EvaluateVisitor0(node);
+    },
+    visitCssStyleRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, t1, t2, t3, originalSelector, rule, oldAtRootExcludingStyleRule;
+      var $async$visitCssStyleRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Style_, node.span));
+              t1 = node.selector;
+              t2 = t1.value;
+              t3 = $async$self._async_evaluate0$_styleRule;
+              t3 = t3 == null ? null : t3.originalSelector;
+              originalSelector = t2.resolveParentSelectors$2$implicitParent(t3, !$async$self._async_evaluate0$_atRootExcludingStyleRule);
+              rule = X.ModifiableCssStyleRule$0($async$self._async_evaluate0$_extender.addSelector$3(originalSelector, t1.span, $async$self._async_evaluate0$_mediaQueries), node.span, originalSelector);
+              oldAtRootExcludingStyleRule = $async$self._async_evaluate0$_atRootExcludingStyleRule;
+              $async$self._async_evaluate0$_atRootExcludingStyleRule = false;
+              $async$goto = 2;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(rule, new E._EvaluateVisitor_visitCssStyleRule_closure5($async$self, rule, node), false, new E._EvaluateVisitor_visitCssStyleRule_closure6(), type$.legacy_ModifiableCssStyleRule_2, type$.Null), $async$visitCssStyleRule$1);
+            case 2:
+              // returning from await.
+              $async$self._async_evaluate0$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+              if (!($async$self._async_evaluate0$_styleRule != null && !oldAtRootExcludingStyleRule)) {
+                t1 = $async$self._async_evaluate0$_parent.children;
+                t1 = !t1.get$isEmpty(t1);
+              } else
+                t1 = false;
+              if (t1) {
+                t1 = $async$self._async_evaluate0$_parent.children;
+                t1.get$last(t1).isGroupEnd = true;
+              }
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssStyleRule$1, $async$completer);
+    },
+    visitCssStylesheet$1: function(node) {
+      return this.visitCssStylesheet$body$_EvaluateVisitor0(node);
+    },
+    visitCssStylesheet$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this, t1;
+      var $async$visitCssStylesheet$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = J.get$iterator$ax(node.get$children(node));
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              $async$goto = 4;
+              return P._asyncAwait(t1.get$current(t1).accept$1($async$self), $async$visitCssStylesheet$1);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssStylesheet$1, $async$completer);
+    },
+    visitCssSupportsRule$1: function(node) {
+      return this.visitCssSupportsRule$body$_EvaluateVisitor0(node);
+    },
+    visitCssSupportsRule$body$_EvaluateVisitor0: function(node) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
+        $async$self = this;
+      var $async$visitCssSupportsRule$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if ($async$self._async_evaluate0$_declarationName != null)
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(string$.Suppor, node.span));
+              $async$goto = 2;
+              return P._asyncAwait($async$self._async_evaluate0$_withParent$2$4$scopeWhen$through(B.ModifiableCssSupportsRule$0(node.condition, node.span), new E._EvaluateVisitor_visitCssSupportsRule_closure5($async$self, node), false, new E._EvaluateVisitor_visitCssSupportsRule_closure6(), type$.legacy_ModifiableCssSupportsRule_2, type$.Null), $async$visitCssSupportsRule$1);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$visitCssSupportsRule$1, $async$completer);
+    },
+    _async_evaluate0$_handleReturn$1$2: function(list, callback) {
+      return this._handleReturn$body$_EvaluateVisitor0(list, callback);
+    },
+    _async_evaluate0$_handleReturn$2: function(list, callback) {
+      return this._async_evaluate0$_handleReturn$1$2(list, callback, type$.dynamic);
+    },
+    _handleReturn$body$_EvaluateVisitor0: function(list, callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, t1, _i, result;
+      var $async$_async_evaluate0$_handleReturn$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = list.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < list.length)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(callback.call$1(list[_i]), $async$_async_evaluate0$_handleReturn$1$2);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              if (result != null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              list.length === t1 || (0, H.throwConcurrentModificationError)(list), ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_handleReturn$1$2, $async$completer);
+    },
+    _async_evaluate0$_withEnvironment$1$2: function(environment, callback, $T) {
+      return this._withEnvironment$body$_EvaluateVisitor0(environment, callback, $T, $T._eval$1("0*"));
+    },
+    _withEnvironment$body$_EvaluateVisitor0: function(environment, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, result, oldEnvironment;
+      var $async$_async_evaluate0$_withEnvironment$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldEnvironment = $async$self._async_evaluate0$_environment;
+              $async$self._async_evaluate0$_environment = environment;
+              $async$goto = 3;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate0$_withEnvironment$1$2);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate0$_environment = oldEnvironment;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_withEnvironment$1$2, $async$completer);
+    },
+    _async_evaluate0$_interpolationToValue$3$trim$warnForColor: function(interpolation, trim, warnForColor) {
+      return this._interpolationToValue$body$_EvaluateVisitor0(interpolation, trim, warnForColor);
+    },
+    _async_evaluate0$_interpolationToValue$1: function(interpolation) {
+      return this._async_evaluate0$_interpolationToValue$3$trim$warnForColor(interpolation, false, false);
+    },
+    _async_evaluate0$_interpolationToValue$2$warnForColor: function(interpolation, warnForColor) {
+      return this._async_evaluate0$_interpolationToValue$3$trim$warnForColor(interpolation, false, warnForColor);
+    },
+    _interpolationToValue$body$_EvaluateVisitor0: function(interpolation, trim, warnForColor) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_CssValue_legacy_String_2),
+        $async$returnValue, $async$self = this, result, t1;
+      var $async$_async_evaluate0$_interpolationToValue$3$trim$warnForColor = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_performInterpolation$2$warnForColor(interpolation, warnForColor), $async$_async_evaluate0$_interpolationToValue$3$trim$warnForColor);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              t1 = trim ? B.trimAscii0(result, true) : result;
+              $async$returnValue = new F.CssValue0(t1, interpolation.span, type$.CssValue_legacy_String_2);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_interpolationToValue$3$trim$warnForColor, $async$completer);
+    },
+    _async_evaluate0$_performInterpolation$2$warnForColor: function(interpolation, warnForColor) {
+      return this._performInterpolation$body$_EvaluateVisitor0(interpolation, warnForColor);
+    },
+    _async_evaluate0$_performInterpolation$1: function(interpolation) {
+      return this._async_evaluate0$_performInterpolation$2$warnForColor(interpolation, false);
+    },
+    _performInterpolation$body$_EvaluateVisitor0: function(interpolation, warnForColor) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, $async$temp1;
+      var $async$_async_evaluate0$_performInterpolation$2$warnForColor = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$temp1 = J;
+              $async$goto = 3;
+              return P._asyncAwait(B.mapAsync0(interpolation.contents, new E._EvaluateVisitor__performInterpolation_closure2($async$self, warnForColor), type$.legacy_Object, type$.legacy_String), $async$_async_evaluate0$_performInterpolation$2$warnForColor);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$temp1.join$0$ax($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_performInterpolation$2$warnForColor, $async$completer);
+    },
+    _async_evaluate0$_evaluateToCss$2$quote: function(expression, quote) {
+      return this._evaluateToCss$body$_EvaluateVisitor0(expression, quote);
+    },
+    _async_evaluate0$_evaluateToCss$1: function(expression) {
+      return this._async_evaluate0$_evaluateToCss$2$quote(expression, true);
+    },
+    _evaluateToCss$body$_EvaluateVisitor0: function(expression, quote) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this;
+      var $async$_async_evaluate0$_evaluateToCss$2$quote = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(expression.accept$1($async$self), $async$_async_evaluate0$_evaluateToCss$2$quote);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$self._async_evaluate0$_serialize$3$quote($async$result, expression, quote);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_evaluateToCss$2$quote, $async$completer);
+    },
+    _async_evaluate0$_serialize$3$quote: function(value, nodeWithSpan, quote) {
+      return this._async_evaluate0$_addExceptionSpan$2(nodeWithSpan, new E._EvaluateVisitor__serialize_closure2(value, quote));
+    },
+    _async_evaluate0$_serialize$2: function(value, nodeWithSpan) {
+      return this._async_evaluate0$_serialize$3$quote(value, nodeWithSpan, true);
+    },
+    _async_evaluate0$_expressionNode$1: function(expression) {
+      var t1;
+      if (!this._async_evaluate0$_sourceMap)
+        return null;
+      if (expression instanceof S.VariableExpression0) {
+        t1 = this._async_evaluate0$_environment.getVariableNode$2$namespace(expression.name, expression.namespace);
+        return t1 == null ? expression : t1;
+      } else
+        return expression;
+    },
+    _async_evaluate0$_withParent$2$4$scopeWhen$through: function(node, callback, scopeWhen, through, $S, $T) {
+      return this._withParent$body$_EvaluateVisitor0(node, callback, scopeWhen, through, $S, $T, $T._eval$1("0*"));
+    },
+    _async_evaluate0$_withParent$2$2: function(node, callback, $S, $T) {
+      return this._async_evaluate0$_withParent$2$4$scopeWhen$through(node, callback, true, null, $S, $T);
+    },
+    _async_evaluate0$_withParent$2$3$scopeWhen: function(node, callback, scopeWhen, $S, $T) {
+      return this._async_evaluate0$_withParent$2$4$scopeWhen$through(node, callback, scopeWhen, null, $S, $T);
+    },
+    _withParent$body$_EvaluateVisitor0: function(node, callback, scopeWhen, through, $S, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, oldParent, result;
+      var $async$_async_evaluate0$_withParent$2$4$scopeWhen$through = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$self._async_evaluate0$_addChild$2$through(node, through);
+              oldParent = $async$self._async_evaluate0$_parent;
+              $async$self._async_evaluate0$_parent = node;
+              $async$goto = 3;
+              return P._asyncAwait($async$self._async_evaluate0$_environment.scope$1$2$when(callback, scopeWhen, $T._eval$1("0*")), $async$_async_evaluate0$_withParent$2$4$scopeWhen$through);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate0$_parent = oldParent;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_withParent$2$4$scopeWhen$through, $async$completer);
+    },
+    _async_evaluate0$_addChild$2$through: function(node, through) {
+      var grandparent,
+        $parent = this._async_evaluate0$_parent;
+      if (through != null) {
+        for (; through.call$1($parent);)
+          $parent = $parent._node2$_parent;
+        if ($parent.get$hasFollowingSibling()) {
+          grandparent = $parent._node2$_parent;
+          $parent = $parent.copyWithoutChildren$0();
+          grandparent.addChild$1($parent);
+        }
+      }
+      $parent.addChild$1(node);
+    },
+    _async_evaluate0$_addChild$1: function(node) {
+      return this._async_evaluate0$_addChild$2$through(node, null);
+    },
+    _async_evaluate0$_withStyleRule$1$2: function(rule, callback, $T) {
+      return this._withStyleRule$body$_EvaluateVisitor0(rule, callback, $T, $T._eval$1("0*"));
+    },
+    _withStyleRule$body$_EvaluateVisitor0: function(rule, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, result, oldRule;
+      var $async$_async_evaluate0$_withStyleRule$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldRule = $async$self._async_evaluate0$_styleRule;
+              $async$self._async_evaluate0$_styleRule = rule;
+              $async$goto = 3;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate0$_withStyleRule$1$2);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate0$_styleRule = oldRule;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_withStyleRule$1$2, $async$completer);
+    },
+    _async_evaluate0$_withMediaQueries$1$2: function(queries, callback, $T) {
+      return this._withMediaQueries$body$_EvaluateVisitor0(queries, callback, $T, $T._eval$1("0*"));
+    },
+    _withMediaQueries$body$_EvaluateVisitor0: function(queries, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, result, oldMediaQueries;
+      var $async$_async_evaluate0$_withMediaQueries$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              oldMediaQueries = $async$self._async_evaluate0$_mediaQueries;
+              $async$self._async_evaluate0$_mediaQueries = queries;
+              $async$goto = 3;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate0$_withMediaQueries$1$2);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate0$_mediaQueries = oldMediaQueries;
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_withMediaQueries$1$2, $async$completer);
+    },
+    _async_evaluate0$_withStackFrame$1$3: function(member, nodeWithSpan, callback, $T) {
+      return this._withStackFrame$body$_EvaluateVisitor0(member, nodeWithSpan, callback, $T, $T._eval$1("0*"));
+    },
+    _withStackFrame$body$_EvaluateVisitor0: function(member, nodeWithSpan, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$self = this, oldMember, result, t1;
+      var $async$_async_evaluate0$_withStackFrame$1$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self._async_evaluate0$_stack;
+              t1.push(new S.Tuple2($async$self._async_evaluate0$_member, nodeWithSpan, type$.Tuple2_of_legacy_String_and_legacy_AstNode_2));
+              oldMember = $async$self._async_evaluate0$_member;
+              $async$self._async_evaluate0$_member = member;
+              $async$goto = 3;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate0$_withStackFrame$1$3);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$self._async_evaluate0$_member = oldMember;
+              t1.pop();
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_withStackFrame$1$3, $async$completer);
+    },
+    _async_evaluate0$_stackFrame$2: function(member, span) {
+      var url = span.file.url;
+      return B.frameForSpan0(span, member, url != null && this._async_evaluate0$_importCache != null ? this._async_evaluate0$_importCache.humanize$1(url) : url);
+    },
+    _async_evaluate0$_stackTrace$1: function(span) {
+      var t2, cur, _this = this,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Frame);
+      for (t2 = _this._async_evaluate0$_stack, t2 = new H.MappedListIterable(t2, new E._EvaluateVisitor__stackTrace_closure2(_this), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Frame*>")), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      if (span != null)
+        t1.push(_this._async_evaluate0$_stackFrame$2(_this._async_evaluate0$_member, span));
+      return new Y.Trace(P.List_List$unmodifiable(new H.ReversedListIterable(t1, type$.ReversedListIterable_legacy_Frame), type$.legacy_Frame), new P._StringStackTrace(null));
+    },
+    _async_evaluate0$_stackTrace$0: function() {
+      return this._async_evaluate0$_stackTrace$1(null);
+    },
+    _async_evaluate0$_warn$3$deprecation: function(message, span, deprecation) {
+      return this._async_evaluate0$_logger.warn$4$deprecation$span$trace(0, message, deprecation, span, this._async_evaluate0$_stackTrace$1(span));
+    },
+    _async_evaluate0$_warn$2: function(message, span) {
+      return this._async_evaluate0$_warn$3$deprecation(message, span, false);
+    },
+    _async_evaluate0$_exception$2: function(message, span) {
+      var t1 = span == null ? C.JSArray_methods.get$last(this._async_evaluate0$_stack).item2.get$span() : span;
+      return new E.SassRuntimeException0(this._async_evaluate0$_stackTrace$1(span), message, t1);
+    },
+    _async_evaluate0$_exception$1: function(message) {
+      return this._async_evaluate0$_exception$2(message, null);
+    },
+    _async_evaluate0$_multiSpanException$3: function(message, primaryLabel, secondaryLabels) {
+      var t1 = C.JSArray_methods.get$last(this._async_evaluate0$_stack).item2.get$span();
+      return new E.MultiSpanSassRuntimeException0(this._async_evaluate0$_stackTrace$0(), primaryLabel, H.ConstantMap_ConstantMap$from(secondaryLabels, type$.legacy_FileSpan, type$.legacy_String), message, t1);
+    },
+    _async_evaluate0$_adjustParseError$1$2: function(nodeWithSpan, callback) {
+      var error, errorText, span, syntheticFile, syntheticSpan, t1, exception, t2, t3, t4, t5, _null = null;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException0) {
+          error = t1;
+          t1 = error;
+          errorText = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(G.SourceSpanException.prototype.get$span.call(t1).file._decodedChars, 0, _null), 0, _null);
+          span = nodeWithSpan.get$span();
+          t1 = span;
+          t2 = span;
+          syntheticFile = C.JSString_methods.replaceRange$3(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(span.file._decodedChars, 0, _null), 0, _null), Y.FileLocation$_(t1.file, t1._file$_start).offset, Y.FileLocation$_(t2.file, t2._end).offset, errorText);
+          t2 = Y.SourceFile$fromString(syntheticFile, span.file.url);
+          t1 = span;
+          t1 = Y.FileLocation$_(t1.file, t1._file$_start);
+          t3 = error;
+          t3 = G.SourceSpanException.prototype.get$span.call(t3);
+          t3 = Y.FileLocation$_(t3.file, t3._file$_start);
+          t4 = span;
+          t4 = Y.FileLocation$_(t4.file, t4._file$_start);
+          t5 = error;
+          t5 = G.SourceSpanException.prototype.get$span.call(t5);
+          syntheticSpan = t2.span$2(t1.offset + t3.offset, t4.offset + Y.FileLocation$_(t5.file, t5._end).offset);
+          throw H.wrapException(this._async_evaluate0$_exception$2(error._span_exception$_message, syntheticSpan));
+        } else
+          throw exception;
+      }
+    },
+    _async_evaluate0$_adjustParseError$2: function(nodeWithSpan, callback) {
+      return this._async_evaluate0$_adjustParseError$1$2(nodeWithSpan, callback, type$.dynamic);
+    },
+    _async_evaluate0$_addExceptionSpan$1$2: function(nodeWithSpan, callback) {
+      var error, error0, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.MultiSpanSassScriptException0) {
+          error = t1;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$0(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, this._async_evaluate0$_stackTrace$1(nodeWithSpan.get$span())));
+        } else if (t1 instanceof E.SassScriptException0) {
+          error0 = t1;
+          throw H.wrapException(this._async_evaluate0$_exception$2(error0.message, nodeWithSpan.get$span()));
+        } else
+          throw exception;
+      }
+    },
+    _async_evaluate0$_addExceptionSpan$2: function(nodeWithSpan, callback) {
+      return this._async_evaluate0$_addExceptionSpan$1$2(nodeWithSpan, callback, type$.dynamic);
+    },
+    _async_evaluate0$_addExceptionSpanAsync$1$2: function(nodeWithSpan, callback, $T) {
+      return this._addExceptionSpanAsync$body$_EvaluateVisitor0(nodeWithSpan, callback, $T, $T._eval$1("0*"));
+    },
+    _addExceptionSpanAsync$body$_EvaluateVisitor0: function(nodeWithSpan, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, error, error0, t1, exception, $async$exception;
+      var $async$_async_evaluate0$_addExceptionSpanAsync$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$handler = 4;
+              $async$goto = 7;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate0$_addExceptionSpanAsync$1$2);
+            case 7:
+              // returning from await.
+              t1 = $async$result;
+              $async$returnValue = t1;
+              // goto return
+              $async$goto = 1;
+              break;
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (t1 instanceof E.MultiSpanSassScriptException0) {
+                error = t1;
+                throw H.wrapException(E.MultiSpanSassRuntimeException$0(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, $async$self._async_evaluate0$_stackTrace$1(nodeWithSpan.get$span())));
+              } else if (t1 instanceof E.SassScriptException0) {
+                error0 = t1;
+                throw H.wrapException($async$self._async_evaluate0$_exception$2(error0.message, nodeWithSpan.get$span()));
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 3:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 6:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_addExceptionSpanAsync$1$2, $async$completer);
+    },
+    _async_evaluate0$_addErrorSpan$1$2: function(nodeWithSpan, callback, $T) {
+      return this._addErrorSpan$body$_EvaluateVisitor0(nodeWithSpan, callback, $T, $T._eval$1("0*"));
+    },
+    _addErrorSpan$body$_EvaluateVisitor0: function(nodeWithSpan, callback, $T, $async$type) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter($async$type),
+        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, error, t1, exception, $async$exception;
+      var $async$_async_evaluate0$_addErrorSpan$1$2 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$handler = 4;
+              $async$goto = 7;
+              return P._asyncAwait(callback.call$0(), $async$_async_evaluate0$_addErrorSpan$1$2);
+            case 7:
+              // returning from await.
+              t1 = $async$result;
+              $async$returnValue = t1;
+              // goto return
+              $async$goto = 1;
+              break;
+              $async$handler = 2;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 4:
+              // catch
+              $async$handler = 3;
+              $async$exception = $async$currentError;
+              t1 = H.unwrapException($async$exception);
+              if (type$.legacy_SassRuntimeException_2._is(t1)) {
+                error = t1;
+                t1 = error.get$span();
+                if (!C.JSString_methods.startsWith$1(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1.file._decodedChars, t1._file$_start, t1._end), 0, null), "@error"))
+                  throw $async$exception;
+                throw H.wrapException(E.SassRuntimeException$0(error._span_exception$_message, nodeWithSpan.get$span(), $async$self._async_evaluate0$_stackTrace$0()));
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 6;
+              break;
+            case 3:
+              // uncaught
+              // goto rethrow
+              $async$goto = 2;
+              break;
+            case 6:
+              // after finally
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+            case 2:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_evaluate0$_addErrorSpan$1$2, $async$completer);
+    }
+  };
+  E._EvaluateVisitor_closure29.prototype = {
+    call$1: function($arguments) {
+      var module, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this._async_evaluate0$_environment;
+      t2 = variable.text;
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return t1.globalVariableExists$2$namespace(t2, module == null ? null : module.text) ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  E._EvaluateVisitor_closure30.prototype = {
+    call$1: function($arguments) {
+      var variable = J.$index$asx($arguments, 0).assertString$1("name"),
+        t1 = this.$this._async_evaluate0$_environment,
+        t2 = variable.text;
+      t2.toString;
+      return t1.getVariable$1(H.stringReplaceAllUnchecked(t2, "_", "-")) != null ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  E._EvaluateVisitor_closure31.prototype = {
+    call$1: function($arguments) {
+      var module, t2, t3, t4,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this;
+      t2 = t1._async_evaluate0$_environment;
+      t3 = variable.text;
+      t3.toString;
+      t4 = H.stringReplaceAllUnchecked(t3, "_", "-");
+      return t2.getFunction$2$namespace(t4, module == null ? null : module.text) != null || t1._async_evaluate0$_builtInFunctions.containsKey$1(t3) ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  E._EvaluateVisitor_closure32.prototype = {
+    call$1: function($arguments) {
+      var module, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this._async_evaluate0$_environment;
+      t2 = variable.text;
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return t1.getMixin$2$namespace(t2, module == null ? null : module.text) != null ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  E._EvaluateVisitor_closure33.prototype = {
+    call$1: function($arguments) {
+      var t1 = this.$this._async_evaluate0$_environment;
+      if (!t1._async_environment0$_inMixin)
+        throw H.wrapException(E.SassScriptException$0(string$.conten));
+      return t1._async_environment0$_content != null ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  E._EvaluateVisitor_closure34.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.$index$asx($arguments, 0).assertString$1("module").text,
+        module = this.$this._async_evaluate0$_environment._async_environment0$_modules.$index(0, t1);
+      if (module == null)
+        throw H.wrapException('There is no module with namespace "' + H.S(t1) + '".');
+      t1 = type$.legacy_Value_2;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = module.get$variables(), t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, new D.SassString0(t4.key, true), t4.value);
+      }
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 37
+  };
+  E._EvaluateVisitor_closure35.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.$index$asx($arguments, 0).assertString$1("module").text,
+        module = this.$this._async_evaluate0$_environment._async_environment0$_modules.$index(0, t1);
+      if (module == null)
+        throw H.wrapException('There is no module with namespace "' + H.S(t1) + '".');
+      t1 = type$.legacy_Value_2;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = module.get$functions(module), t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, new D.SassString0(t4.key, true), new F.SassFunction0(t4.value));
+      }
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 37
+  };
+  E._EvaluateVisitor_closure36.prototype = {
+    call$1: function($arguments) {
+      var module, callable,
+        t1 = J.getInterceptor$asx($arguments),
+        $name = t1.$index($arguments, 0).assertString$1("name"),
+        css = t1.$index($arguments, 1).get$isTruthy();
+      t1 = t1.$index($arguments, 2).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      if (css && module != null)
+        throw H.wrapException(string$.x24css_a);
+      if (css)
+        callable = new L.PlainCssCallable0($name.text);
+      else {
+        t1 = this.$this;
+        callable = t1._async_evaluate0$_addExceptionSpan$2(t1._async_evaluate0$_callableNode, new E._EvaluateVisitor__closure10(t1, $name, module));
+      }
+      if (callable != null)
+        return new F.SassFunction0(callable);
+      throw H.wrapException("Function not found: " + $name.toString$0(0));
+    },
+    $signature: 162
+  };
+  E._EvaluateVisitor__closure10.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this.name.text;
+      t1.toString;
+      t1 = H.stringReplaceAllUnchecked(t1, "_", "-");
+      t2 = this.module;
+      t2 = t2 == null ? null : t2.text;
+      return this.$this._async_evaluate0$_getFunction$2$namespace(t1, t2);
+    },
+    $signature: 108
+  };
+  E._EvaluateVisitor_closure37.prototype = {
+    call$1: function($arguments) {
+      return this.$call$body$_EvaluateVisitor_closure2($arguments);
+    },
+    $call$body$_EvaluateVisitor_closure2: function($arguments) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t2, t3, t4, t5, t6, t7, t8, t9, t10, invocation, callable, t1, $function, args;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = J.getInterceptor$asx($arguments);
+              $function = t1.$index($arguments, 0);
+              args = type$.legacy_SassArgumentList_2._as(t1.$index($arguments, 1));
+              t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression_2);
+              t2 = type$.legacy_String;
+              t3 = type$.legacy_Expression_2;
+              t4 = $async$self.$this;
+              t5 = t4._async_evaluate0$_callableNode.get$span();
+              t6 = t4._async_evaluate0$_callableNode.get$span();
+              args._argument_list$_wereKeywordsAccessed = true;
+              t7 = args._argument_list$_keywords;
+              if (t7.get$isEmpty(t7))
+                t7 = null;
+              else {
+                t8 = type$.legacy_Value_2;
+                t9 = P.LinkedHashMap_LinkedHashMap$_empty(t8, t8);
+                for (args._argument_list$_wereKeywordsAccessed = true, t7 = t7.get$entries(t7), t7 = t7.get$iterator(t7); t7.moveNext$0();) {
+                  t10 = t7.get$current(t7);
+                  t9.$indexSet(0, new D.SassString0(t10.key, false), t10.value);
+                }
+                t7 = new F.ValueExpression0(new A.SassMap0(H.ConstantMap_ConstantMap$from(t9, t8, t8)), t4._async_evaluate0$_callableNode.get$span());
+              }
+              invocation = new X.ArgumentInvocation0(P.List_List$unmodifiable(t1, t3), H.ConstantMap_ConstantMap$from(P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), t2, t3), new F.ValueExpression0(args, t6), t7, t5);
+              $async$goto = $function instanceof D.SassString0 ? 3 : 4;
+              break;
+            case 3:
+              // then
+              N.warn0(string$.Passin + $function.toString$0(0) + ")) instead.", true);
+              $async$goto = 5;
+              return P._asyncAwait(t4.visitFunctionExpression$1(new F.FunctionExpression0(null, X.Interpolation$0(H.setRuntimeTypeInfo([$function.text], type$.JSArray_legacy_Object), t4._async_evaluate0$_callableNode.get$span()), invocation, t4._async_evaluate0$_callableNode.get$span())), $async$call$1);
+            case 5:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 4:
+              // join
+              callable = $function.assertFunction$1("function").callable;
+              $async$goto = type$.legacy_AsyncCallable_2._is(callable) ? 6 : 8;
+              break;
+            case 6:
+              // then
+              $async$goto = 9;
+              return P._asyncAwait(t4._async_evaluate0$_runFunctionCallable$3(invocation, callable, t4._async_evaluate0$_callableNode), $async$call$1);
+            case 9:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+              // goto join
+              $async$goto = 7;
+              break;
+            case 8:
+              // else
+              throw H.wrapException(E.SassScriptException$0("The function " + H.S(callable.get$name(callable)) + string$.x20is_as));
+            case 7:
+              // join
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 156
+  };
+  E._EvaluateVisitor_closure38.prototype = {
+    call$1: function($arguments) {
+      return this.$call$body$_EvaluateVisitor_closure1($arguments);
+    },
+    $call$body$_EvaluateVisitor_closure1: function($arguments) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, withMap, values, configuration, t2, t3, t1, url;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = J.getInterceptor$asx($arguments);
+              url = P.Uri_parse(t1.$index($arguments, 0).assertString$1("url").text);
+              t1 = t1.$index($arguments, 1).get$realNull();
+              t1 = t1 == null ? null : t1.assertMap$1("with");
+              withMap = t1 == null ? null : t1.contents;
+              if (withMap != null) {
+                values = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_ConfiguredValue_2);
+                t1 = $async$self.$this;
+                withMap.forEach$1(0, new E._EvaluateVisitor__closure8(values, t1._async_evaluate0$_callableNode.get$span()));
+                configuration = new A.Configuration0(values, t1._async_evaluate0$_callableNode, false);
+              } else
+                configuration = C.Configuration_Map_empty_null_true0;
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate0$_callableNode;
+              t3 = t2.get$span();
+              t3 = t3 == null ? null : t3.file.url;
+              $async$goto = 3;
+              return P._asyncAwait(t1._async_evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors(url, "load-css()", t2, new E._EvaluateVisitor__closure9(t1), t3, configuration, true), $async$call$1);
+            case 3:
+              // returning from await.
+              t1._async_evaluate0$_assertConfigurationIsEmpty$2$nameInError(configuration, true);
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 176
+  };
+  E._EvaluateVisitor__closure8.prototype = {
+    call$2: function(variable, value) {
+      var $name,
+        t1 = variable.assertString$1("with key").text;
+      t1.toString;
+      $name = H.stringReplaceAllUnchecked(t1, "_", "-");
+      t1 = this.values;
+      if (t1.containsKey$1($name))
+        throw H.wrapException("The variable $" + $name + " was configured twice.");
+      t1.$indexSet(0, $name, new Z.ConfiguredValue0(value, this.span, null));
+    },
+    $signature: 45
+  };
+  E._EvaluateVisitor__closure9.prototype = {
+    call$1: function(module) {
+      var t1 = this.$this;
+      return t1._async_evaluate0$_combineCss$2$clone(module, true).accept$1(t1);
+    },
+    $signature: 152
+  };
+  E._EvaluateVisitor_run_closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_EvaluateResult_2),
+        $async$returnValue, $async$self = this, t2, t1, url, $async$temp1, $async$temp2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node;
+              url = t1.span.file.url;
+              if (url != null) {
+                t2 = $async$self.$this;
+                t2._async_evaluate0$_activeModules.$indexSet(0, url, null);
+                if (t2._async_evaluate0$_nodeImporter != null)
+                  if (url.get$scheme() === "file")
+                    t2._async_evaluate0$_includedFiles.add$1(0, $.$get$context().style.pathFromUri$1(M._parseUri(url)));
+                  else if (url.toString$0(0) !== "stdin")
+                    t2._async_evaluate0$_includedFiles.add$1(0, url.toString$0(0));
+              }
+              t2 = $async$self.$this;
+              $async$temp1 = E;
+              $async$temp2 = t2;
+              $async$goto = 3;
+              return P._asyncAwait(t2._async_evaluate0$_execute$2($async$self.importer, t1), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = new $async$temp1.EvaluateResult0($async$temp2._async_evaluate0$_combineCss$1($async$result), t2._async_evaluate0$_includedFiles);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 287
+  };
+  E._EvaluateVisitor__withWarnCallback_closure2.prototype = {
+    call$2: function(message, deprecation) {
+      var t1 = this.$this,
+        t2 = t1._async_evaluate0$_importSpan;
+      return t1._async_evaluate0$_warn$3$deprecation(message, t2 == null ? t1._async_evaluate0$_callableNode.get$span() : t2, deprecation);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 72
+  };
+  E._EvaluateVisitor__loadModule_closure5.prototype = {
+    call$0: function() {
+      return this.callback.call$1(this.builtInModule);
+    },
+    $signature: 1
+  };
+  E._EvaluateVisitor__loadModule_closure6.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$handler = 1, $async$currentError, $async$next = [], $async$self = this, module, error, error0, error1, error2, message, previousLoad, exception, t1, t2, result, importer, stylesheet, canonicalUrl, t3, $async$exception;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1) {
+          $async$currentError = $async$result;
+          $async$goto = $async$handler;
+        }
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.nodeWithSpan;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate0$_loadStylesheet$3$baseUrl(J.toString$0$($async$self.url), t2.get$span(), $async$self.baseUrl), $async$call$0);
+            case 2:
+              // returning from await.
+              result = $async$result;
+              importer = result.item1;
+              stylesheet = result.item2;
+              canonicalUrl = stylesheet.span.file.url;
+              t3 = t1._async_evaluate0$_activeModules;
+              if (t3.containsKey$1(canonicalUrl)) {
+                message = $async$self.namesInErrors ? "Module loop: " + H.S($.$get$context().prettyUri$1(canonicalUrl)) + " is already being loaded." : string$.Module;
+                previousLoad = t3.$index(0, canonicalUrl);
+                throw H.wrapException(previousLoad == null ? t1._async_evaluate0$_exception$1(message) : t1._async_evaluate0$_multiSpanException$3(message, "new load", P.LinkedHashMap_LinkedHashMap$_literal([previousLoad.get$span(), "original load"], type$.legacy_FileSpan, type$.legacy_String)));
+              }
+              t3.$indexSet(0, canonicalUrl, t2);
+              module = null;
+              $async$handler = 3;
+              $async$goto = 6;
+              return P._asyncAwait(t1._async_evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan(importer, stylesheet, $async$self.configuration, $async$self.namesInErrors, t2), $async$call$0);
+            case 6:
+              // returning from await.
+              module = $async$result;
+              $async$next.push(5);
+              // goto finally
+              $async$goto = 4;
+              break;
+            case 3:
+              // uncaught
+              $async$next = [1];
+            case 4:
+              // finally
+              $async$handler = 1;
+              t3.remove$1(0, canonicalUrl);
+              // goto the next finally handler
+              $async$goto = $async$next.pop();
+              break;
+            case 5:
+              // after finally
+              $async$handler = 8;
+              $async$goto = 11;
+              return P._asyncAwait($async$self.callback.call$1(module), $async$call$0);
+            case 11:
+              // returning from await.
+              $async$handler = 1;
+              // goto after finally
+              $async$goto = 10;
+              break;
+            case 8:
+              // catch
+              $async$handler = 7;
+              $async$exception = $async$currentError;
+              t2 = H.unwrapException($async$exception);
+              if (type$.legacy_SassRuntimeException_2._is(t2))
+                throw $async$exception;
+              else if (t2 instanceof E.MultiSpanSassException0) {
+                error = t2;
+                throw H.wrapException(E.MultiSpanSassRuntimeException$0(error._span_exception$_message, error.get$span(), error.primaryLabel, error.secondarySpans, t1._async_evaluate0$_stackTrace$1(error.get$span())));
+              } else if (t2 instanceof E.SassException0) {
+                error0 = t2;
+                throw H.wrapException(t1._async_evaluate0$_exception$2(error0._span_exception$_message, error0.get$span()));
+              } else if (t2 instanceof E.MultiSpanSassScriptException0) {
+                error1 = t2;
+                throw H.wrapException(t1._async_evaluate0$_multiSpanException$3(error1.message, error1.primaryLabel, error1.secondarySpans));
+              } else if (t2 instanceof E.SassScriptException0) {
+                error2 = t2;
+                throw H.wrapException(t1._async_evaluate0$_exception$1(error2.message));
+              } else
+                throw $async$exception;
+              // goto after finally
+              $async$goto = 10;
+              break;
+            case 7:
+              // uncaught
+              // goto rethrow
+              $async$goto = 1;
+              break;
+            case 10:
+              // after finally
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+            case 1:
+              // rethrow
+              return P._asyncRethrow($async$currentError, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor__execute_closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t2, t3, t4, css, t1, oldImporter, oldStylesheet, oldRoot, oldParent, oldEndOfImports, oldOutOfOrderImports, oldExtender, oldStyleRule, oldMediaQueries, oldDeclarationName, oldInUnknownAtRule, oldAtRootExcludingStyleRule, oldInKeyframes, oldConfiguration;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              oldImporter = t1._async_evaluate0$_importer;
+              oldStylesheet = t1._async_evaluate0$_stylesheet;
+              oldRoot = t1._async_evaluate0$_root;
+              oldParent = t1._async_evaluate0$_parent;
+              oldEndOfImports = t1._async_evaluate0$_endOfImports;
+              oldOutOfOrderImports = t1._async_evaluate0$_outOfOrderImports;
+              oldExtender = t1._async_evaluate0$_extender;
+              oldStyleRule = t1._async_evaluate0$_styleRule;
+              oldMediaQueries = t1._async_evaluate0$_mediaQueries;
+              oldDeclarationName = t1._async_evaluate0$_declarationName;
+              oldInUnknownAtRule = t1._async_evaluate0$_inUnknownAtRule;
+              oldAtRootExcludingStyleRule = t1._async_evaluate0$_atRootExcludingStyleRule;
+              oldInKeyframes = t1._async_evaluate0$_inKeyframes;
+              oldConfiguration = t1._async_evaluate0$_configuration;
+              t1._async_evaluate0$_importer = $async$self.importer;
+              t2 = t1._async_evaluate0$_stylesheet = $async$self.stylesheet;
+              t3 = t2.span;
+              t1._async_evaluate0$_parent = t1._async_evaluate0$_root = V.ModifiableCssStylesheet$0(t3);
+              t1._async_evaluate0$_endOfImports = 0;
+              t1._async_evaluate0$_outOfOrderImports = null;
+              t1._async_evaluate0$_extender = $async$self.extender;
+              t1._async_evaluate0$_declarationName = t1._async_evaluate0$_mediaQueries = t1._async_evaluate0$_styleRule = null;
+              t1._async_evaluate0$_inKeyframes = t1._async_evaluate0$_atRootExcludingStyleRule = t1._async_evaluate0$_inUnknownAtRule = false;
+              t4 = $async$self.configuration;
+              if (t4 != null)
+                t1._async_evaluate0$_configuration = t4;
+              $async$goto = 2;
+              return P._asyncAwait(t1.visitStylesheet$1(t2), $async$call$0);
+            case 2:
+              // returning from await.
+              css = t1._async_evaluate0$_outOfOrderImports == null ? t1._async_evaluate0$_root : new V.CssStylesheet0(new P.UnmodifiableListView(t1._async_evaluate0$_addOutOfOrderImports$0(), type$.UnmodifiableListView_legacy_CssNode_2), t3);
+              $async$self._box_0.css = css;
+              t1._async_evaluate0$_importer = oldImporter;
+              t1._async_evaluate0$_stylesheet = oldStylesheet;
+              t1._async_evaluate0$_root = oldRoot;
+              t1._async_evaluate0$_parent = oldParent;
+              t1._async_evaluate0$_endOfImports = oldEndOfImports;
+              t1._async_evaluate0$_outOfOrderImports = oldOutOfOrderImports;
+              t1._async_evaluate0$_extender = oldExtender;
+              t1._async_evaluate0$_styleRule = oldStyleRule;
+              t1._async_evaluate0$_mediaQueries = oldMediaQueries;
+              t1._async_evaluate0$_declarationName = oldDeclarationName;
+              t1._async_evaluate0$_inUnknownAtRule = oldInUnknownAtRule;
+              t1._async_evaluate0$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+              t1._async_evaluate0$_inKeyframes = oldInKeyframes;
+              t1._async_evaluate0$_configuration = oldConfiguration;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor__combineCss_closure8.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsCss();
+    },
+    $signature: 111
+  };
+  E._EvaluateVisitor__combineCss_closure9.prototype = {
+    call$1: function(target) {
+      return !this.selectors.contains$1(0, target);
+    },
+    $signature: 19
+  };
+  E._EvaluateVisitor__combineCss_closure10.prototype = {
+    call$1: function(module) {
+      return module.cloneCss$0();
+    },
+    $signature: 168
+  };
+  E._EvaluateVisitor__extendModules_closure5.prototype = {
+    call$1: function(target) {
+      return !this.originalSelectors.contains$1(0, target);
+    },
+    $signature: 19
+  };
+  E._EvaluateVisitor__extendModules_closure6.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extender_2);
+    },
+    $signature: 150
+  };
+  E._EvaluateVisitor__topologicalModules_visitModule2.prototype = {
+    call$1: function(module) {
+      var t1, t2, t3, _i, upstream;
+      for (t1 = module.get$upstream(), t2 = t1.length, t3 = this.seen, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        upstream = t1[_i];
+        if (upstream.get$transitivelyContainsCss() && t3.add$1(0, upstream))
+          this.call$1(upstream);
+      }
+      this.sorted.addFirst$1(module);
+    },
+    $signature: 152
+  };
+  E._EvaluateVisitor_visitAtRootRule_closure8.prototype = {
+    call$0: function() {
+      return V.AtRootQueryParser$0(this.resolved, this.$this._async_evaluate0$_logger, null).parse$0();
+    },
+    $signature: 125
+  };
+  E._EvaluateVisitor_visitAtRootRule_closure9.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitAtRootRule_closure10.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 2
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure17.prototype = {
+    call$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, oldParent;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              oldParent = t1._async_evaluate0$_parent;
+              t1._async_evaluate0$_parent = $async$self.newParent;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate0$_environment.scope$1$2$when(callback, $async$self.node.hasDeclarations, type$.void), $async$call$1);
+            case 2:
+              // returning from await.
+              t1._async_evaluate0$_parent = oldParent;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure18.prototype = {
+    call$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, oldAtRootExcludingStyleRule;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              oldAtRootExcludingStyleRule = t1._async_evaluate0$_atRootExcludingStyleRule;
+              t1._async_evaluate0$_atRootExcludingStyleRule = true;
+              $async$goto = 2;
+              return P._asyncAwait($async$self.innerScope.call$1(callback), $async$call$1);
+            case 2:
+              // returning from await.
+              t1._async_evaluate0$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure19.prototype = {
+    call$1: function(callback) {
+      return this.$this._async_evaluate0$_withMediaQueries$1$2(null, new E._EvaluateVisitor__scopeForAtRoot__closure2(this.innerScope, callback), type$.Null);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor__scopeForAtRoot__closure2.prototype = {
+    call$0: function() {
+      return this.innerScope.call$1(this.callback);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure20.prototype = {
+    call$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, wasInKeyframes;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              wasInKeyframes = t1._async_evaluate0$_inKeyframes;
+              t1._async_evaluate0$_inKeyframes = false;
+              $async$goto = 2;
+              return P._asyncAwait($async$self.innerScope.call$1(callback), $async$call$1);
+            case 2:
+              // returning from await.
+              t1._async_evaluate0$_inKeyframes = wasInKeyframes;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure21.prototype = {
+    call$1: function($parent) {
+      return type$.legacy_CssAtRule_2._is($parent);
+    },
+    $signature: 146
+  };
+  E._EvaluateVisitor__scopeForAtRoot_closure22.prototype = {
+    call$1: function(callback) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, wasInUnknownAtRule;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              wasInUnknownAtRule = t1._async_evaluate0$_inUnknownAtRule;
+              t1._async_evaluate0$_inUnknownAtRule = false;
+              $async$goto = 2;
+              return P._asyncAwait($async$self.innerScope.call$1(callback), $async$call$1);
+            case 2:
+              // returning from await.
+              t1._async_evaluate0$_inUnknownAtRule = wasInUnknownAtRule;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 32
+  };
+  E._EvaluateVisitor_visitContentRule_closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.content.declaration.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 6:
+              // returning from await.
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitDeclaration_closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitEachRule_closure8.prototype = {
+    call$1: function(value) {
+      return this.$this._async_evaluate0$_environment.setLocalVariable$3(C.JSArray_methods.get$first(this.node.variables), value.withoutSlash$0(), this.nodeWithSpan);
+    },
+    $signature: 78
+  };
+  E._EvaluateVisitor_visitEachRule_closure9.prototype = {
+    call$1: function(value) {
+      return this.$this._async_evaluate0$_setMultipleVariables$3(this.node.variables, value, this.nodeWithSpan);
+    },
+    $signature: 78
+  };
+  E._EvaluateVisitor_visitEachRule_closure10.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this;
+      return t1._async_evaluate0$_handleReturn$2(_this.list.get$asList(), new E._EvaluateVisitor_visitEachRule__closure2(t1, _this.setVariables, _this.node));
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor_visitEachRule__closure2.prototype = {
+    call$1: function(element) {
+      var t1;
+      this.setVariables.call$1(element);
+      t1 = this.$this;
+      return t1._async_evaluate0$_handleReturn$2(this.node.children, new E._EvaluateVisitor_visitEachRule___closure2(t1));
+    },
+    $signature: 294
+  };
+  E._EvaluateVisitor_visitEachRule___closure2.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 77
+  };
+  E._EvaluateVisitor_visitExtendRule_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.targetText;
+      return D.SelectorList_SelectorList$parse0(B.trimAscii0(t1.get$value(t1), true), false, true, this.$this._async_evaluate0$_logger);
+    },
+    $signature: 44
+  };
+  E._EvaluateVisitor_visitAtRule_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t3, _i, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate0$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate0$_atRootExcludingStyleRule) || t1._async_evaluate0$_inKeyframes ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t3 = t2.length, _i = 0;
+            case 5:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 7;
+                break;
+              }
+              $async$goto = 8;
+              return P._asyncAwait(t2[_i].accept$1(t1), $async$call$0);
+            case 8:
+              // returning from await.
+            case 6:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 7:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 9;
+              return P._asyncAwait(t1._async_evaluate0$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitAtRule__closure2(t1, $async$self.node), false, type$.legacy_ModifiableCssStyleRule_2, type$.Null), $async$call$0);
+            case 9:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitAtRule__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitAtRule_closure6.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor_visitForRule_closure14.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassNumber_2),
+        $async$returnValue, $async$self = this;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self.node.from.accept$1($async$self.$this), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result.assertNumber$0();
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 138
+  };
+  E._EvaluateVisitor_visitForRule_closure15.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_SassNumber_2),
+        $async$returnValue, $async$self = this;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self.node.to.accept$1($async$self.$this), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result.assertNumber$0();
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 138
+  };
+  E._EvaluateVisitor_visitForRule_closure16.prototype = {
+    call$0: function() {
+      return this.fromNumber.assertInt$0();
+    },
+    $signature: 11
+  };
+  E._EvaluateVisitor_visitForRule_closure17.prototype = {
+    call$0: function() {
+      var t1 = this.fromNumber;
+      return this.toNumber.coerce$2(t1.get$numeratorUnits(), t1.get$denominatorUnits()).assertInt$0();
+    },
+    $signature: 11
+  };
+  E._EvaluateVisitor_visitForRule_closure18.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, i, t3, t4, t5, t6, t7, t8, result, t1, t2, nodeWithSpan;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.node;
+              nodeWithSpan = t1._async_evaluate0$_expressionNode$1(t2.from);
+              i = $async$self.from, t3 = $async$self._box_0, t4 = $async$self.direction, t5 = t2.variable, t6 = $async$self.fromNumber, t2 = t2.children;
+            case 3:
+              // for condition
+              if (!(i !== t3.to)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              t7 = t1._async_evaluate0$_environment;
+              t8 = t6.get$numeratorUnits();
+              t7.setLocalVariable$3(t5, T.SassNumber_SassNumber$withUnits0(i, t6.get$denominatorUnits(), t8), nodeWithSpan);
+              $async$goto = 6;
+              return P._asyncAwait(t1._async_evaluate0$_handleReturn$2(t2, new E._EvaluateVisitor_visitForRule__closure2(t1)), $async$call$0);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              if (result != null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              i += t4;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor_visitForRule__closure2.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 77
+  };
+  E._EvaluateVisitor_visitForwardRule_closure5.prototype = {
+    call$1: function(module) {
+      this.$this._async_evaluate0$_environment.forwardModule$2(module, this.node);
+    },
+    $signature: 101
+  };
+  E._EvaluateVisitor_visitForwardRule_closure6.prototype = {
+    call$1: function(module) {
+      this.$this._async_evaluate0$_environment.forwardModule$2(module, this.node);
+    },
+    $signature: 101
+  };
+  E._EvaluateVisitor__assertConfigurationIsEmpty_closure2.prototype = {
+    call$2: function($name, value) {
+      var t1 = this.only;
+      if (t1 != null && !t1.contains$1(0, $name))
+        return;
+      t1 = this.nameInError ? "$" + H.S($name) + string$.x20was_n : string$.This_v;
+      throw H.wrapException(this.$this._async_evaluate0$_exception$2(t1, value.configurationSpan));
+    },
+    $signature: 136
+  };
+  E._EvaluateVisitor_visitIfRule_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      return t1._async_evaluate0$_handleReturn$2(this._box_0.clause.children, new E._EvaluateVisitor_visitIfRule__closure2(t1));
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor_visitIfRule__closure2.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 77
+  };
+  E._EvaluateVisitor__visitDynamicImport_closure2.prototype = {
+    call$0: function() {
+      return this.$call$body$_EvaluateVisitor__visitDynamicImport_closure0();
+    },
+    $call$body$_EvaluateVisitor__visitDynamicImport_closure0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, previousLoad, oldImporter, oldStylesheet, t4, t5, t6, t7, t8, t9, t10, t11, environment, module, visitor, _box_0, t1, t2, result, importer, stylesheet, url, t3;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              _box_0 = {};
+              t1 = $async$self.$this;
+              t2 = $async$self.$import;
+              $async$goto = 3;
+              return P._asyncAwait(t1._async_evaluate0$_loadStylesheet$3$forImport(t2.url, t2.span, true), $async$call$0);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              importer = result.item1;
+              stylesheet = result.item2;
+              url = stylesheet.span.file.url;
+              t3 = t1._async_evaluate0$_activeModules;
+              if (t3.containsKey$1(url)) {
+                previousLoad = t3.$index(0, url);
+                throw H.wrapException(previousLoad == null ? t1._async_evaluate0$_exception$1("This file is already being loaded.") : t1._async_evaluate0$_multiSpanException$3("This file is already being loaded.", "new load", P.LinkedHashMap_LinkedHashMap$_literal([previousLoad.get$span(), "original load"], type$.legacy_FileSpan, type$.legacy_String)));
+              }
+              t3.$indexSet(0, url, t2);
+              t2 = new P.UnmodifiableListView(stylesheet._stylesheet1$_uses, type$.UnmodifiableListView_legacy_UseRule_2);
+              if (t2.get$length(t2) === 0) {
+                t2 = new P.UnmodifiableListView(stylesheet._stylesheet1$_forwards, type$.UnmodifiableListView_legacy_ForwardRule_2);
+                t2 = t2.get$length(t2) === 0;
+              } else
+                t2 = false;
+              $async$goto = t2 ? 4 : 5;
+              break;
+            case 4:
+              // then
+              oldImporter = t1._async_evaluate0$_importer;
+              oldStylesheet = t1._async_evaluate0$_stylesheet;
+              t1._async_evaluate0$_importer = importer;
+              t1._async_evaluate0$_stylesheet = stylesheet;
+              $async$goto = 6;
+              return P._asyncAwait(t1.visitStylesheet$1(stylesheet), $async$call$0);
+            case 6:
+              // returning from await.
+              t1._async_evaluate0$_importer = oldImporter;
+              t1._async_evaluate0$_stylesheet = oldStylesheet;
+              t3.remove$1(0, url);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 5:
+              // join
+              _box_0.children = null;
+              t2 = t1._async_evaluate0$_environment;
+              t4 = type$.legacy_String;
+              t5 = type$.legacy_Module_legacy_AsyncCallable_2;
+              t6 = type$.legacy_AstNode_2;
+              t7 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_AsyncCallable_2);
+              t8 = t2._async_environment0$_variables;
+              t8 = H.setRuntimeTypeInfo(t8.slice(0), H._arrayInstanceType(t8));
+              t9 = t2._async_environment0$_variableNodes;
+              if (t9 == null)
+                t9 = null;
+              else
+                t9 = H.setRuntimeTypeInfo(t9.slice(0), H._arrayInstanceType(t9));
+              t10 = t2._async_environment0$_functions;
+              t10 = H.setRuntimeTypeInfo(t10.slice(0), H._arrayInstanceType(t10));
+              t11 = t2._async_environment0$_mixins;
+              t11 = H.setRuntimeTypeInfo(t11.slice(0), H._arrayInstanceType(t11));
+              environment = Q.AsyncEnvironment$_0(P.LinkedHashMap_LinkedHashMap$_empty(t4, t5), P.LinkedHashMap_LinkedHashMap$_empty(t4, t6), P.LinkedHashSet_LinkedHashSet$_empty(t5), P.LinkedHashMap_LinkedHashMap$_empty(t5, t6), null, null, null, t7, t8, t9, t10, t11, t2._async_environment0$_content);
+              $async$goto = 7;
+              return P._asyncAwait(t1._async_evaluate0$_withEnvironment$1$2(environment, new E._EvaluateVisitor__visitDynamicImport__closure2(_box_0, t1, importer, stylesheet, environment), type$.Null), $async$call$0);
+            case 7:
+              // returning from await.
+              module = Q._EnvironmentModule__EnvironmentModule2(environment, new V.CssStylesheet0(new P.UnmodifiableListView(C.List_empty12, type$.UnmodifiableListView_legacy_CssNode_2), Y.SourceFile$decoded(C.List_empty1, "<dummy module>").span$1(0)), C.C_EmptyExtender0, environment._async_environment0$_forwardedModules);
+              t1._async_evaluate0$_environment.importForwards$1(module);
+              $async$goto = module.transitivelyContainsCss ? 8 : 9;
+              break;
+            case 8:
+              // then
+              $async$goto = 10;
+              return P._asyncAwait(t1._async_evaluate0$_combineCss$2$clone(module, module.transitivelyContainsExtensions).accept$1(t1), $async$call$0);
+            case 10:
+              // returning from await.
+            case 9:
+              // join
+              visitor = new E._ImportedCssVisitor2(t1);
+              for (t1 = J.get$iterator$ax(_box_0.children); t1.moveNext$0();)
+                t1.get$current(t1).accept$1(visitor);
+              t3.remove$1(0, url);
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor__visitDynamicImport__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t2, t3, t1, oldImporter, oldStylesheet, oldRoot, oldParent, oldEndOfImports, oldOutOfOrderImports, oldConfiguration;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              oldImporter = t1._async_evaluate0$_importer;
+              oldStylesheet = t1._async_evaluate0$_stylesheet;
+              oldRoot = t1._async_evaluate0$_root;
+              oldParent = t1._async_evaluate0$_parent;
+              oldEndOfImports = t1._async_evaluate0$_endOfImports;
+              oldOutOfOrderImports = t1._async_evaluate0$_outOfOrderImports;
+              oldConfiguration = t1._async_evaluate0$_configuration;
+              t1._async_evaluate0$_importer = $async$self.importer;
+              t2 = t1._async_evaluate0$_stylesheet = $async$self.stylesheet;
+              t1._async_evaluate0$_parent = t1._async_evaluate0$_root = V.ModifiableCssStylesheet$0(t2.span);
+              t1._async_evaluate0$_endOfImports = 0;
+              t1._async_evaluate0$_outOfOrderImports = null;
+              t3 = new P.UnmodifiableListView(t2._stylesheet1$_forwards, type$.UnmodifiableListView_legacy_ForwardRule_2);
+              if (!t3.get$isEmpty(t3))
+                t1._async_evaluate0$_configuration = $async$self.environment.toImplicitConfiguration$0();
+              $async$goto = 2;
+              return P._asyncAwait(t1.visitStylesheet$1(t2), $async$call$0);
+            case 2:
+              // returning from await.
+              $async$self._box_0.children = t1._async_evaluate0$_addOutOfOrderImports$0();
+              t1._async_evaluate0$_importer = oldImporter;
+              t1._async_evaluate0$_stylesheet = oldStylesheet;
+              t1._async_evaluate0$_root = oldRoot;
+              t1._async_evaluate0$_parent = oldParent;
+              t1._async_evaluate0$_endOfImports = oldEndOfImports;
+              t1._async_evaluate0$_outOfOrderImports = oldOutOfOrderImports;
+              t1._async_evaluate0$_configuration = oldConfiguration;
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitIncludeRule_closure8.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._async_evaluate0$_environment.getMixin$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 108
+  };
+  E._EvaluateVisitor_visitIncludeRule_closure9.prototype = {
+    call$0: function() {
+      return this.node.get$spanWithoutContent();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 33
+  };
+  E._EvaluateVisitor_visitIncludeRule_closure10.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, t1;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(t1._async_evaluate0$_environment.withContent$2($async$self.contentCallable, new E._EvaluateVisitor_visitIncludeRule__closure2(t1, $async$self.mixin, $async$self.nodeWithSpan)), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitIncludeRule__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$returnValue, $async$self = this, t1;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(t1._async_evaluate0$_environment.asMixin$1(new E._EvaluateVisitor_visitIncludeRule___closure2(t1, $async$self.mixin, $async$self.nodeWithSpan)), $async$call$0);
+            case 3:
+              // returning from await.
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitIncludeRule___closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, t4, t5, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.mixin.declaration.children, t2 = t1.length, t3 = $async$self.$this, t4 = $async$self.nodeWithSpan, t5 = type$.legacy_Value_2, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t3._async_evaluate0$_addErrorSpan$1$2(t4, new E._EvaluateVisitor_visitIncludeRule____closure2(t3, t1[_i]), t5), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitIncludeRule____closure2.prototype = {
+    call$0: function() {
+      return this.statement.accept$1(this.$this);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor_visitMediaRule_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.mergedQueries;
+              if (t2 == null)
+                t2 = $async$self.queries;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate0$_withMediaQueries$1$2(t2, new E._EvaluateVisitor_visitMediaRule__closure2(t1, $async$self.node), type$.Null), $async$call$0);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitMediaRule__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t3, _i, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate0$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate0$_atRootExcludingStyleRule) ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t3 = t2.length, _i = 0;
+            case 5:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 7;
+                break;
+              }
+              $async$goto = 8;
+              return P._asyncAwait(t2[_i].accept$1(t1), $async$call$0);
+            case 8:
+              // returning from await.
+            case 6:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 7:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 9;
+              return P._asyncAwait(t1._async_evaluate0$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitMediaRule___closure2(t1, $async$self.node), false, type$.legacy_ModifiableCssStyleRule_2, type$.Null), $async$call$0);
+            case 9:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitMediaRule___closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitMediaRule_closure6.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule_2._is(node))
+        t1 = this.mergedQueries != null && type$.legacy_CssMediaRule_2._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor__visitMediaQueries_closure2.prototype = {
+    call$0: function() {
+      return F.MediaQueryParser$0(this.resolved, this.$this._async_evaluate0$_logger, null).parse$0();
+    },
+    $signature: 100
+  };
+  E._EvaluateVisitor_visitStyleRule_closure20.prototype = {
+    call$0: function() {
+      var t1 = this.selectorText;
+      return E.KeyframeSelectorParser$0(t1.get$value(t1), this.$this._async_evaluate0$_logger).parse$0();
+    },
+    $signature: 40
+  };
+  E._EvaluateVisitor_visitStyleRule_closure21.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitStyleRule_closure22.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor_visitStyleRule_closure23.prototype = {
+    call$0: function() {
+      var t2, t3,
+        t1 = this.selectorText;
+      t1 = t1.get$value(t1);
+      t2 = this.$this;
+      t3 = !t2._async_evaluate0$_stylesheet.plainCss;
+      return D.SelectorList_SelectorList$parse0(t1, t3, t3, t2._async_evaluate0$_logger);
+    },
+    $signature: 44
+  };
+  E._EvaluateVisitor_visitStyleRule_closure24.prototype = {
+    call$0: function() {
+      var t1 = this._box_0.parsedSelector,
+        t2 = this.$this,
+        t3 = t2._async_evaluate0$_styleRule;
+      t3 = t3 == null ? null : t3.originalSelector;
+      return t1.resolveParentSelectors$2$implicitParent(t3, !t2._async_evaluate0$_atRootExcludingStyleRule);
+    },
+    $signature: 44
+  };
+  E._EvaluateVisitor_visitStyleRule_closure25.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate0$_withStyleRule$1$2($async$self.rule, new E._EvaluateVisitor_visitStyleRule__closure2(t1, $async$self.node), type$.Null), $async$call$0);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitStyleRule__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitStyleRule_closure26.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor_visitSupportsRule_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t3, _i, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate0$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate0$_atRootExcludingStyleRule) ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t3 = t2.length, _i = 0;
+            case 5:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 7;
+                break;
+              }
+              $async$goto = 8;
+              return P._asyncAwait(t2[_i].accept$1(t1), $async$call$0);
+            case 8:
+              // returning from await.
+            case 6:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 7:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 9;
+              return P._asyncAwait(t1._async_evaluate0$_withParent$2$2(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitSupportsRule__closure2(t1, $async$self.node), type$.legacy_ModifiableCssStyleRule_2, type$.Null), $async$call$0);
+            case 9:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitSupportsRule__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, t3, _i;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t2 = t1.length, t3 = $async$self.$this, _i = 0;
+            case 2:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 5;
+              return P._asyncAwait(t1[_i].accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+            case 3:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 4:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitSupportsRule_closure6.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor_visitVariableDeclaration_closure8.prototype = {
+    call$0: function() {
+      var t1 = this.override;
+      this.$this._async_evaluate0$_environment.setVariable$4$global(this.node.name, t1.value, t1.assignmentNode, true);
+    },
+    $signature: 0
+  };
+  E._EvaluateVisitor_visitVariableDeclaration_closure9.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._async_evaluate0$_environment.getVariable$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 21
+  };
+  E._EvaluateVisitor_visitVariableDeclaration_closure10.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = this.node;
+      t1._async_evaluate0$_environment.setVariable$5$global$namespace(t2.name, this.value, t1._async_evaluate0$_expressionNode$1(t2.expression), t2.isGlobal, t2.namespace);
+    },
+    $signature: 0
+  };
+  E._EvaluateVisitor_visitUseRule_closure2.prototype = {
+    call$1: function(module) {
+      var t1 = this.node;
+      this.$this._async_evaluate0$_environment.addModule$3$namespace(module, t1, t1.namespace);
+    },
+    $signature: 101
+  };
+  E._EvaluateVisitor_visitWarnRule_closure2.prototype = {
+    call$0: function() {
+      return this.node.expression.accept$1(this.$this);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor_visitWhileRule_closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, t3, result;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node, t2 = t1.condition, t3 = $async$self.$this, t1 = t1.children;
+            case 3:
+              // for condition
+              $async$goto = 5;
+              return P._asyncAwait(t2.accept$1(t3), $async$call$0);
+            case 5:
+              // returning from await.
+              if (!$async$result.get$isTruthy()) {
+                // goto after for
+                $async$goto = 4;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(t3._async_evaluate0$_handleReturn$2(t1, new E._EvaluateVisitor_visitWhileRule__closure2(t3)), $async$call$0);
+            case 6:
+              // returning from await.
+              result = $async$result;
+              if (result != null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 4:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor_visitWhileRule__closure2.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 77
+  };
+  E._EvaluateVisitor_visitBinaryOperationExpression_closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, right, result, t1, t2, left, $async$temp1, $async$temp2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node;
+              t2 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(t1.left.accept$1(t2), $async$call$0);
+            case 3:
+              // returning from await.
+              left = $async$result;
+            case 4:
+              // switch
+              switch (t1.operator) {
+                case C.BinaryOperator_kjl0:
+                  // goto case
+                  $async$goto = 6;
+                  break;
+                case C.BinaryOperator_or_or_10:
+                  // goto case
+                  $async$goto = 7;
+                  break;
+                case C.BinaryOperator_and_and_20:
+                  // goto case
+                  $async$goto = 8;
+                  break;
+                case C.BinaryOperator_YlX0:
+                  // goto case
+                  $async$goto = 9;
+                  break;
+                case C.BinaryOperator_i5H0:
+                  // goto case
+                  $async$goto = 10;
+                  break;
+                case C.BinaryOperator_AcR1:
+                  // goto case
+                  $async$goto = 11;
+                  break;
+                case C.BinaryOperator_1da0:
+                  // goto case
+                  $async$goto = 12;
+                  break;
+                case C.BinaryOperator_8qt0:
+                  // goto case
+                  $async$goto = 13;
+                  break;
+                case C.BinaryOperator_33h0:
+                  // goto case
+                  $async$goto = 14;
+                  break;
+                case C.BinaryOperator_AcR2:
+                  // goto case
+                  $async$goto = 15;
+                  break;
+                case C.BinaryOperator_iyO0:
+                  // goto case
+                  $async$goto = 16;
+                  break;
+                case C.BinaryOperator_O1M0:
+                  // goto case
+                  $async$goto = 17;
+                  break;
+                case C.BinaryOperator_RTB0:
+                  // goto case
+                  $async$goto = 18;
+                  break;
+                case C.BinaryOperator_2ad0:
+                  // goto case
+                  $async$goto = 19;
+                  break;
+                default:
+                  // goto default
+                  $async$goto = 20;
+                  break;
+              }
+              break;
+            case 6:
+              // case
+              $async$goto = 21;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 21:
+              // returning from await.
+              right = $async$result;
+              left.toString;
+              t1 = N.serializeValue(left, false, true) + "=";
+              right.toString;
+              $async$returnValue = new D.SassString0(t1 + N.serializeValue(right, false, true), false);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 7:
+              // case
+              $async$goto = left.get$isTruthy() ? 22 : 24;
+              break;
+            case 22:
+              // then
+              $async$result = left;
+              // goto join
+              $async$goto = 23;
+              break;
+            case 24:
+              // else
+              $async$goto = 25;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 25:
+              // returning from await.
+            case 23:
+              // join
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 8:
+              // case
+              $async$goto = left.get$isTruthy() ? 26 : 28;
+              break;
+            case 26:
+              // then
+              $async$goto = 29;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 29:
+              // returning from await.
+              // goto join
+              $async$goto = 27;
+              break;
+            case 28:
+              // else
+              $async$result = left;
+            case 27:
+              // join
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 9:
+              // case
+              $async$temp1 = J;
+              $async$temp2 = left;
+              $async$goto = 30;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 30:
+              // returning from await.
+              $async$returnValue = $async$temp1.$eq$($async$temp2, $async$result) ? C.SassBoolean_true : C.SassBoolean_false;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 10:
+              // case
+              $async$temp1 = J;
+              $async$temp2 = left;
+              $async$goto = 31;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 31:
+              // returning from await.
+              $async$returnValue = !$async$temp1.$eq$($async$temp2, $async$result) ? C.SassBoolean_true : C.SassBoolean_false;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 11:
+              // case
+              $async$temp1 = left;
+              $async$goto = 32;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 32:
+              // returning from await.
+              $async$returnValue = $async$temp1.greaterThan$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 12:
+              // case
+              $async$temp1 = left;
+              $async$goto = 33;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 33:
+              // returning from await.
+              $async$returnValue = $async$temp1.greaterThanOrEquals$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 13:
+              // case
+              $async$temp1 = left;
+              $async$goto = 34;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 34:
+              // returning from await.
+              $async$returnValue = $async$temp1.lessThan$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 14:
+              // case
+              $async$temp1 = left;
+              $async$goto = 35;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 35:
+              // returning from await.
+              $async$returnValue = $async$temp1.lessThanOrEquals$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 15:
+              // case
+              $async$temp1 = left;
+              $async$goto = 36;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 36:
+              // returning from await.
+              $async$returnValue = $async$temp1.plus$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 16:
+              // case
+              $async$temp1 = left;
+              $async$goto = 37;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 37:
+              // returning from await.
+              $async$returnValue = $async$temp1.minus$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 17:
+              // case
+              $async$temp1 = left;
+              $async$goto = 38;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 38:
+              // returning from await.
+              $async$returnValue = $async$temp1.times$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 18:
+              // case
+              $async$goto = 39;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 39:
+              // returning from await.
+              right = $async$result;
+              result = left.dividedBy$1(right);
+              if (t1.allowsSlash && left instanceof T.SassNumber0 && right instanceof T.SassNumber0) {
+                $async$returnValue = type$.legacy_SassNumber_2._as(result).withSlash$2(left, right);
+                // goto return
+                $async$goto = 1;
+                break;
+              } else {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 19:
+              // case
+              $async$temp1 = left;
+              $async$goto = 40;
+              return P._asyncAwait(t1.right.accept$1(t2), $async$call$0);
+            case 40:
+              // returning from await.
+              $async$returnValue = $async$temp1.modulo$1($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 20:
+              // default
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 5:
+              // after switch
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor_visitVariableExpression_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._async_evaluate0$_environment.getVariable$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 21
+  };
+  E._EvaluateVisitor_visitListExpression_closure2.prototype = {
+    call$1: function(expression) {
+      return expression.accept$1(this.$this);
+    },
+    $signature: 303
+  };
+  E._EvaluateVisitor_visitFunctionExpression_closure5.prototype = {
+    call$0: function() {
+      var t1 = this.node.namespace,
+        t2 = this.plainName;
+      if (t1 == null)
+        t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return this.$this._async_evaluate0$_getFunction$2$namespace(t2, t1);
+    },
+    $signature: 108
+  };
+  E._EvaluateVisitor_visitFunctionExpression_closure6.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._async_evaluate0$_runFunctionCallable$3(t1.$arguments, this._box_0.$function, t1);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor__runUserDefinedCallable_closure2.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = _this.callable;
+      return t1._async_evaluate0$_withEnvironment$1$2(t2.environment.closure$0(), new E._EvaluateVisitor__runUserDefinedCallable__closure2(t1, _this.evaluated, t2, _this.nodeWithSpan, _this.run), type$.legacy_Value_2);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor__runUserDefinedCallable__closure2.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this;
+      return t1._async_evaluate0$_environment.scope$1$1(new E._EvaluateVisitor__runUserDefinedCallable___closure2(t1, _this.evaluated, _this.callable, _this.nodeWithSpan, _this.run), type$.legacy_Value_2);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor__runUserDefinedCallable___closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, declaredArguments, minLength, t8, i, t9, t10, t11, argument, value, t12, rest, argumentList, result, argumentWord, argumentNames, t1, t2, t3, t4, t5, t6, t7;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.evaluated;
+              t3 = t2.positional;
+              t4 = t3.length;
+              t5 = t2.named;
+              t6 = $async$self.callable.declaration.$arguments;
+              t7 = $async$self.nodeWithSpan;
+              t1._async_evaluate0$_verifyArguments$4(t4, t5, t6, t7);
+              declaredArguments = t6.$arguments;
+              t4 = declaredArguments.length;
+              minLength = Math.min(t3.length, t4);
+              for (t8 = t1._async_evaluate0$_sourceMap, i = 0; i < minLength; ++i) {
+                t9 = t1._async_evaluate0$_environment;
+                t10 = declaredArguments[i].name;
+                t11 = t3[i].withoutSlash$0();
+                t9.setLocalVariable$3(t10, t11, t8 ? t2.positionalNodes[i] : null);
+              }
+              i = t3.length;
+            case 3:
+              // for condition
+              if (!(i < t4)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              argument = declaredArguments[i];
+              t9 = argument.name;
+              value = t5.remove$1(0, t9);
+              $async$goto = value == null ? 6 : 7;
+              break;
+            case 6:
+              // then
+              $async$goto = 8;
+              return P._asyncAwait(argument.defaultValue.accept$1(t1), $async$call$0);
+            case 8:
+              // returning from await.
+              value = $async$result;
+            case 7:
+              // join
+              t10 = t1._async_evaluate0$_environment;
+              t11 = value.withoutSlash$0();
+              if (t8) {
+                t12 = t2.namedNodes.$index(0, t9);
+                if (t12 == null)
+                  t12 = t1._async_evaluate0$_expressionNode$1(argument.defaultValue);
+              } else
+                t12 = null;
+              t10.setLocalVariable$3(t9, t11, t12);
+            case 4:
+              // for update
+              ++i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              t8 = t6.restArgument;
+              if (t8 != null) {
+                rest = t3.length > t4 ? C.JSArray_methods.sublist$1(t3, t4) : C.List_empty16;
+                t2 = t2.separator;
+                argumentList = D.SassArgumentList$0(rest, t5, t2 === C.ListSeparator_undecided0 ? C.ListSeparator_comma0 : t2);
+                t1._async_evaluate0$_environment.setLocalVariable$3(t8, argumentList, t7);
+              } else
+                argumentList = null;
+              $async$goto = 9;
+              return P._asyncAwait($async$self.run.call$0(), $async$call$0);
+            case 9:
+              // returning from await.
+              result = $async$result;
+              if (argumentList == null) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              if (t5.get$isEmpty(t5)) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              if (argumentList._argument_list$_wereKeywordsAccessed) {
+                $async$returnValue = result;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t2 = t5.get$keys(t5);
+              argumentWord = B.pluralize0("argument", t2.get$length(t2), null);
+              t5 = t5.get$keys(t5);
+              argumentNames = B.toSentence0(H.MappedIterable_MappedIterable(t5, new E._EvaluateVisitor__runUserDefinedCallable____closure2(), H._instanceType(t5)._eval$1("Iterable.E"), type$.legacy_Object), "or");
+              throw H.wrapException(E.MultiSpanSassRuntimeException$0("No " + argumentWord + " named " + H.S(argumentNames) + ".", t7.get$span(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([t6.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), t1._async_evaluate0$_stackTrace$1(t7.get$span())));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor__runUserDefinedCallable____closure2.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  E._EvaluateVisitor__runFunctionCallable_closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t1, t2, t3, t4, _i, $returnValue;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.callable.declaration, t2 = t1.children, t3 = t2.length, t4 = $async$self.$this, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t3)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait(t2[_i].accept$1(t4), $async$call$0);
+            case 6:
+              // returning from await.
+              $returnValue = $async$result;
+              if ($returnValue instanceof F.Value0) {
+                $async$returnValue = $returnValue;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              throw H.wrapException(t4._async_evaluate0$_exception$2("Function finished without @return.", t1.span));
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 31
+  };
+  E._EvaluateVisitor__runBuiltInCallable_closure5.prototype = {
+    call$0: function() {
+      return this.overload.verify$2(this.evaluated.positional.length, this.namedSet);
+    },
+    $signature: 1
+  };
+  E._EvaluateVisitor__runBuiltInCallable_closure6.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  E._EvaluateVisitor__evaluateArguments_closure2.prototype = {
+    call$2: function(key, value) {
+      var t1;
+      this.named.$indexSet(0, key, value);
+      t1 = this.namedNodes;
+      if (t1 != null)
+        t1.$indexSet(0, key, this.restNodeForSpan);
+    },
+    $signature: 76
+  };
+  E._EvaluateVisitor__evaluateMacroArguments_closure11.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression0(value, null);
+    },
+    $signature: 48
+  };
+  E._EvaluateVisitor__evaluateMacroArguments_closure12.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression0(value, null);
+    },
+    $signature: 48
+  };
+  E._EvaluateVisitor__evaluateMacroArguments_closure13.prototype = {
+    call$2: function(key, value) {
+      this.named.$indexSet(0, key, new F.ValueExpression0(value, null));
+    },
+    $signature: 76
+  };
+  E._EvaluateVisitor__evaluateMacroArguments_closure14.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression0(value, null);
+    },
+    $signature: 48
+  };
+  E._EvaluateVisitor__addRestMap_closure5.prototype = {
+    call$1: function(value) {
+      return this.T._eval$1("0*")._as(value);
+    },
+    $signature: function() {
+      return this.T._eval$1("0*(Value0*)");
+    }
+  };
+  E._EvaluateVisitor__addRestMap_closure6.prototype = {
+    call$2: function(key, value) {
+      var _this = this;
+      if (key instanceof D.SassString0)
+        _this.values.$indexSet(0, key.text, _this._box_0.convert.call$1(value));
+      else
+        throw H.wrapException(_this.$this._async_evaluate0$_exception$2(string$.Variab_ + H.S(key) + " is not a string in " + _this.map.toString$0(0) + ".", _this.nodeWithSpan.get$span()));
+    },
+    $signature: 45
+  };
+  E._EvaluateVisitor__verifyArguments_closure2.prototype = {
+    call$0: function() {
+      return this.$arguments.verify$2(this.positional, new M.MapKeySet(this.named, type$.MapKeySet_legacy_String));
+    },
+    $signature: 1
+  };
+  E._EvaluateVisitor_visitStringExpression_closure2.prototype = {
+    call$1: function(value) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, t1, result;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (typeof value == "string") {
+                $async$returnValue = value;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              type$.legacy_Expression_2._as(value);
+              t1 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(value.accept$1(t1), $async$call$1);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              $async$returnValue = result instanceof D.SassString0 ? result.text : t1._async_evaluate0$_serialize$3$quote(result, value, false);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 79
+  };
+  E._EvaluateVisitor_visitCssAtRule_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssAtRule_closure6.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor_visitCssKeyframeBlock_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssKeyframeBlock_closure6.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor_visitCssMediaRule_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = $async$self.mergedQueries;
+              if (t2 == null)
+                t2 = $async$self.node.queries;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate0$_withMediaQueries$1$2(t2, new E._EvaluateVisitor_visitCssMediaRule__closure2(t1, $async$self.node), type$.Null), $async$call$0);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssMediaRule__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, cur, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate0$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate0$_atRootExcludingStyleRule) ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t2 = new H.ListIterator(t2, t2.get$length(t2));
+            case 5:
+              // for condition
+              if (!t2.moveNext$0()) {
+                // goto after for
+                $async$goto = 6;
+                break;
+              }
+              cur = t2.__internal$_current;
+              $async$goto = 7;
+              return P._asyncAwait(cur.accept$1(t1), $async$call$0);
+            case 7:
+              // returning from await.
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 6:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 8;
+              return P._asyncAwait(t1._async_evaluate0$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitCssMediaRule___closure2(t1, $async$self.node), false, type$.legacy_ModifiableCssStyleRule_2, type$.Null), $async$call$0);
+            case 8:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssMediaRule___closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssMediaRule_closure6.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule_2._is(node))
+        t1 = this.mergedQueries != null && type$.legacy_CssMediaRule_2._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor_visitCssStyleRule_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              $async$goto = 2;
+              return P._asyncAwait(t1._async_evaluate0$_withStyleRule$1$2($async$self.rule, new E._EvaluateVisitor_visitCssStyleRule__closure2(t1, $async$self.node), type$.Null), $async$call$0);
+            case 2:
+              // returning from await.
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssStyleRule__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssStyleRule_closure6.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor_visitCssSupportsRule_closure5.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, cur, t1, t2;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this;
+              t2 = t1._async_evaluate0$_styleRule;
+              $async$goto = !(t2 != null && !t1._async_evaluate0$_atRootExcludingStyleRule) ? 2 : 4;
+              break;
+            case 2:
+              // then
+              t2 = $async$self.node.children, t2 = new H.ListIterator(t2, t2.get$length(t2));
+            case 5:
+              // for condition
+              if (!t2.moveNext$0()) {
+                // goto after for
+                $async$goto = 6;
+                break;
+              }
+              cur = t2.__internal$_current;
+              $async$goto = 7;
+              return P._asyncAwait(cur.accept$1(t1), $async$call$0);
+            case 7:
+              // returning from await.
+              // goto for condition
+              $async$goto = 5;
+              break;
+            case 6:
+              // after for
+              // goto join
+              $async$goto = 3;
+              break;
+            case 4:
+              // else
+              $async$goto = 8;
+              return P._asyncAwait(t1._async_evaluate0$_withParent$2$2(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new E._EvaluateVisitor_visitCssSupportsRule__closure2(t1, $async$self.node), type$.legacy_ModifiableCssStyleRule_2, type$.Null), $async$call$0);
+            case 8:
+              // returning from await.
+            case 3:
+              // join
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssSupportsRule__closure2.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
+        $async$self = this, t1, t2, cur;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = $async$self.$this;
+            case 2:
+              // for condition
+              if (!t1.moveNext$0()) {
+                // goto after for
+                $async$goto = 3;
+                break;
+              }
+              cur = t1.__internal$_current;
+              $async$goto = 4;
+              return P._asyncAwait(cur.accept$1(t2), $async$call$0);
+            case 4:
+              // returning from await.
+              // goto for condition
+              $async$goto = 2;
+              break;
+            case 3:
+              // after for
+              // implicit return
+              return P._asyncReturn(null, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 2
+  };
+  E._EvaluateVisitor_visitCssSupportsRule_closure6.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._EvaluateVisitor__performInterpolation_closure2.prototype = {
+    call$1: function(value) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_String),
+        $async$returnValue, $async$self = this, t1, result, t2, t3;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              if (typeof value == "string") {
+                $async$returnValue = value;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              type$.legacy_Expression_2._as(value);
+              t1 = $async$self.$this;
+              $async$goto = 3;
+              return P._asyncAwait(value.accept$1(t1), $async$call$1);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              if ($async$self.warnForColor && result instanceof K.SassColor0 && $.$get$namesByColor0().containsKey$1(result)) {
+                t2 = X.Interpolation$0(H.setRuntimeTypeInfo([""], type$.JSArray_legacy_Object), null);
+                t3 = $.$get$namesByColor0();
+                t1._async_evaluate0$_warn$2(string$.You_pr + H.S(t3.$index(0, result)) + string$.x20in_in + H.S(result) + string$.x2c_whicw + H.S(t3.$index(0, result)) + string$.x22x29__If + new V.BinaryOperationExpression0(C.BinaryOperator_AcR2, new D.StringExpression0(t2, true), value, false).toString$0(0) + "'.", value.get$span());
+              }
+              $async$returnValue = t1._async_evaluate0$_serialize$3$quote(result, value, false);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 79
+  };
+  E._EvaluateVisitor__serialize_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.value;
+      t1.toString;
+      return N.serializeValue(t1, false, this.quote);
+    },
+    $signature: 12
+  };
+  E._EvaluateVisitor__stackTrace_closure2.prototype = {
+    call$1: function(tuple) {
+      return this.$this._async_evaluate0$_stackFrame$2(tuple.item1, tuple.item2.get$span());
+    },
+    $signature: 132
+  };
+  E._ImportedCssVisitor2.prototype = {
+    visitCssAtRule$1: function(node) {
+      var t1 = node.isChildless ? null : new E._ImportedCssVisitor_visitCssAtRule_closure2();
+      this._async_evaluate0$_visitor._async_evaluate0$_addChild$2$through(node, t1);
+    },
+    visitCssComment$1: function(node) {
+      return this._async_evaluate0$_visitor._async_evaluate0$_addChild$1(node);
+    },
+    visitCssDeclaration$1: function(node) {
+    },
+    visitCssImport$1: function(node) {
+      var t1 = this._async_evaluate0$_visitor,
+        t2 = t1._async_evaluate0$_parent,
+        t3 = t1._async_evaluate0$_root;
+      if (t2 != t3)
+        t1._async_evaluate0$_addChild$1(node);
+      else if (t1._async_evaluate0$_endOfImports === J.get$length$asx(t3.children._collection$_source)) {
+        t1._async_evaluate0$_addChild$1(node);
+        t1._async_evaluate0$_endOfImports = t1._async_evaluate0$_endOfImports + 1;
+      } else {
+        t2 = t1._async_evaluate0$_outOfOrderImports;
+        (t2 == null ? t1._async_evaluate0$_outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport_2) : t2).push(node);
+      }
+    },
+    visitCssKeyframeBlock$1: function(node) {
+    },
+    visitCssMediaRule$1: function(node) {
+      var t1 = this._async_evaluate0$_visitor,
+        t2 = t1._async_evaluate0$_mediaQueries;
+      t1._async_evaluate0$_addChild$2$through(node, new E._ImportedCssVisitor_visitCssMediaRule_closure2(t2 == null || t1._async_evaluate0$_mergeMediaQueries$2(t2, node.queries) != null));
+    },
+    visitCssStyleRule$1: function(node) {
+      return this._async_evaluate0$_visitor._async_evaluate0$_addChild$2$through(node, new E._ImportedCssVisitor_visitCssStyleRule_closure2());
+    },
+    visitCssStylesheet$1: function(node) {
+      var t1, cur;
+      for (t1 = node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(this);
+      }
+    },
+    visitCssSupportsRule$1: function(node) {
+      return this._async_evaluate0$_visitor._async_evaluate0$_addChild$2$through(node, new E._ImportedCssVisitor_visitCssSupportsRule_closure2());
+    }
+  };
+  E._ImportedCssVisitor_visitCssAtRule_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._ImportedCssVisitor_visitCssMediaRule_closure2.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule_2._is(node))
+        t1 = this.hasBeenMerged && type$.legacy_CssMediaRule_2._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 8
+  };
+  E._ImportedCssVisitor_visitCssStyleRule_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E._ImportedCssVisitor_visitCssSupportsRule_closure2.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  E.EvaluateResult0.prototype = {};
+  E._ArgumentResults2.prototype = {};
+  O.AsyncImportCache0.prototype = {
+    canonicalize$4$baseImporter$baseUrl$forImport: function(url, baseImporter, baseUrl, forImport) {
+      return this.canonicalize$body$AsyncImportCache0(url, baseImporter, baseUrl, forImport);
+    },
+    canonicalize$body$AsyncImportCache0: function(url, baseImporter, baseUrl, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri),
+        $async$returnValue, $async$self = this, resolvedUrl, canonicalUrl;
+      var $async$canonicalize$4$baseImporter$baseUrl$forImport = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = baseImporter != null ? 3 : 4;
+              break;
+            case 3:
+              // then
+              resolvedUrl = baseUrl != null ? baseUrl.resolveUri$1(url) : url;
+              $async$goto = 5;
+              return P._asyncAwait($async$self._async_import_cache0$_canonicalize$3(baseImporter, resolvedUrl, forImport), $async$canonicalize$4$baseImporter$baseUrl$forImport);
+            case 5:
+              // returning from await.
+              canonicalUrl = $async$result;
+              if (canonicalUrl != null) {
+                $async$returnValue = new S.Tuple3(baseImporter, canonicalUrl, resolvedUrl, type$.Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri_2);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // join
+              $async$goto = 6;
+              return P._asyncAwait(B.putIfAbsentAsync0($async$self._async_import_cache0$_canonicalizeCache, new S.Tuple2(url, forImport, type$.Tuple2_of_legacy_Uri_and_legacy_bool), new O.AsyncImportCache_canonicalize_closure0($async$self, url, forImport), type$.legacy_Tuple2_of_legacy_Uri_and_legacy_bool, type$.legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri), $async$canonicalize$4$baseImporter$baseUrl$forImport);
+            case 6:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$canonicalize$4$baseImporter$baseUrl$forImport, $async$completer);
+    },
+    _async_import_cache0$_canonicalize$3: function(importer, url, forImport) {
+      return this._canonicalize$body$AsyncImportCache0(importer, url, forImport);
+    },
+    _canonicalize$body$AsyncImportCache0: function(importer, url, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Uri),
+        $async$returnValue, $async$self = this, result;
+      var $async$_async_import_cache0$_canonicalize$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(forImport ? B.inImportRule0(new O.AsyncImportCache__canonicalize_closure0(importer, url)) : importer.canonicalize$1(url), $async$_async_import_cache0$_canonicalize$3);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              if ((result == null ? null : result.get$scheme()) === "")
+                $async$self._async_import_cache0$_logger.warn$2$deprecation(0, "Importer " + H.S(importer) + " canonicalized " + url.toString$0(0) + " to " + H.S(result) + string$.x2e_Rela, true);
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_async_import_cache0$_canonicalize$3, $async$completer);
+    },
+    import$4$baseImporter$baseUrl$forImport: function(url, baseImporter, baseUrl, forImport) {
+      return this.import$body$AsyncImportCache0(url, baseImporter, baseUrl, forImport);
+    },
+    import$body$AsyncImportCache0: function(url, baseImporter, baseUrl, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet_2),
+        $async$returnValue, $async$self = this, t1, stylesheet, tuple;
+      var $async$import$4$baseImporter$baseUrl$forImport = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait($async$self.canonicalize$4$baseImporter$baseUrl$forImport(url, baseImporter, baseUrl, forImport), $async$import$4$baseImporter$baseUrl$forImport);
+            case 3:
+              // returning from await.
+              tuple = $async$result;
+              if (tuple == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t1 = tuple.item1;
+              $async$goto = 4;
+              return P._asyncAwait($async$self.importCanonical$3(t1, tuple.item2, tuple.item3), $async$import$4$baseImporter$baseUrl$forImport);
+            case 4:
+              // returning from await.
+              stylesheet = $async$result;
+              if (stylesheet == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              $async$returnValue = new S.Tuple2(t1, stylesheet, type$.Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet_2);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$import$4$baseImporter$baseUrl$forImport, $async$completer);
+    },
+    importCanonical$3: function(importer, canonicalUrl, originalUrl) {
+      return this.importCanonical$body$AsyncImportCache0(importer, canonicalUrl, originalUrl);
+    },
+    importCanonical$body$AsyncImportCache0: function(importer, canonicalUrl, originalUrl) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Stylesheet),
+        $async$returnValue, $async$self = this;
+      var $async$importCanonical$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              $async$goto = 3;
+              return P._asyncAwait(B.putIfAbsentAsync0($async$self._async_import_cache0$_importCache, canonicalUrl, new O.AsyncImportCache_importCanonical_closure0($async$self, importer, canonicalUrl, originalUrl), type$.legacy_Uri, type$.legacy_Stylesheet), $async$importCanonical$3);
+            case 3:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$importCanonical$3, $async$completer);
+    },
+    humanize$1: function(canonicalUrl) {
+      var t2, url,
+        t1 = this._async_import_cache0$_canonicalizeCache;
+      t1 = t1.get$values(t1);
+      t2 = H._instanceType(t1);
+      url = Y.minBy(new H.MappedIterable(new H.WhereIterable(t1, new O.AsyncImportCache_humanize_closure2(canonicalUrl), t2._eval$1("WhereIterable<Iterable.E>")), new O.AsyncImportCache_humanize_closure3(), t2._eval$1("MappedIterable<Iterable.E,Uri*>")), new O.AsyncImportCache_humanize_closure4(), type$.legacy_Uri, type$.dynamic);
+      if (url == null)
+        return canonicalUrl;
+      t1 = $.$get$url();
+      return url.resolve$1(X.ParsedPath_ParsedPath$parse(canonicalUrl.get$path(canonicalUrl), t1.style).get$basename());
+    }
+  };
+  O.AsyncImportCache_canonicalize_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri),
+        $async$returnValue, $async$self = this, t1, t2, t3, _i, importer, canonicalUrl;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.$this, t2 = $async$self.url, t3 = $async$self.forImport, _i = 0;
+            case 3:
+              // for condition
+              if (!false) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              importer = C.List_empty23[_i];
+              $async$goto = 6;
+              return P._asyncAwait(t1._async_import_cache0$_canonicalize$3(importer, t2, t3), $async$call$0);
+            case 6:
+              // returning from await.
+              canonicalUrl = $async$result;
+              if (canonicalUrl != null) {
+                $async$returnValue = new S.Tuple3(importer, canonicalUrl, t2, type$.Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri_2);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = null;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 307
+  };
+  O.AsyncImportCache__canonicalize_closure0.prototype = {
+    call$0: function() {
+      return this.importer.canonicalize$1(this.url);
+    },
+    $signature: 175
+  };
+  O.AsyncImportCache_importCanonical_closure0.prototype = {
+    call$0: function() {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Stylesheet),
+        $async$returnValue, $async$self = this, t2, t3, t4, t5, t1, result;
+      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = $async$self.canonicalUrl;
+              $async$goto = 3;
+              return P._asyncAwait($async$self.importer.load$1(0, t1), $async$call$0);
+            case 3:
+              // returning from await.
+              result = $async$result;
+              if (result == null) {
+                $async$returnValue = null;
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+              t2 = $async$self.$this;
+              t2._async_import_cache0$_resultsCache.$indexSet(0, t1, result);
+              t3 = result.contents;
+              t4 = result.syntax;
+              t5 = $async$self.originalUrl;
+              t1 = t5 == null ? t1 : t5.resolveUri$1(t1);
+              $async$returnValue = V.Stylesheet_Stylesheet$parse0(t3, t4, t2._async_import_cache0$_logger, t1);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$0, $async$completer);
+    },
+    $signature: 308
+  };
+  O.AsyncImportCache_humanize_closure2.prototype = {
+    call$1: function(tuple) {
+      var t1 = tuple == null ? null : tuple.item2;
+      return J.$eq$(t1, this.canonicalUrl);
+    },
+    $signature: 309
+  };
+  O.AsyncImportCache_humanize_closure3.prototype = {
+    call$1: function(tuple) {
+      return tuple.item3;
+    },
+    $signature: 310
+  };
+  O.AsyncImportCache_humanize_closure4.prototype = {
+    call$1: function(url) {
+      return J.get$length$asx(J.get$path$x(url));
+    },
+    $signature: 43
+  };
+  V.AtRootQueryParser0.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new V.AtRootQueryParser_parse_closure0(this));
+    }
+  };
+  V.AtRootQueryParser_parse_closure0.prototype = {
+    call$0: function() {
+      var include, atRules,
+        t1 = this.$this,
+        t2 = t1.scanner;
+      t2.expectChar$1(40);
+      t1.whitespace$0();
+      include = t1.scanIdentifier$1("with");
+      if (!include)
+        t1.expectIdentifier$2$name("without", '"with" or "without"');
+      t1.whitespace$0();
+      t2.expectChar$1(58);
+      t1.whitespace$0();
+      atRules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_String);
+      do {
+        atRules.add$1(0, t1.identifier$0().toLowerCase());
+        t1.whitespace$0();
+      } while (t1.lookingAtIdentifier$0());
+      t2.expectChar$1(41);
+      t2.expectDone$0();
+      return new V.AtRootQuery0(include, atRules, atRules.contains$1(0, "all"), atRules.contains$1(0, "rule"));
+    },
+    $signature: 125
+  };
+  V.AtRootQuery0.prototype = {
+    excludes$1: function(node) {
+      var t1, _this = this;
+      if (_this._at_root_query0$_all)
+        return !_this.include;
+      if (type$.legacy_CssStyleRule_2._is(node))
+        return _this._at_root_query0$_rule !== _this.include;
+      if (type$.legacy_CssMediaRule_2._is(node))
+        return _this.excludesName$1("media");
+      if (type$.legacy_CssSupportsRule_2._is(node))
+        return _this.excludesName$1("supports");
+      if (type$.legacy_CssAtRule_2._is(node)) {
+        t1 = node.name;
+        return _this.excludesName$1(t1.get$value(t1).toLowerCase());
+      }
+      return false;
+    },
+    excludesName$1: function($name) {
+      var t1 = this._at_root_query0$_all || this.names.contains$1(0, $name);
+      return t1 !== this.include;
+    }
+  };
+  V.AtRootRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitAtRootRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var buffer = new P.StringBuffer("@at-root "),
+        t1 = this.query;
+      if (t1 != null)
+        buffer._contents = "@at-root " + (t1.toString$0(0) + " ");
+      t1 = this.children;
+      return buffer.toString$0(0) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  U.ModifiableCssAtRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssAtRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      var _this = this;
+      return U.ModifiableCssAtRule$0(_this.name, _this.span, _this.isChildless, _this.value);
+    },
+    addChild$1: function(child) {
+      this.super$ModifiableCssParentNode$addChild0(child);
+    },
+    $isCssAtRule0: 1,
+    get$isChildless: function() {
+      return this.isChildless;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  U.AtRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitAtRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = "@" + this.name.toString$0(0),
+        buffer = new P.StringBuffer(t1),
+        t2 = this.value;
+      if (t2 != null)
+        buffer._contents = t1 + (" " + t2.toString$0(0));
+      t1 = this.children;
+      return t1 == null ? buffer.toString$0(0) + ";" : buffer.toString$0(0) + " {" + C.JSArray_methods.join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  N.AttributeSelector0.prototype = {
+    accept$1$1: function(visitor) {
+      var t2, _this = this,
+        t1 = visitor._buffer;
+      t1.writeCharCode$1(91);
+      t1.write$1(0, _this.name);
+      t2 = _this.op;
+      if (t2 != null) {
+        t1.write$1(0, t2);
+        t2 = _this.value;
+        if (G.Parser_isIdentifier0(t2) && !J.startsWith$1$s(t2, "--")) {
+          t1.write$1(0, t2);
+          t2 = _this.modifier;
+          if (t2 != null)
+            t1.writeCharCode$1(32);
+        } else {
+          visitor._serialize0$_visitQuotedString$1(t2);
+          t2 = _this.modifier;
+          if (t2 != null)
+            if (visitor._serialize0$_style !== C.OutputStyle_compressed0)
+              t1.writeCharCode$1(32);
+        }
+        if (t2 != null)
+          t1.write$1(0, t2);
+      }
+      t1.writeCharCode$1(93);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      return other instanceof N.AttributeSelector0 && other.name.$eq(0, _this.name) && other.op == _this.op && other.value == _this.value && other.modifier == _this.modifier;
+    },
+    get$hashCode: function(_) {
+      var _this = this,
+        t1 = _this.name;
+      return (C.JSString_methods.get$hashCode(t1.name) ^ J.get$hashCode$(t1.namespace) ^ J.get$hashCode$(_this.op) ^ J.get$hashCode$(_this.value) ^ J.get$hashCode$(_this.modifier)) >>> 0;
+    }
+  };
+  N.AttributeOperator0.prototype = {
+    toString$0: function(_) {
+      return this._attribute0$_text;
+    }
+  };
+  V.BinaryOperationExpression0.prototype = {
+    get$span: function() {
+      var right,
+        left = this.left;
+      for (; left instanceof V.BinaryOperationExpression0;)
+        left = left.left;
+      right = this.right;
+      for (; right instanceof V.BinaryOperationExpression0;)
+        right = right.right;
+      return B.spanForList0(H.setRuntimeTypeInfo([left, right], type$.JSArray_legacy_AstNode_2));
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitBinaryOperationExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t2, right, rightNeedsParens, _this = this,
+        left = _this.left,
+        leftNeedsParens = left instanceof V.BinaryOperationExpression0 && left.operator.precedence < _this.operator.precedence,
+        t1 = leftNeedsParens ? H.Primitives_stringFromCharCode(40) : "";
+      t1 += H.S(left);
+      if (leftNeedsParens)
+        t1 += H.Primitives_stringFromCharCode(41);
+      t2 = _this.operator;
+      t1 = t1 + H.Primitives_stringFromCharCode(32) + t2.operator + H.Primitives_stringFromCharCode(32);
+      right = _this.right;
+      rightNeedsParens = right instanceof V.BinaryOperationExpression0 && right.operator.precedence <= t2.precedence;
+      if (rightNeedsParens)
+        t1 += H.Primitives_stringFromCharCode(40);
+      t1 += H.S(right);
+      if (rightNeedsParens)
+        t1 += H.Primitives_stringFromCharCode(41);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1
+  };
+  V.BinaryOperator0.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  Z.BooleanExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitBooleanExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return String(this.value);
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Z.closure263.prototype = {
+    call$0: function() {
+      var $constructor = P.allowInterop(new Z._closure34());
+      B.injectSuperclass(C.SassBoolean_true, $constructor);
+      self.Object.defineProperty(C.SassBoolean_true.constructor, "name", {value: "SassBoolean"});
+      B.forwardToString($constructor);
+      $constructor.prototype.getValue = P.allowInteropCaptureThis(new Z._closure35());
+      $constructor.TRUE = C.SassBoolean_true;
+      $constructor.FALSE = C.SassBoolean_false;
+      return $constructor;
+    },
+    $signature: 129
+  };
+  Z._closure34.prototype = {
+    call$1: function(_) {
+      throw H.wrapException("new sass.types.Boolean() isn't allowed.\nUse sass.types.Boolean.TRUE or sass.types.Boolean.FALSE instead.");
+    },
+    call$0: function() {
+      return this.call$1(null);
+    },
+    "call*": "call$1",
+    $requiredArgCount: 0,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 96
+  };
+  Z._closure35.prototype = {
+    call$1: function(thisArg) {
+      return thisArg === C.SassBoolean_true;
+    },
+    $signature: 23
+  };
+  Z.SassBoolean0.prototype = {
+    get$isTruthy: function() {
+      return this.value;
+    },
+    accept$1$1: function(visitor) {
+      return visitor._buffer.write$1(0, String(this.value));
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unaryNot$0: function() {
+      return this.value ? C.SassBoolean_false : C.SassBoolean_true;
+    }
+  };
+  Q.BuiltInCallable0.prototype = {
+    callbackFor$2: function(positional, names) {
+      var t1, t2, fuzzyMatch, minMismatchDistance, _i, overload, t3, mismatchDistance, t4;
+      for (t1 = this._built_in$_overloads, t2 = t1.length, fuzzyMatch = null, minMismatchDistance = null, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        overload = t1[_i];
+        t3 = overload.item1;
+        if (t3.matches$2(positional, names))
+          return overload;
+        mismatchDistance = t3.$arguments.length - positional;
+        if (minMismatchDistance != null) {
+          t3 = Math.abs(mismatchDistance);
+          t4 = Math.abs(minMismatchDistance);
+          if (t3 > t4)
+            continue;
+          if (t3 === t4 && mismatchDistance < 0)
+            continue;
+        }
+        minMismatchDistance = mismatchDistance;
+        fuzzyMatch = overload;
+      }
+      return fuzzyMatch;
+    },
+    withName$1: function($name) {
+      return new Q.BuiltInCallable0($name, this._built_in$_overloads);
+    },
+    $isAsyncCallable0: 1,
+    $isAsyncBuiltInCallable0: 1,
+    $isCallable0: 1,
+    get$name: function(receiver) {
+      return this.name;
+    }
+  };
+  Q.BuiltInCallable$mixin_closure0.prototype = {
+    call$1: function($arguments) {
+      this.callback.call$1($arguments);
+      return null;
+    },
+    $signature: 98
+  };
+  Q.BuiltInModule0.prototype = {
+    get$upstream: function() {
+      return C.List_empty14;
+    },
+    get$variableNodes: function() {
+      return C.Map_empty7;
+    },
+    get$extender: function() {
+      return C.C_EmptyExtender0;
+    },
+    get$css: function(_) {
+      return new V.CssStylesheet0(C.List_empty12, Y.SourceFile$decoded(C.List_empty1, this.url).span$2(0, 0));
+    },
+    get$transitivelyContainsCss: function() {
+      return false;
+    },
+    get$transitivelyContainsExtensions: function() {
+      return false;
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      if (!this.variables.containsKey$1($name))
+        throw H.wrapException(E.SassScriptException$0("Undefined variable."));
+      throw H.wrapException(E.SassScriptException$0("Cannot modify built-in variable."));
+    },
+    variableIdentity$1: function($name) {
+      return this;
+    },
+    cloneCss$0: function() {
+      return this;
+    },
+    $isModule0: 1,
+    get$url: function() {
+      return this.url;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    },
+    get$variables: function() {
+      return this.variables;
+    }
+  };
+  M.CallableDeclaration0.prototype = {
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Y.Chokidar0.prototype = {};
+  Y.ChokidarOptions0.prototype = {};
+  Y.ChokidarWatcher0.prototype = {};
+  X.ClassSelector0.prototype = {
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof X.ClassSelector0 && other.name === this.name;
+    },
+    accept$1$1: function(visitor) {
+      var t1 = visitor._buffer;
+      t1.writeCharCode$1(46);
+      t1.write$1(0, this.name);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    addSuffix$1: function(suffix) {
+      return new X.ClassSelector0(this.name + suffix);
+    },
+    get$hashCode: function(_) {
+      return C.JSString_methods.get$hashCode(this.name);
+    }
+  };
+  V._CloneCssVisitor0.prototype = {
+    visitCssAtRule$1: function(node) {
+      var t1 = node.isChildless,
+        rule = U.ModifiableCssAtRule$0(node.name, node.span, t1, node.value);
+      return t1 ? rule : this._clone_css$_visitChildren$2(rule, node);
+    },
+    visitCssComment$1: function(node) {
+      return new R.ModifiableCssComment0(node.text, node.span);
+    },
+    visitCssDeclaration$1: function(node) {
+      return L.ModifiableCssDeclaration$0(node.name, node.value, node.span, node.parsedAsCustomProperty, node.valueSpanForMap);
+    },
+    visitCssImport$1: function(node) {
+      return F.ModifiableCssImport$0(node.url, node.span, node.media, node.supports);
+    },
+    visitCssKeyframeBlock$1: function(node) {
+      return this._clone_css$_visitChildren$2(U.ModifiableCssKeyframeBlock$0(node.selector, node.span), node);
+    },
+    visitCssMediaRule$1: function(node) {
+      return this._clone_css$_visitChildren$2(G.ModifiableCssMediaRule$0(node.queries, node.span), node);
+    },
+    visitCssStyleRule$1: function(node) {
+      var newSelector = this._clone_css$_oldToNewSelectors.$index(0, node.selector);
+      if (newSelector == null)
+        throw H.wrapException(P.StateError$(string$.The_Ex));
+      return this._clone_css$_visitChildren$2(X.ModifiableCssStyleRule$0(newSelector, node.span, node.originalSelector), node);
+    },
+    visitCssStylesheet$1: function(node) {
+      return this._clone_css$_visitChildren$2(V.ModifiableCssStylesheet$0(node.get$span()), node);
+    },
+    visitCssSupportsRule$1: function(node) {
+      return this._clone_css$_visitChildren$2(B.ModifiableCssSupportsRule$0(node.condition, node.span), node);
+    },
+    _clone_css$_visitChildren$1$2: function(newParent, oldParent) {
+      var t1, t2, newChild;
+      for (t1 = J.get$iterator$ax(oldParent.get$children(oldParent)); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        newChild = t2.accept$1(this);
+        newChild.isGroupEnd = t2.get$isGroupEnd();
+        newParent.addChild$1(newChild);
+      }
+      return newParent;
+    },
+    _clone_css$_visitChildren$2: function(newParent, oldParent) {
+      return this._clone_css$_visitChildren$1$2(newParent, oldParent, type$.legacy_ModifiableCssParentNode_2);
+    }
+  };
+  K.ColorExpression0.prototype = {
+    get$span: function() {
+      return this.value.originalSpan;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitColorExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return N.serializeValue(this.value, true, true);
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1
+  };
+  K.closure159.prototype = {
+    call$1: function($arguments) {
+      return K._rgb0("rgb", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure160.prototype = {
+    call$1: function($arguments) {
+      return K._rgb0("rgb", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure161.prototype = {
+    call$1: function($arguments) {
+      return K._rgbTwoArg0("rgb", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure162.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels0("rgb", H.setRuntimeTypeInfo(["$red", "$green", "$blue"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      return parsed instanceof D.SassString0 ? parsed : K._rgb0("rgb", type$.legacy_List_legacy_Value_2._as(parsed));
+    },
+    $signature: 3
+  };
+  K.closure163.prototype = {
+    call$1: function($arguments) {
+      return K._rgb0("rgba", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure164.prototype = {
+    call$1: function($arguments) {
+      return K._rgb0("rgba", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure165.prototype = {
+    call$1: function($arguments) {
+      return K._rgbTwoArg0("rgba", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure166.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels0("rgba", H.setRuntimeTypeInfo(["$red", "$green", "$blue"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      return parsed instanceof D.SassString0 ? parsed : K._rgb0("rgba", type$.legacy_List_legacy_Value_2._as(parsed));
+    },
+    $signature: 3
+  };
+  K.closure167.prototype = {
+    call$1: function($arguments) {
+      var color, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        weight = t1.$index($arguments, 1).assertNumber$1("weight");
+      if (t1.$index($arguments, 0) instanceof T.SassNumber0) {
+        if (weight.value !== 100 || !weight.hasUnit$1("%"))
+          throw H.wrapException(string$.Only_oa);
+        return K._functionString0("invert", t1.take$1($arguments, 1));
+      }
+      color = t1.$index($arguments, 0).assertColor$1("color");
+      t1 = color.get$red();
+      t2 = color.get$green();
+      return K._mixColors0(color.changeRgb$3$blue$green$red(255 - color.get$blue(), 255 - t2, 255 - t1), color, weight);
+    },
+    $signature: 3
+  };
+  K.closure168.prototype = {
+    call$1: function($arguments) {
+      return K._hsl0("hsl", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure169.prototype = {
+    call$1: function($arguments) {
+      return K._hsl0("hsl", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure170.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0).get$isVar() || t1.$index($arguments, 1).get$isVar())
+        return K._functionString0("hsl", $arguments);
+      else
+        throw H.wrapException(E.SassScriptException$0("Missing argument $lightness."));
+    },
+    $signature: 17
+  };
+  K.closure171.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels0("hsl", H.setRuntimeTypeInfo(["$hue", "$saturation", "$lightness"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      return parsed instanceof D.SassString0 ? parsed : K._hsl0("hsl", type$.legacy_List_legacy_Value_2._as(parsed));
+    },
+    $signature: 3
+  };
+  K.closure172.prototype = {
+    call$1: function($arguments) {
+      return K._hsl0("hsla", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure173.prototype = {
+    call$1: function($arguments) {
+      return K._hsl0("hsla", $arguments);
+    },
+    $signature: 3
+  };
+  K.closure174.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0).get$isVar() || t1.$index($arguments, 1).get$isVar())
+        return K._functionString0("hsla", $arguments);
+      else
+        throw H.wrapException(E.SassScriptException$0("Missing argument $lightness."));
+    },
+    $signature: 17
+  };
+  K.closure175.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels0("hsla", H.setRuntimeTypeInfo(["$hue", "$saturation", "$lightness"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      return parsed instanceof D.SassString0 ? parsed : K._hsl0("hsla", type$.legacy_List_legacy_Value_2._as(parsed));
+    },
+    $signature: 3
+  };
+  K.closure176.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0) instanceof T.SassNumber0)
+        return K._functionString0("grayscale", $arguments);
+      return t1.$index($arguments, 0).assertColor$1("color").changeHsl$1$saturation(0);
+    },
+    $signature: 3
+  };
+  K.closure177.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        degrees = t1.$index($arguments, 1).assertNumber$1("degrees");
+      K._checkAngle0(degrees, null);
+      return color.changeHsl$1$hue(color.get$hue() + degrees.value);
+    },
+    $signature: 29
+  };
+  K.closure178.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        amount = t1.$index($arguments, 1).assertNumber$1("amount");
+      return color.changeHsl$1$lightness(C.JSNumber_methods.clamp$2(color.get$lightness() + amount.valueInRange$3(0, 100, "amount"), 0, 100));
+    },
+    $signature: 29
+  };
+  K.closure179.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        amount = t1.$index($arguments, 1).assertNumber$1("amount");
+      return color.changeHsl$1$lightness(C.JSNumber_methods.clamp$2(color.get$lightness() - amount.valueInRange$3(0, 100, "amount"), 0, 100));
+    },
+    $signature: 29
+  };
+  K.closure180.prototype = {
+    call$1: function($arguments) {
+      return new D.SassString0("saturate(" + N.serializeValue(J.$index$asx($arguments, 0).assertNumber$1("amount"), false, true) + ")", false);
+    },
+    $signature: 17
+  };
+  K.closure181.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        amount = t1.$index($arguments, 1).assertNumber$1("amount");
+      return color.changeHsl$1$saturation(C.JSNumber_methods.clamp$2(color.get$saturation() + amount.valueInRange$3(0, 100, "amount"), 0, 100));
+    },
+    $signature: 29
+  };
+  K.closure182.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        color = t1.$index($arguments, 0).assertColor$1("color"),
+        amount = t1.$index($arguments, 1).assertNumber$1("amount");
+      return color.changeHsl$1$saturation(C.JSNumber_methods.clamp$2(color.get$saturation() - amount.valueInRange$3(0, 100, "amount"), 0, 100));
+    },
+    $signature: 29
+  };
+  K.closure183.prototype = {
+    call$1: function($arguments) {
+      var color,
+        argument = J.$index$asx($arguments, 0);
+      if (argument instanceof D.SassString0 && !argument.hasQuotes && J.contains$1$asx(argument.text, $.$get$_microsoftFilterStart0()))
+        return K._functionString0("alpha", $arguments);
+      color = argument.assertColor$1("color");
+      return new N.UnitlessSassNumber0(color.alpha, null);
+    },
+    $signature: 3
+  };
+  K.closure184.prototype = {
+    call$1: function($arguments) {
+      var t1,
+        argList = J.$index$asx($arguments, 0).get$asList();
+      if (argList.length !== 0 && C.JSArray_methods.every$1(argList, new K._closure23()))
+        return K._functionString0("alpha", $arguments);
+      t1 = argList.length;
+      if (t1 === 0)
+        throw H.wrapException(E.SassScriptException$0("Missing argument $color."));
+      else
+        throw H.wrapException(E.SassScriptException$0("Only 1 argument allowed, but " + t1 + " were passed."));
+    },
+    $signature: 17
+  };
+  K._closure23.prototype = {
+    call$1: function(argument) {
+      return argument instanceof D.SassString0 && !argument.hasQuotes && J.contains$1$asx(argument.text, $.$get$_microsoftFilterStart0());
+    },
+    $signature: 55
+  };
+  K.closure185.prototype = {
+    call$1: function($arguments) {
+      var color,
+        t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0) instanceof T.SassNumber0)
+        return K._functionString0("opacity", $arguments);
+      color = t1.$index($arguments, 0).assertColor$1("color");
+      return new N.UnitlessSassNumber0(color.alpha, null);
+    },
+    $signature: 3
+  };
+  K.closure214.prototype = {
+    call$1: function($arguments) {
+      var result, color, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        weight = t1.$index($arguments, 1).assertNumber$1("weight");
+      if (t1.$index($arguments, 0) instanceof T.SassNumber0) {
+        if (weight.value !== 100 || !weight.hasUnit$1("%"))
+          throw H.wrapException(string$.Only_oa);
+        result = K._functionString0("invert", t1.take$1($arguments, 1));
+        N.warn0("Passing a number (" + H.S(t1.$index($arguments, 0)) + string$.x29x20to_ci + result.toString$0(0), true);
+        return result;
+      }
+      color = t1.$index($arguments, 0).assertColor$1("color");
+      t1 = color.get$red();
+      t2 = color.get$green();
+      return K._mixColors0(color.changeRgb$3$blue$green$red(255 - color.get$blue(), 255 - t2, 255 - t1), color, weight);
+    },
+    $signature: 3
+  };
+  K.closure215.prototype = {
+    call$1: function($arguments) {
+      var result,
+        t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0) instanceof T.SassNumber0) {
+        result = K._functionString0("grayscale", t1.take$1($arguments, 1));
+        N.warn0("Passing a number (" + H.S(t1.$index($arguments, 0)) + string$.x29x20to_cg + result.toString$0(0), true);
+        return result;
+      }
+      return t1.$index($arguments, 0).assertColor$1("color").changeHsl$1$saturation(0);
+    },
+    $signature: 3
+  };
+  K.closure216.prototype = {
+    call$1: function($arguments) {
+      return K._hwb0($arguments);
+    },
+    $signature: 3
+  };
+  K.closure217.prototype = {
+    call$1: function($arguments) {
+      var parsed = K._parseChannels0("hwb", H.setRuntimeTypeInfo(["$hue", "$whiteness", "$blackness"], type$.JSArray_legacy_String), J.get$first$ax($arguments));
+      if (parsed instanceof D.SassString0)
+        throw H.wrapException(E.SassScriptException$0('Expected numeric channels, got "' + parsed.toString$0(0) + '".'));
+      else
+        return K._hwb0(type$.legacy_List_legacy_Value_2._as(parsed));
+    },
+    $signature: 3
+  };
+  K.closure218.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$whiteness();
+      return new L.SingleUnitSassNumber0("%", t1, null);
+    },
+    $signature: 10
+  };
+  K.closure219.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$blackness();
+      return new L.SingleUnitSassNumber0("%", t1, null);
+    },
+    $signature: 10
+  };
+  K.closure220.prototype = {
+    call$1: function($arguments) {
+      var result, color,
+        argument = J.$index$asx($arguments, 0);
+      if (argument instanceof D.SassString0 && !argument.hasQuotes && J.contains$1$asx(argument.text, $.$get$_microsoftFilterStart0())) {
+        result = K._functionString0("alpha", $arguments);
+        N.warn0(string$.Using_ + result.toString$0(0), true);
+        return result;
+      }
+      color = argument.assertColor$1("color");
+      return new N.UnitlessSassNumber0(color.alpha, null);
+    },
+    $signature: 3
+  };
+  K.closure221.prototype = {
+    call$1: function($arguments) {
+      var result,
+        t1 = J.getInterceptor$asx($arguments);
+      if (C.JSArray_methods.every$1(t1.$index($arguments, 0).get$asList(), new K._closure28())) {
+        result = K._functionString0("alpha", $arguments);
+        N.warn0(string$.Using_ + result.toString$0(0), true);
+        return result;
+      }
+      throw H.wrapException(E.SassScriptException$0("Only 1 argument allowed, but " + t1.get$length($arguments) + " were passed."));
+    },
+    $signature: 17
+  };
+  K._closure28.prototype = {
+    call$1: function(argument) {
+      return argument instanceof D.SassString0 && !argument.hasQuotes && J.contains$1$asx(argument.text, $.$get$_microsoftFilterStart0());
+    },
+    $signature: 55
+  };
+  K.closure222.prototype = {
+    call$1: function($arguments) {
+      var result, color,
+        t1 = J.getInterceptor$asx($arguments);
+      if (t1.$index($arguments, 0) instanceof T.SassNumber0) {
+        result = K._functionString0("opacity", $arguments);
+        N.warn0("Passing a number (" + H.S(t1.$index($arguments, 0)) + string$.x20to_co + result.toString$0(0), true);
+        return result;
+      }
+      color = t1.$index($arguments, 0).assertColor$1("color");
+      return new N.UnitlessSassNumber0(color.alpha, null);
+    },
+    $signature: 3
+  };
+  K.closure197.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$red();
+      return new N.UnitlessSassNumber0(t1, null);
+    },
+    $signature: 10
+  };
+  K.closure196.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$green();
+      return new N.UnitlessSassNumber0(t1, null);
+    },
+    $signature: 10
+  };
+  K.closure195.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$blue();
+      return new N.UnitlessSassNumber0(t1, null);
+    },
+    $signature: 10
+  };
+  K.closure194.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return K._mixColors0(t1.$index($arguments, 0).assertColor$1("color1"), t1.$index($arguments, 1).assertColor$1("color2"), t1.$index($arguments, 2).assertNumber$1("weight"));
+    },
+    $signature: 29
+  };
+  K.closure193.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$hue();
+      return new L.SingleUnitSassNumber0("deg", t1, null);
+    },
+    $signature: 10
+  };
+  K.closure192.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$saturation();
+      return new L.SingleUnitSassNumber0("%", t1, null);
+    },
+    $signature: 10
+  };
+  K.closure191.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.get$first$ax($arguments).assertColor$1("color").get$lightness();
+      return new L.SingleUnitSassNumber0("%", t1, null);
+    },
+    $signature: 10
+  };
+  K.closure190.prototype = {
+    call$1: function($arguments) {
+      var color = J.$index$asx($arguments, 0).assertColor$1("color");
+      return color.changeHsl$1$hue(color.get$hue() + 180);
+    },
+    $signature: 29
+  };
+  K.closure188.prototype = {
+    call$1: function($arguments) {
+      return K._updateComponents0($arguments, true, false, false);
+    },
+    $signature: 29
+  };
+  K.closure187.prototype = {
+    call$1: function($arguments) {
+      return K._updateComponents0($arguments, false, false, true);
+    },
+    $signature: 29
+  };
+  K.closure186.prototype = {
+    call$1: function($arguments) {
+      return K._updateComponents0($arguments, false, true, false);
+    },
+    $signature: 29
+  };
+  K.closure189.prototype = {
+    call$1: function($arguments) {
+      var color = J.$index$asx($arguments, 0).assertColor$1("color"),
+        t1 = new K.closure_hexString0();
+      return new D.SassString0("#" + H.S(t1.call$1(T.fuzzyRound0(color.alpha * 255))) + H.S(t1.call$1(color.get$red())) + H.S(t1.call$1(color.get$green())) + H.S(t1.call$1(color.get$blue())), false);
+    },
+    $signature: 17
+  };
+  K.closure_hexString0.prototype = {
+    call$1: function(component) {
+      return C.JSString_methods.padLeft$2(J.toRadixString$1$n(component, 16), 2, "0").toUpperCase();
+    },
+    $signature: 84
+  };
+  K._updateComponents_getParam0.prototype = {
+    call$4$assertPercent$checkPercent: function($name, max, assertPercent, checkPercent) {
+      var t2,
+        t1 = this.keywords.remove$1(0, $name),
+        number = t1 == null ? null : t1.assertNumber$1($name);
+      if (number == null)
+        return null;
+      t1 = this.scale;
+      t2 = !t1;
+      if (t2 && checkPercent)
+        K._checkPercent0(number, $name);
+      if (!t2 || assertPercent)
+        number.assertUnit$2("%", $name);
+      if (t1)
+        max = 100;
+      return number.valueInRange$3(this.change ? 0 : -max, max, $name);
+    },
+    call$2: function($name, max) {
+      return this.call$4$assertPercent$checkPercent($name, max, false, false);
+    },
+    call$3$checkPercent: function($name, max, checkPercent) {
+      return this.call$4$assertPercent$checkPercent($name, max, false, checkPercent);
+    },
+    call$3$assertPercent: function($name, max, assertPercent) {
+      return this.call$4$assertPercent$checkPercent($name, max, assertPercent, false);
+    },
+    $signature: 141
+  };
+  K._updateComponents_closure0.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  K._updateComponents_updateValue0.prototype = {
+    call$3: function(current, param, max) {
+      var t1;
+      if (param == null)
+        return current;
+      if (this.change)
+        return param;
+      if (this.adjust)
+        return C.JSNumber_methods.clamp$2(current + param, 0, max);
+      t1 = param > 0 ? max - current : current;
+      return current + t1 * (param / 100);
+    },
+    $signature: 142
+  };
+  K._updateComponents_updateRgb0.prototype = {
+    call$2: function(current, param) {
+      return T.fuzzyRound0(this.updateValue.call$3(current, param, 255));
+    },
+    $signature: 143
+  };
+  K._functionString_closure0.prototype = {
+    call$1: function(argument) {
+      argument.toString;
+      return N.serializeValue(argument, false, true);
+    },
+    $signature: 318
+  };
+  K._removedColorFunction_closure0.prototype = {
+    call$1: function($arguments) {
+      var t1 = this.name,
+        t2 = J.getInterceptor$asx($arguments),
+        t3 = "The function " + t1 + string$.x28__isn + H.S(t2.$index($arguments, 0)) + ", $" + this.argument + ": ";
+      throw H.wrapException(E.SassScriptException$0(t3 + (this.negative ? "-" : "") + H.S(t2.$index($arguments, 1)) + string$.x29x0a_Mor + t1));
+    },
+    $signature: 98
+  };
+  K._removeUnits_closure1.prototype = {
+    call$1: function(unit) {
+      return " * 1" + H.S(unit);
+    },
+    $signature: 4
+  };
+  K._removeUnits_closure2.prototype = {
+    call$1: function(unit) {
+      return " / 1" + H.S(unit);
+    },
+    $signature: 4
+  };
+  K._parseChannels_closure0.prototype = {
+    call$1: function(value) {
+      return value.get$isVar();
+    },
+    $signature: 55
+  };
+  K._NodeSassColor.prototype = {};
+  K.closure253.prototype = {
+    call$6: function(thisArg, redOrArgb, green, blue, alpha, dartValue) {
+      var red, t1, t2, t3, t4;
+      if (dartValue != null) {
+        J.set$dartValue$x(thisArg, dartValue);
+        return;
+      }
+      if (green == null) {
+        H._asIntS(redOrArgb);
+        alpha = C.JSInt_methods._shrOtherPositive$1(redOrArgb, 24) / 255;
+        red = C.JSInt_methods.$mod(C.JSInt_methods._shrOtherPositive$1(redOrArgb, 16), 256);
+        green = C.JSInt_methods.$mod(C.JSInt_methods._shrOtherPositive$1(redOrArgb, 8), 256);
+        blue = C.JSInt_methods.$mod(redOrArgb, 256);
+      } else
+        red = redOrArgb;
+      t1 = C.JSNumber_methods.round$0(J.clamp$2$n(red, 0, 255));
+      t2 = C.JSNumber_methods.round$0(C.JSNumber_methods.clamp$2(green, 0, 255));
+      t3 = C.JSNumber_methods.round$0(J.clamp$2$n(blue, 0, 255));
+      t4 = alpha == null ? null : C.JSNumber_methods.clamp$2(alpha, 0, 1);
+      J.set$dartValue$x(thisArg, K.SassColor$rgb0(t1, t2, t3, t4 == null ? 1 : t4, null));
+    },
+    call$2: function(thisArg, redOrArgb) {
+      return this.call$6(thisArg, redOrArgb, null, null, null, null);
+    },
+    call$3: function(thisArg, redOrArgb, green) {
+      return this.call$6(thisArg, redOrArgb, green, null, null, null);
+    },
+    call$4: function(thisArg, redOrArgb, green, blue) {
+      return this.call$6(thisArg, redOrArgb, green, blue, null, null);
+    },
+    call$5: function(thisArg, redOrArgb, green, blue, alpha) {
+      return this.call$6(thisArg, redOrArgb, green, blue, alpha, null);
+    },
+    "call*": "call$6",
+    $requiredArgCount: 2,
+    $defaultValues: function() {
+      return [null, null, null, null];
+    },
+    $signature: 479
+  };
+  K.closure254.prototype = {
+    call$1: function(thisArg) {
+      return J.get$dartValue$x(thisArg).get$red();
+    },
+    $signature: 95
+  };
+  K.closure255.prototype = {
+    call$1: function(thisArg) {
+      return J.get$dartValue$x(thisArg).get$green();
+    },
+    $signature: 95
+  };
+  K.closure256.prototype = {
+    call$1: function(thisArg) {
+      return J.get$dartValue$x(thisArg).get$blue();
+    },
+    $signature: 95
+  };
+  K.closure257.prototype = {
+    call$1: function(thisArg) {
+      return J.get$dartValue$x(thisArg).alpha;
+    },
+    $signature: 321
+  };
+  K.closure258.prototype = {
+    call$2: function(thisArg, value) {
+      var t1 = J.getInterceptor$x(thisArg);
+      t1.set$dartValue(thisArg, t1.get$dartValue(thisArg).changeRgb$1$red(C.JSNumber_methods.round$0(J.clamp$2$n(value, 0, 255))));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 75
+  };
+  K.closure259.prototype = {
+    call$2: function(thisArg, value) {
+      var t1 = J.getInterceptor$x(thisArg);
+      t1.set$dartValue(thisArg, t1.get$dartValue(thisArg).changeRgb$1$green(C.JSNumber_methods.round$0(J.clamp$2$n(value, 0, 255))));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 75
+  };
+  K.closure260.prototype = {
+    call$2: function(thisArg, value) {
+      var t1 = J.getInterceptor$x(thisArg);
+      t1.set$dartValue(thisArg, t1.get$dartValue(thisArg).changeRgb$1$blue(C.JSNumber_methods.round$0(J.clamp$2$n(value, 0, 255))));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 75
+  };
+  K.closure261.prototype = {
+    call$2: function(thisArg, value) {
+      var t1 = J.getInterceptor$x(thisArg);
+      t1.set$dartValue(thisArg, t1.get$dartValue(thisArg).changeRgb$1$alpha(J.clamp$2$n(value, 0, 1)));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 75
+  };
+  K.closure262.prototype = {
+    call$1: function(thisArg) {
+      return J.toString$0$(J.get$dartValue$x(thisArg));
+    },
+    $signature: 323
+  };
+  K.SassColor0.prototype = {
+    get$red: function() {
+      if (this._color0$_red == null)
+        this._color0$_hslToRgb$0();
+      return this._color0$_red;
+    },
+    get$green: function() {
+      if (this._color0$_green == null)
+        this._color0$_hslToRgb$0();
+      return this._color0$_green;
+    },
+    get$blue: function() {
+      if (this._color0$_blue == null)
+        this._color0$_hslToRgb$0();
+      return this._color0$_blue;
+    },
+    get$hue: function() {
+      if (this._color0$_hue == null)
+        this._color0$_rgbToHsl$0();
+      return this._color0$_hue;
+    },
+    get$saturation: function() {
+      if (this._color0$_saturation == null)
+        this._color0$_rgbToHsl$0();
+      return this._color0$_saturation;
+    },
+    get$lightness: function() {
+      if (this._color0$_lightness == null)
+        this._color0$_rgbToHsl$0();
+      return this._color0$_lightness;
+    },
+    get$whiteness: function() {
+      var t1 = this.get$red(),
+        t2 = this.get$green();
+      return Math.min(Math.min(H.checkNum(t1), H.checkNum(t2)), H.checkNum(this.get$blue())) / 255 * 100;
+    },
+    get$blackness: function() {
+      var t1 = this.get$red(),
+        t2 = this.get$green();
+      return 100 - Math.max(Math.max(H.checkNum(t1), H.checkNum(t2)), H.checkNum(this.get$blue())) / 255 * 100;
+    },
+    get$original: function() {
+      var t1 = this.originalSpan;
+      return t1 == null ? null : P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1.file._decodedChars, t1._file$_start, t1._end), 0, null);
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitColor$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertColor$1: function($name) {
+      return this;
+    },
+    changeRgb$4$alpha$blue$green$red: function(alpha, blue, green, red) {
+      var _this = this,
+        t1 = red == null ? _this.get$red() : red,
+        t2 = green == null ? _this.get$green() : green,
+        t3 = blue == null ? _this.get$blue() : blue;
+      return K.SassColor$rgb0(t1, t2, t3, alpha == null ? _this.alpha : alpha, null);
+    },
+    changeRgb$3$blue$green$red: function(blue, green, red) {
+      return this.changeRgb$4$alpha$blue$green$red(null, blue, green, red);
+    },
+    changeRgb$1$alpha: function(alpha) {
+      return this.changeRgb$4$alpha$blue$green$red(alpha, null, null, null);
+    },
+    changeRgb$1$blue: function(blue) {
+      return this.changeRgb$4$alpha$blue$green$red(null, blue, null, null);
+    },
+    changeRgb$1$green: function(green) {
+      return this.changeRgb$4$alpha$blue$green$red(null, null, green, null);
+    },
+    changeRgb$1$red: function(red) {
+      return this.changeRgb$4$alpha$blue$green$red(null, null, null, red);
+    },
+    changeHsl$4$alpha$hue$lightness$saturation: function(alpha, hue, lightness, saturation) {
+      var _this = this,
+        t1 = hue == null ? _this.get$hue() : hue,
+        t2 = saturation == null ? _this.get$saturation() : saturation,
+        t3 = lightness == null ? _this.get$lightness() : lightness;
+      return K.SassColor$hsl0(t1, t2, t3, alpha == null ? _this.alpha : alpha);
+    },
+    changeHsl$1$saturation: function(saturation) {
+      return this.changeHsl$4$alpha$hue$lightness$saturation(null, null, null, saturation);
+    },
+    changeHsl$1$lightness: function(lightness) {
+      return this.changeHsl$4$alpha$hue$lightness$saturation(null, null, lightness, null);
+    },
+    changeHsl$1$hue: function(hue) {
+      return this.changeHsl$4$alpha$hue$lightness$saturation(null, hue, null, null);
+    },
+    changeAlpha$1: function(alpha) {
+      var _this = this;
+      return new K.SassColor0(_this._color0$_red, _this._color0$_green, _this._color0$_blue, _this._color0$_hue, _this._color0$_saturation, _this._color0$_lightness, T.fuzzyAssertRange0(alpha, 0, 1, "alpha"), null);
+    },
+    plus$1: function(other) {
+      if (!(other instanceof T.SassNumber0) && !(other instanceof K.SassColor0))
+        return this.super$Value$plus0(other);
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " + " + H.S(other) + '".'));
+    },
+    minus$1: function(other) {
+      if (!(other instanceof T.SassNumber0) && !(other instanceof K.SassColor0))
+        return this.super$Value$minus0(other);
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " - " + H.S(other) + '".'));
+    },
+    dividedBy$1: function(other) {
+      if (!(other instanceof T.SassNumber0) && !(other instanceof K.SassColor0))
+        return this.super$Value$dividedBy0(other);
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " / " + H.S(other) + '".'));
+    },
+    modulo$1: function(other) {
+      return H.throwExpression(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " % " + H.S(other) + '".'));
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      return other instanceof K.SassColor0 && other.get$red() == _this.get$red() && other.get$green() == _this.get$green() && other.get$blue() == _this.get$blue() && other.alpha === _this.alpha;
+    },
+    get$hashCode: function(_) {
+      var _this = this;
+      return J.get$hashCode$(_this.get$red()) ^ J.get$hashCode$(_this.get$green()) ^ J.get$hashCode$(_this.get$blue()) ^ C.JSNumber_methods.get$hashCode(_this.alpha);
+    },
+    _color0$_rgbToHsl$0: function() {
+      var t2, t3, _this = this,
+        scaledRed = _this.get$red() / 255,
+        scaledGreen = _this.get$green() / 255,
+        scaledBlue = _this.get$blue() / 255,
+        max = Math.max(Math.max(scaledRed, scaledGreen), scaledBlue),
+        min = Math.min(Math.min(scaledRed, scaledGreen), scaledBlue),
+        delta = max - min,
+        t1 = max === min;
+      if (t1)
+        _this._color0$_hue = 0;
+      else if (max === scaledRed)
+        _this._color0$_hue = C.JSDouble_methods.$mod(60 * (scaledGreen - scaledBlue) / delta, 360);
+      else if (max === scaledGreen)
+        _this._color0$_hue = C.JSNumber_methods.$mod(120 + 60 * (scaledBlue - scaledRed) / delta, 360);
+      else if (max === scaledBlue)
+        _this._color0$_hue = C.JSNumber_methods.$mod(240 + 60 * (scaledRed - scaledGreen) / delta, 360);
+      t2 = max + min;
+      t3 = 50 * t2;
+      _this._color0$_lightness = t3;
+      if (t1)
+        _this._color0$_saturation = 0;
+      else {
+        t1 = 100 * delta;
+        if (t3 < 50)
+          _this._color0$_saturation = t1 / t2;
+        else
+          _this._color0$_saturation = t1 / (2 - max - min);
+      }
+    },
+    _color0$_hslToRgb$0: function() {
+      var _this = this,
+        scaledHue = _this.get$hue() / 360,
+        scaledSaturation = _this.get$saturation() / 100,
+        scaledLightness = _this.get$lightness() / 100,
+        m2 = scaledLightness <= 0.5 ? scaledLightness * (scaledSaturation + 1) : scaledLightness + scaledSaturation - scaledLightness * scaledSaturation,
+        m1 = scaledLightness * 2 - m2;
+      _this._color0$_red = T.fuzzyRound0(K.SassColor__hueToRgb0(m1, m2, scaledHue + 0.3333333333333333) * 255);
+      _this._color0$_green = T.fuzzyRound0(K.SassColor__hueToRgb0(m1, m2, scaledHue) * 255);
+      _this._color0$_blue = T.fuzzyRound0(K.SassColor__hueToRgb0(m1, m2, scaledHue - 0.3333333333333333) * 255);
+    }
+  };
+  K.SassColor_SassColor$hwb_toRgb0.prototype = {
+    call$1: function(hue) {
+      return T.fuzzyRound0((K.SassColor__hueToRgb0(0, 1, hue) * this.factor + this._box_0.scaledWhiteness) * 255);
+    },
+    $signature: 39
+  };
+  R.ModifiableCssComment0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssComment$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    $isCssComment0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  U._compileStylesheet_closure1.prototype = {
+    call$1: function(url) {
+      var t1, t2, _null = null;
+      if (url === "")
+        t1 = P.Uri_Uri$dataFromString(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(this.stylesheet.span.file._decodedChars, 0, _null), 0, _null), C.C_Utf8Codec, _null).get$_text();
+      else {
+        t1 = P.Uri_parse(url);
+        t2 = this.importCache._import_cache$_resultsCache.$index(0, t1);
+        t2 = t2 == null ? _null : t2.get$sourceMapUrl();
+        t1 = (t2 == null ? t1 : t2).toString$0(0);
+      }
+      return t1;
+    },
+    $signature: 4
+  };
+  S.ComplexSassNumber0.prototype = {
+    get$hasUnits: function() {
+      return true;
+    },
+    hasUnit$1: function(unit) {
+      return false;
+    },
+    compatibleWithUnit$1: function(unit) {
+      return false;
+    },
+    withValue$1: function(value) {
+      return new S.ComplexSassNumber0(this.numeratorUnits, this.denominatorUnits, value, null);
+    },
+    withSlash$2: function(numerator, denominator) {
+      return new S.ComplexSassNumber0(this.numeratorUnits, this.denominatorUnits, this.value, new S.Tuple2(numerator, denominator, type$.Tuple2_of_legacy_SassNumber_and_legacy_SassNumber_2));
+    },
+    get$numeratorUnits: function() {
+      return this.numeratorUnits;
+    },
+    get$denominatorUnits: function() {
+      return this.denominatorUnits;
+    }
+  };
+  S.ComplexSelector0.prototype = {
+    get$minSpecificity: function() {
+      if (this._complex0$_minSpecificity == null)
+        this._complex0$_computeSpecificity$0();
+      return this._complex0$_minSpecificity;
+    },
+    get$maxSpecificity: function() {
+      if (this._complex0$_maxSpecificity == null)
+        this._complex0$_computeSpecificity$0();
+      return this._complex0$_maxSpecificity;
+    },
+    get$isInvisible: function() {
+      var t1 = this._complex0$_isInvisible;
+      if (t1 != null)
+        return t1;
+      return this._complex0$_isInvisible = C.JSArray_methods.any$1(this.components, new S.ComplexSelector_isInvisible_closure0());
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitComplexSelector$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    _complex0$_computeSpecificity$0: function() {
+      var t1, t2, component, t3, _this = this,
+        _i = _this._complex0$_maxSpecificity = _this._complex0$_minSpecificity = 0;
+      for (t1 = _this.components, t2 = t1.length; _i < t2; ++_i) {
+        component = t1[_i];
+        if (component instanceof X.CompoundSelector0) {
+          t3 = _this._complex0$_minSpecificity;
+          if (component._compound0$_minSpecificity == null)
+            component._compound0$_computeSpecificity$0();
+          _this._complex0$_minSpecificity = t3 + component._compound0$_minSpecificity;
+          t3 = _this._complex0$_maxSpecificity;
+          if (component._compound0$_maxSpecificity == null)
+            component._compound0$_computeSpecificity$0();
+          _this._complex0$_maxSpecificity = t3 + component._compound0$_maxSpecificity;
+        }
+      }
+    },
+    get$hashCode: function(_) {
+      return C.C_ListEquality.hash$1(this.components);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof S.ComplexSelector0 && C.C_ListEquality.equals$2(0, this.components, other.components);
+    }
+  };
+  S.ComplexSelector_isInvisible_closure0.prototype = {
+    call$1: function(component) {
+      return component instanceof X.CompoundSelector0 && component.get$isInvisible();
+    },
+    $signature: 93
+  };
+  S.Combinator0.prototype = {
+    toString$0: function(_) {
+      return this._complex0$_text;
+    },
+    $isComplexSelectorComponent0: 1
+  };
+  X.CompoundSelector0.prototype = {
+    get$isInvisible: function() {
+      return C.JSArray_methods.any$1(this.components, new X.CompoundSelector_isInvisible_closure0());
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitCompoundSelector$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    _compound0$_computeSpecificity$0: function() {
+      var t1, t2, simple, _this = this,
+        _i = _this._compound0$_maxSpecificity = _this._compound0$_minSpecificity = 0;
+      for (t1 = _this.components, t2 = t1.length; _i < t2; ++_i) {
+        simple = t1[_i];
+        _this._compound0$_minSpecificity = _this._compound0$_minSpecificity + simple.get$minSpecificity();
+        _this._compound0$_maxSpecificity = _this._compound0$_maxSpecificity + simple.get$maxSpecificity();
+      }
+    },
+    get$hashCode: function(_) {
+      return C.C_ListEquality.hash$1(this.components);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof X.CompoundSelector0 && C.C_ListEquality.equals$2(0, this.components, other.components);
+    },
+    $isComplexSelectorComponent0: 1
+  };
+  X.CompoundSelector_isInvisible_closure0.prototype = {
+    call$1: function(component) {
+      return component.get$isInvisible();
+    },
+    $signature: 19
+  };
+  A.Configuration0.prototype = {
+    throughForward$1: function($forward) {
+      var t1, t2,
+        newValues = this._configuration$_values;
+      if (newValues.get$isEmpty(newValues))
+        return C.Configuration_Map_empty_null_true0;
+      t1 = $forward.prefix;
+      if (t1 != null)
+        newValues = new R.UnprefixedMapView0(newValues, t1, type$.UnprefixedMapView_legacy_ConfiguredValue_2);
+      t1 = $forward.shownVariables;
+      if (t1 != null)
+        newValues = new K.LimitedMapView0(newValues, t1._base.intersection$1(new M.MapKeySet(newValues, type$.MapKeySet_legacy_Object)), type$.LimitedMapView_of_legacy_String_and_legacy_ConfiguredValue_2);
+      else {
+        t1 = $forward.hiddenVariables;
+        if (t1 == null)
+          t2 = null;
+        else {
+          t2 = t1._base;
+          t2 = t2.get$isNotEmpty(t2);
+        }
+        if (t2 === true)
+          newValues = K.LimitedMapView$blocklist0(newValues, t1, type$.legacy_String, type$.legacy_ConfiguredValue_2);
+      }
+      return this.isImplicit ? new A.Configuration0(newValues, null, true) : new A.Configuration0(newValues, this.nodeWithSpan, false);
+    }
+  };
+  Z.ConfiguredValue0.prototype = {};
+  Z.ConfiguredVariable0.prototype = {
+    toString$0: function(_) {
+      var t1 = "$" + this.name + ": " + H.S(this.expression);
+      return t1 + (this.isGuarded ? " !default" : "");
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Y.ContentBlock0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitContentBlock$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t2,
+        t1 = this.$arguments;
+      t1 = t1.$arguments.length === 0 && t1.restArgument == null ? "" : " using (" + t1.toString$0(0) + ")";
+      t2 = this.children;
+      return t1 + (" {" + (t2 && C.JSArray_methods).join$1(t2, " ") + "}");
+    }
+  };
+  Q.ContentRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitContentRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.$arguments;
+      return t1.get$isEmpty(t1) ? "@content;" : "@content(" + t1.toString$0(0) + ");";
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Q.closure227.prototype = {
+    call$1: function($function) {
+      return $function.name;
+    },
+    $signature: 325
+  };
+  Q.CssParser0.prototype = {
+    get$plainCss: function() {
+      return true;
+    },
+    silentComment$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position;
+      this.super$Parser$silentComment0();
+      this.error$2(0, string$.Silent, t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    atRule$2$root: function(child, root) {
+      var $name, urlStart, next, url, urlSpan, queries, t2, t3, t4, t5, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expectChar$1(64);
+      $name = _this.interpolatedIdentifier$0();
+      _this.whitespace$0();
+      switch ($name.get$asPlain()) {
+        case "at-root":
+        case "content":
+        case "debug":
+        case "each":
+        case "error":
+        case "extend":
+        case "for":
+        case "function":
+        case "if":
+        case "include":
+        case "mixin":
+        case "return":
+        case "warn":
+        case "while":
+          _this.almostAnyValue$0();
+          _this.error$2(0, "This at-rule isn't allowed in plain CSS.", t1.spanFrom$1(start));
+          break;
+        case "charset":
+          _this.string$0();
+          if (!root)
+            _this.error$2(0, "This at-rule is not allowed here.", t1.spanFrom$1(start));
+          return null;
+        case "import":
+          urlStart = new S._SpanScannerState(t1, t1._string_scanner$_position);
+          next = t1.peekChar$0();
+          url = next === 117 || next === 85 ? _this.dynamicUrl$0() : new D.StringExpression0(_this.interpolatedString$0().asInterpolation$1$static(true), false);
+          urlSpan = t1.spanFrom$1(urlStart);
+          _this.whitespace$0();
+          queries = _this.tryImportQueries$0();
+          _this.expectStatementSeparator$1("@import rule");
+          t2 = X.Interpolation$0(H.setRuntimeTypeInfo([url], type$.JSArray_legacy_Object), urlSpan);
+          t3 = t1.spanFrom$1(urlStart);
+          t4 = queries == null;
+          t5 = t4 ? null : queries.item1;
+          t2 = H.setRuntimeTypeInfo([new Q.StaticImport0(t2, t5, t4 ? null : queries.item2, t3)], type$.JSArray_legacy_Import_2);
+          t1 = t1.spanFrom$1(start);
+          return new B.ImportRule0(P.List_List$unmodifiable(t2, type$.legacy_Import_2), t1);
+        case "media":
+          return _this.mediaRule$1(start);
+        case "-moz-document":
+          return _this.mozDocumentRule$2(start, $name);
+        case "supports":
+          return _this.supportsRule$1(start);
+        default:
+          return _this.unknownAtRule$2(start, $name);
+      }
+    },
+    identifierLike$0: function() {
+      var t2, $arguments, t3, t4, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        identifier = _this.interpolatedIdentifier$0(),
+        plain = identifier.get$asPlain(),
+        specialFunction = _this.trySpecialFunction$2(plain.toLowerCase(), start);
+      if (specialFunction != null)
+        return specialFunction;
+      t2 = t1._string_scanner$_position;
+      if (!t1.scanChar$1(40))
+        return new D.StringExpression0(identifier, false);
+      $arguments = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression_2);
+      if (!t1.scanChar$1(41)) {
+        do {
+          _this.whitespace$0();
+          $arguments.push(_this.expression$1$singleEquals(true));
+          _this.whitespace$0();
+        } while (t1.scanChar$1(44));
+        t1.expectChar$1(41);
+      }
+      if ($.$get$_disallowedFunctionNames0().contains$1(0, plain))
+        _this.error$2(0, string$.This_f, t1.spanFrom$1(start));
+      t3 = X.Interpolation$0(H.setRuntimeTypeInfo([new D.StringExpression0(identifier, false)], type$.JSArray_legacy_Object), identifier.span);
+      t2 = t1.spanFrom$1(new S._SpanScannerState(t1, t2));
+      t4 = type$.legacy_Expression_2;
+      return new F.FunctionExpression0(null, t3, new X.ArgumentInvocation0(P.List_List$unmodifiable($arguments, t4), H.ConstantMap_ConstantMap$from(C.Map_empty9, type$.legacy_String, t4), null, null, t2), t1.spanFrom$1(start));
+    }
+  };
+  Q.DebugRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitDebugRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@debug " + H.S(this.expression) + ";";
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.ModifiableCssDeclaration0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssDeclaration$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return H.S(this.name) + ": " + this.value.toString$0(0) + ";";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.Declaration0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitDeclaration$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.SupportsDeclaration0.prototype = {
+    toString$0: function(_) {
+      return "(" + H.S(this.name) + ": " + H.S(this.value) + ")";
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.DynamicImport0.prototype = {
+    toString$0: function(_) {
+      return new D.StringExpression0(X.Interpolation$0(H.setRuntimeTypeInfo([this.url], type$.JSArray_legacy_Object), null), true).asInterpolation$1$static(true).get$asPlain();
+    },
+    $isImport0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.EachRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitEachRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.variables,
+        t2 = this.children;
+      return "@each " + new H.MappedListIterable(t1, new V.EachRule_toString_closure0(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$1(0, ", ") + " in " + H.S(this.list) + " {" + (t2 && C.JSArray_methods).join$1(t2, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.EachRule_toString_closure0.prototype = {
+    call$1: function(variable) {
+      return C.JSString_methods.$add("$", variable);
+    },
+    $signature: 4
+  };
+  T.EmptyExtender0.prototype = {
+    get$isEmpty: function(_) {
+      return true;
+    },
+    get$simpleSelectors: function() {
+      return C.C_EmptyUnmodifiableSet0;
+    },
+    extensionsWhereTarget$1: function(callback) {
+      return C.List_empty13;
+    },
+    addExtensions$1: function(extenders) {
+      throw H.wrapException(P.UnsupportedError$(string$.addExt));
+    },
+    clone$0: function() {
+      return C.Tuple2_EmptyExtender_Map_empty0;
+    },
+    $isExtender0: 1
+  };
+  O.Environment0.prototype = {
+    closure$0: function() {
+      var t5, t6, t7, _this = this,
+        t1 = _this._environment0$_forwardedModules,
+        t2 = _this._environment0$_forwardedModuleNodes,
+        t3 = _this._environment0$_nestedForwardedModules,
+        t4 = _this._environment0$_variables;
+      t4 = H.setRuntimeTypeInfo(t4.slice(0), H._arrayInstanceType(t4));
+      t5 = _this._environment0$_variableNodes;
+      if (t5 == null)
+        t5 = null;
+      else
+        t5 = H.setRuntimeTypeInfo(t5.slice(0), H._arrayInstanceType(t5));
+      t6 = _this._environment0$_functions;
+      t6 = H.setRuntimeTypeInfo(t6.slice(0), H._arrayInstanceType(t6));
+      t7 = _this._environment0$_mixins;
+      t7 = H.setRuntimeTypeInfo(t7.slice(0), H._arrayInstanceType(t7));
+      return O.Environment$_0(_this._environment0$_modules, _this._environment0$_namespaceNodes, _this._environment0$_globalModules, _this._environment0$_globalModuleNodes, t1, t2, t3, _this._environment0$_allModules, t4, t5, t6, t7, _this._environment0$_content);
+    },
+    addModule$3$namespace: function(module, nodeWithSpan, namespace) {
+      var t1, t2, _this = this;
+      if (namespace == null) {
+        _this._environment0$_globalModules.add$1(0, module);
+        _this._environment0$_globalModuleNodes.$indexSet(0, module, nodeWithSpan);
+        _this._environment0$_allModules.push(module);
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.get$first(_this._environment0$_variables))); t1.moveNext$0();) {
+          t2 = t1.get$current(t1);
+          if (module.get$variables().containsKey$1(t2))
+            throw H.wrapException(E.SassScriptException$0(string$.This_ma + H.S(t2) + '".'));
+        }
+      } else {
+        t1 = _this._environment0$_modules;
+        if (t1.containsKey$1(namespace))
+          throw H.wrapException(E.MultiSpanSassScriptException$0(string$.There_ + namespace + '".', "new @use", P.LinkedHashMap_LinkedHashMap$_literal([_this._environment0$_namespaceNodes.$index(0, namespace).get$span(), "original @use"], type$.legacy_FileSpan, type$.legacy_String)));
+        t1.$indexSet(0, namespace, module);
+        _this._environment0$_namespaceNodes.$indexSet(0, namespace, nodeWithSpan);
+        _this._environment0$_allModules.push(module);
+      }
+    },
+    forwardModule$2: function(module, rule) {
+      var view, t1, t2, _this = this;
+      if (_this._environment0$_forwardedModules == null)
+        _this._environment0$_forwardedModules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_Module_legacy_Callable_2);
+      if (_this._environment0$_forwardedModuleNodes == null)
+        _this._environment0$_forwardedModuleNodes = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Module_legacy_Callable_2, type$.legacy_AstNode_2);
+      view = R.ForwardedModuleView_ifNecessary0(module, rule, type$.legacy_Callable_2);
+      for (t1 = _this._environment0$_forwardedModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();) {
+        t2 = t1._collection$_current;
+        _this._environment0$_assertNoConflicts$6(view.get$variables(), t2.get$variables(), view, t2, "variable", rule);
+        _this._environment0$_assertNoConflicts$6(view.get$functions(view), t2.get$functions(t2), view, t2, "function", rule);
+        _this._environment0$_assertNoConflicts$6(view.get$mixins(), t2.get$mixins(), view, t2, "mixin", rule);
+      }
+      _this._environment0$_allModules.push(module);
+      _this._environment0$_forwardedModules.add$1(0, view);
+      _this._environment0$_forwardedModuleNodes.$indexSet(0, view, rule);
+    },
+    _environment0$_assertNoConflicts$6: function(newMembers, oldMembers, newModule, oldModule, type, newModuleNodeWithSpan) {
+      var larger, smaller, t1, t2, $name;
+      if (newMembers.get$length(newMembers) < oldMembers.get$length(oldMembers)) {
+        larger = oldMembers;
+        smaller = newMembers;
+      } else {
+        larger = newMembers;
+        smaller = oldMembers;
+      }
+      for (t1 = J.get$iterator$ax(smaller.get$keys(smaller)), t2 = type === "variable"; t1.moveNext$0();) {
+        $name = t1.get$current(t1);
+        if (!larger.containsKey$1($name))
+          continue;
+        if (t2 ? newModule.variableIdentity$1($name) === oldModule.variableIdentity$1($name) : J.$eq$(larger.$index(0, $name), smaller.$index(0, $name)))
+          continue;
+        if (t2)
+          $name = "$" + H.S($name);
+        throw H.wrapException(E.MultiSpanSassScriptException$0("Two forwarded modules both define a " + type + " named " + H.S($name) + ".", "new @forward", P.LinkedHashMap_LinkedHashMap$_literal([this._environment0$_forwardedModuleNodes.$index(0, oldModule).get$span(), "original @forward"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+    },
+    importForwards$1: function(module) {
+      var t2, t3, t4, t5, forwardedVariableNames, forwardedFunctionNames, forwardedMixinNames, t6, t7, _i, shadowed, t8, _this = this,
+        t1 = module._environment0$_environment,
+        forwarded = t1._environment0$_forwardedModules;
+      if (forwarded == null)
+        return;
+      if (_this._environment0$_forwardedModules != null) {
+        t2 = P.LinkedHashSet_LinkedHashSet(type$.legacy_Module_legacy_Callable_2);
+        for (t3 = P._LinkedHashSetIterator$(forwarded, forwarded._collection$_modifications), t4 = _this._environment0$_globalModules; t3.moveNext$0();) {
+          t5 = t3._collection$_current;
+          if (!_this._environment0$_forwardedModules.contains$1(0, t5) || !t4.contains$1(0, t5))
+            t2.add$1(0, t5);
+        }
+        forwarded = t2;
+      }
+      if (_this._environment0$_forwardedModules == null)
+        _this._environment0$_forwardedModules = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_Module_legacy_Callable_2);
+      if (_this._environment0$_forwardedModuleNodes == null)
+        _this._environment0$_forwardedModuleNodes = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Module_legacy_Callable_2, type$.legacy_AstNode_2);
+      t2 = H._instanceType(forwarded)._eval$1("ExpandIterable<1,String*>");
+      t3 = t2._eval$1("Iterable.E");
+      forwardedVariableNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new O.Environment_importForwards_closure3(), t2), t3);
+      forwardedFunctionNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new O.Environment_importForwards_closure4(), t2), t3);
+      forwardedMixinNames = P.LinkedHashSet_LinkedHashSet$of(new H.ExpandIterable(forwarded, new O.Environment_importForwards_closure5(), t2), t3);
+      t2 = _this._environment0$_variables;
+      t3 = t2.length;
+      if (t3 === 1) {
+        for (t3 = _this._environment0$_globalModules, t4 = P.List_List$from(t3, true, H._instanceType(t3)._precomputed1), t5 = t4.length, t6 = type$.legacy_Callable_2, t7 = _this._environment0$_globalModuleNodes, _i = 0; _i < t4.length; t4.length === t5 || (0, H.throwConcurrentModificationError)(t4), ++_i) {
+          module = t4[_i];
+          shadowed = B.ShadowedModuleView_ifNecessary0(module, forwardedFunctionNames, forwardedMixinNames, forwardedVariableNames, t6);
+          if (shadowed != null) {
+            t3.remove$1(0, module);
+            t8 = shadowed.variables;
+            if (t8.get$isEmpty(t8)) {
+              t8 = shadowed.functions;
+              if (t8.get$isEmpty(t8)) {
+                t8 = shadowed.mixins;
+                if (t8.get$isEmpty(t8)) {
+                  t8 = shadowed._shadowed_view0$_inner;
+                  t8 = t8.get$css(t8);
+                  t8 = J.get$isEmpty$asx(t8.get$children(t8));
+                } else
+                  t8 = false;
+              } else
+                t8 = false;
+            } else
+              t8 = false;
+            if (!t8) {
+              t3.add$1(0, shadowed);
+              t7.$indexSet(0, shadowed, t7.remove$1(0, module));
+            }
+          }
+        }
+        t4 = _this._environment0$_forwardedModules;
+        t4.toString;
+        t4 = P.List_List$from(t4, true, H._instanceType(t4)._precomputed1);
+        t5 = t4.length;
+        _i = 0;
+        for (; _i < t4.length; t4.length === t5 || (0, H.throwConcurrentModificationError)(t4), ++_i) {
+          module = t4[_i];
+          shadowed = B.ShadowedModuleView_ifNecessary0(module, forwardedFunctionNames, forwardedMixinNames, forwardedVariableNames, t6);
+          if (shadowed != null) {
+            _this._environment0$_forwardedModules.remove$1(0, module);
+            t8 = shadowed.variables;
+            if (t8.get$isEmpty(t8)) {
+              t8 = shadowed.functions;
+              if (t8.get$isEmpty(t8)) {
+                t8 = shadowed.mixins;
+                if (t8.get$isEmpty(t8)) {
+                  t8 = shadowed._shadowed_view0$_inner;
+                  t8 = t8.get$css(t8);
+                  t8 = J.get$isEmpty$asx(t8.get$children(t8));
+                } else
+                  t8 = false;
+              } else
+                t8 = false;
+            } else
+              t8 = false;
+            if (!t8) {
+              _this._environment0$_forwardedModules.add$1(0, shadowed);
+              t8 = _this._environment0$_forwardedModuleNodes;
+              t8.$indexSet(0, shadowed, t8.remove$1(0, module));
+            }
+          }
+        }
+        t3.addAll$1(0, forwarded);
+        t7.addAll$1(0, t1._environment0$_forwardedModuleNodes);
+        _this._environment0$_forwardedModules.addAll$1(0, forwarded);
+        _this._environment0$_forwardedModuleNodes.addAll$1(0, t1._environment0$_forwardedModuleNodes);
+      } else {
+        t1 = _this._environment0$_nestedForwardedModules;
+        J.addAll$1$ax(C.JSArray_methods.get$last(t1 == null ? _this._environment0$_nestedForwardedModules = P.List_List$generate(t3 - 1, new O.Environment_importForwards_closure6(), true, type$.legacy_List_legacy_Module_legacy_Callable_2) : t1), forwarded);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedVariableNames, forwardedVariableNames._collection$_modifications), t3 = _this._environment0$_variableNodes, t4 = t3 != null, t5 = _this._environment0$_variableIndices; t1.moveNext$0();) {
+        t6 = t1._collection$_current;
+        t5.remove$1(0, t6);
+        J.remove$1$ax(C.JSArray_methods.get$last(t2), t6);
+        if (t4)
+          J.remove$1$ax(C.JSArray_methods.get$last(t3), t6);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedFunctionNames, forwardedFunctionNames._collection$_modifications), t2 = _this._environment0$_functionIndices, t3 = _this._environment0$_functions; t1.moveNext$0();) {
+        t4 = t1._collection$_current;
+        t2.remove$1(0, t4);
+        J.remove$1$ax(C.JSArray_methods.get$last(t3), t4);
+      }
+      for (t1 = P._LinkedHashSetIterator$(forwardedMixinNames, forwardedMixinNames._collection$_modifications), t2 = _this._environment0$_mixinIndices, t3 = _this._environment0$_mixins; t1.moveNext$0();) {
+        t4 = t1._collection$_current;
+        t2.remove$1(0, t4);
+        J.remove$1$ax(C.JSArray_methods.get$last(t3), t4);
+      }
+    },
+    getVariable$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._environment0$_getModule$1(namespace).get$variables().$index(0, $name);
+      if (_this._environment0$_lastVariableName === $name) {
+        t1 = J.$index$asx(_this._environment0$_variables[_this._environment0$_lastVariableIndex], $name);
+        return t1 == null ? _this._environment0$_getVariableFromGlobalModule$1($name) : t1;
+      }
+      t1 = _this._environment0$_variableIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        _this._environment0$_lastVariableName = $name;
+        _this._environment0$_lastVariableIndex = index;
+        t1 = J.$index$asx(_this._environment0$_variables[index], $name);
+        return t1 == null ? _this._environment0$_getVariableFromGlobalModule$1($name) : t1;
+      }
+      index = _this._environment0$_variableIndex$1($name);
+      if (index == null)
+        return _this._environment0$_getVariableFromGlobalModule$1($name);
+      _this._environment0$_lastVariableName = $name;
+      _this._environment0$_lastVariableIndex = index;
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._environment0$_variables[index], $name);
+      return t1 == null ? _this._environment0$_getVariableFromGlobalModule$1($name) : t1;
+    },
+    getVariable$1: function($name) {
+      return this.getVariable$2$namespace($name, null);
+    },
+    _environment0$_getVariableFromGlobalModule$1: function($name) {
+      return this._environment0$_fromOneModule$3($name, "variable", new O.Environment__getVariableFromGlobalModule_closure0($name));
+    },
+    getVariableNode$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._environment0$_getModule$1(namespace).get$variableNodes().$index(0, $name);
+      if (_this._environment0$_lastVariableName === $name) {
+        t1 = J.$index$asx(_this._environment0$_variableNodes[_this._environment0$_lastVariableIndex], $name);
+        return t1 == null ? _this._environment0$_getVariableNodeFromGlobalModule$1($name) : t1;
+      }
+      t1 = _this._environment0$_variableIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        _this._environment0$_lastVariableName = $name;
+        _this._environment0$_lastVariableIndex = index;
+        t1 = J.$index$asx(_this._environment0$_variableNodes[index], $name);
+        return t1 == null ? _this._environment0$_getVariableNodeFromGlobalModule$1($name) : t1;
+      }
+      index = _this._environment0$_variableIndex$1($name);
+      if (index == null)
+        return _this._environment0$_getVariableNodeFromGlobalModule$1($name);
+      _this._environment0$_lastVariableName = $name;
+      _this._environment0$_lastVariableIndex = index;
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._environment0$_variableNodes[index], $name);
+      return t1 == null ? _this._environment0$_getVariableNodeFromGlobalModule$1($name) : t1;
+    },
+    _environment0$_getVariableNodeFromGlobalModule$1: function($name) {
+      var t1, value;
+      for (t1 = this._environment0$_globalModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications); t1.moveNext$0();) {
+        value = t1._collection$_current.get$variableNodes().$index(0, $name);
+        if (value != null)
+          return value;
+      }
+      return null;
+    },
+    globalVariableExists$2$namespace: function($name, namespace) {
+      if (namespace != null)
+        return this._environment0$_getModule$1(namespace).get$variables().containsKey$1($name);
+      if (C.JSArray_methods.get$first(this._environment0$_variables).containsKey$1($name))
+        return true;
+      return this._environment0$_getVariableFromGlobalModule$1($name) != null;
+    },
+    globalVariableExists$1: function($name) {
+      return this.globalVariableExists$2$namespace($name, null);
+    },
+    _environment0$_variableIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._environment0$_variables, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    setVariable$5$global$namespace: function($name, value, nodeWithSpan, global, namespace) {
+      var t1, moduleWithName, cur, t2, index, _this = this;
+      if (namespace != null) {
+        _this._environment0$_getModule$1(namespace).setVariable$3($name, value, nodeWithSpan);
+        return;
+      }
+      if (global || _this._environment0$_variables.length === 1) {
+        _this._environment0$_variableIndices.putIfAbsent$2($name, new O.Environment_setVariable_closure2(_this, $name));
+        t1 = _this._environment0$_variables;
+        if (!C.JSArray_methods.get$first(t1).containsKey$1($name)) {
+          moduleWithName = _this._environment0$_fromOneModule$3($name, "variable", new O.Environment_setVariable_closure3($name));
+          if (moduleWithName != null) {
+            moduleWithName.setVariable$3($name, value, nodeWithSpan);
+            return;
+          }
+        }
+        J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, value);
+        t1 = _this._environment0$_variableNodes;
+        if (t1 != null)
+          J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, nodeWithSpan);
+        return;
+      }
+      if (_this._environment0$_nestedForwardedModules != null && !_this._environment0$_variableIndices.containsKey$1($name) && _this._environment0$_variableIndex$1($name) == null) {
+        t1 = _this._environment0$_nestedForwardedModules;
+        t1.toString;
+        t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>"));
+        t1 = new H.ListIterator(t1, t1.get$length(t1));
+        for (; t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          for (t2 = J.get$reversed$ax(cur), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+            cur = t2.__internal$_current;
+            if (cur.get$variables().containsKey$1($name)) {
+              cur.setVariable$3($name, value, nodeWithSpan);
+              return;
+            }
+          }
+        }
+      }
+      index = _this._environment0$_lastVariableName === $name ? _this._environment0$_lastVariableIndex : _this._environment0$_variableIndices.putIfAbsent$2($name, new O.Environment_setVariable_closure4(_this, $name));
+      if (!_this._environment0$_inSemiGlobalScope && index === 0) {
+        index = _this._environment0$_variables.length - 1;
+        _this._environment0$_variableIndices.$indexSet(0, $name, index);
+      }
+      _this._environment0$_lastVariableName = $name;
+      _this._environment0$_lastVariableIndex = index;
+      J.$indexSet$ax(_this._environment0$_variables[index], $name, value);
+      t1 = _this._environment0$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(t1[index], $name, nodeWithSpan);
+    },
+    setVariable$4$global: function($name, value, nodeWithSpan, global) {
+      return this.setVariable$5$global$namespace($name, value, nodeWithSpan, global, null);
+    },
+    setLocalVariable$3: function($name, value, nodeWithSpan) {
+      var index, _this = this,
+        t1 = _this._environment0$_variables,
+        t2 = t1.length;
+      _this._environment0$_lastVariableName = $name;
+      index = _this._environment0$_lastVariableIndex = t2 - 1;
+      _this._environment0$_variableIndices.$indexSet(0, $name, index);
+      J.$indexSet$ax(t1[index], $name, value);
+      t1 = _this._environment0$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(t1[index], $name, nodeWithSpan);
+    },
+    getFunction$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null) {
+        t1 = _this._environment0$_getModule$1(namespace);
+        return t1.get$functions(t1).$index(0, $name);
+      }
+      t1 = _this._environment0$_functionIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        t1 = J.$index$asx(_this._environment0$_functions[index], $name);
+        return t1 == null ? _this._environment0$_getFunctionFromGlobalModule$1($name) : t1;
+      }
+      index = _this._environment0$_functionIndex$1($name);
+      if (index == null)
+        return _this._environment0$_getFunctionFromGlobalModule$1($name);
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._environment0$_functions[index], $name);
+      return t1 == null ? _this._environment0$_getFunctionFromGlobalModule$1($name) : t1;
+    },
+    _environment0$_getFunctionFromGlobalModule$1: function($name) {
+      return this._environment0$_fromOneModule$3($name, "function", new O.Environment__getFunctionFromGlobalModule_closure0($name));
+    },
+    _environment0$_functionIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._environment0$_functions, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    getMixin$2$namespace: function($name, namespace) {
+      var t1, index, _this = this;
+      if (namespace != null)
+        return _this._environment0$_getModule$1(namespace).get$mixins().$index(0, $name);
+      t1 = _this._environment0$_mixinIndices;
+      index = t1.$index(0, $name);
+      if (index != null) {
+        t1 = J.$index$asx(_this._environment0$_mixins[index], $name);
+        return t1 == null ? _this._environment0$_getMixinFromGlobalModule$1($name) : t1;
+      }
+      index = _this._environment0$_mixinIndex$1($name);
+      if (index == null)
+        return _this._environment0$_getMixinFromGlobalModule$1($name);
+      t1.$indexSet(0, $name, index);
+      t1 = J.$index$asx(_this._environment0$_mixins[index], $name);
+      return t1 == null ? _this._environment0$_getMixinFromGlobalModule$1($name) : t1;
+    },
+    _environment0$_getMixinFromGlobalModule$1: function($name) {
+      return this._environment0$_fromOneModule$3($name, "mixin", new O.Environment__getMixinFromGlobalModule_closure0($name));
+    },
+    _environment0$_mixinIndex$1: function($name) {
+      var t1, i;
+      for (t1 = this._environment0$_mixins, i = t1.length - 1; i >= 0; --i)
+        if (t1[i].containsKey$1($name))
+          return i;
+      return null;
+    },
+    scope$1$3$semiGlobal$when: function(callback, semiGlobal, when) {
+      var wasInSemiGlobalScope, wasInSemiGlobalScope0, $name, name0, name1, t1, t2, t3, t4, t5, _this = this;
+      if (!when) {
+        wasInSemiGlobalScope = _this._environment0$_inSemiGlobalScope;
+        _this._environment0$_inSemiGlobalScope = semiGlobal;
+        try {
+          t1 = callback.call$0();
+          return t1;
+        } finally {
+          _this._environment0$_inSemiGlobalScope = wasInSemiGlobalScope;
+        }
+      }
+      semiGlobal = semiGlobal && _this._environment0$_inSemiGlobalScope;
+      wasInSemiGlobalScope0 = _this._environment0$_inSemiGlobalScope;
+      _this._environment0$_inSemiGlobalScope = semiGlobal;
+      t1 = _this._environment0$_variables;
+      t2 = type$.legacy_String;
+      C.JSArray_methods.add$1(t1, P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_Value_2));
+      t3 = _this._environment0$_variableNodes;
+      if (t3 != null)
+        C.JSArray_methods.add$1(t3, P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_AstNode_2));
+      t3 = _this._environment0$_functions;
+      t4 = type$.legacy_Callable_2;
+      C.JSArray_methods.add$1(t3, P.LinkedHashMap_LinkedHashMap$_empty(t2, t4));
+      t5 = _this._environment0$_mixins;
+      C.JSArray_methods.add$1(t5, P.LinkedHashMap_LinkedHashMap$_empty(t2, t4));
+      t4 = _this._environment0$_nestedForwardedModules;
+      if (t4 != null)
+        C.JSArray_methods.add$1(t4, H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_Callable_2));
+      try {
+        t2 = callback.call$0();
+        return t2;
+      } finally {
+        _this._environment0$_inSemiGlobalScope = wasInSemiGlobalScope0;
+        _this._environment0$_lastVariableIndex = _this._environment0$_lastVariableName = null;
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t1))), t2 = _this._environment0$_variableIndices; t1.moveNext$0();) {
+          $name = t1.get$current(t1);
+          t2.remove$1(0, $name);
+        }
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t3))), t2 = _this._environment0$_functionIndices; t1.moveNext$0();) {
+          name0 = t1.get$current(t1);
+          t2.remove$1(0, name0);
+        }
+        for (t1 = J.get$iterator$ax(J.get$keys$z(C.JSArray_methods.removeLast$0(t5))), t2 = _this._environment0$_mixinIndices; t1.moveNext$0();) {
+          name1 = t1.get$current(t1);
+          t2.remove$1(0, name1);
+        }
+        t1 = _this._environment0$_nestedForwardedModules;
+        if (t1 != null)
+          C.JSArray_methods.removeLast$0(t1);
+      }
+    },
+    scope$1$1: function(callback, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, false, true, $T);
+    },
+    scope$1$2$when: function(callback, when, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, false, when, $T);
+    },
+    scope$1$2$semiGlobal: function(callback, semiGlobal, $T) {
+      return this.scope$1$3$semiGlobal$when(callback, semiGlobal, true, $T);
+    },
+    toImplicitConfiguration$0: function() {
+      var t2, t3, t4, t5, i, values, nodes, t6, t7,
+        t1 = type$.legacy_String,
+        configuration = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_ConfiguredValue_2);
+      for (t2 = this._environment0$_variables, t3 = this._environment0$_variableNodes, t4 = t3 == null, t5 = type$.legacy_AstNode_2, i = 0; i < t2.length; ++i) {
+        values = t2[i];
+        nodes = t4 ? P.LinkedHashMap_LinkedHashMap$_empty(t1, t5) : t3[i];
+        for (t6 = J.get$iterator$ax(values.get$keys(values)); t6.moveNext$0();) {
+          t7 = t6.get$current(t6);
+          configuration.$indexSet(0, t7, new Z.ConfiguredValue0(values.$index(0, t7), null, nodes.$index(0, t7)));
+        }
+      }
+      return new A.Configuration0(configuration, null, true);
+    },
+    _environment0$_getModule$1: function(namespace) {
+      var module = this._environment0$_modules.$index(0, namespace);
+      if (module != null)
+        return module;
+      throw H.wrapException(E.SassScriptException$0('There is no module with the namespace "' + namespace + '".'));
+    },
+    _environment0$_fromOneModule$1$3: function($name, type, callback) {
+      var cur, t2, value, identity, t3, valueInModule, identityFromModule, t4, t5,
+        t1 = this._environment0$_nestedForwardedModules;
+      if (t1 != null)
+        for (t1 = new H.ReversedListIterable(t1, H._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>")), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          for (t2 = J.get$reversed$ax(cur), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+            cur = t2.__internal$_current;
+            value = callback.call$1(cur);
+            if (value != null)
+              return value;
+          }
+        }
+      for (t1 = this._environment0$_globalModules, t1 = P._LinkedHashSetIterator$(t1, t1._collection$_modifications), t2 = type$.legacy_Callable_2, value = null, identity = null; t1.moveNext$0();) {
+        t3 = t1._collection$_current;
+        valueInModule = callback.call$1(t3);
+        if (valueInModule == null)
+          continue;
+        identityFromModule = t2._is(valueInModule) ? valueInModule : t3.variableIdentity$1($name);
+        if (identityFromModule.$eq(0, identity))
+          continue;
+        if (value != null) {
+          t1 = "This " + type + string$.x20is_av;
+          t2 = type + " use";
+          t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_FileSpan, type$.legacy_String);
+          for (t4 = this._environment0$_globalModuleNodes, t4 = t4.get$entries(t4), t4 = t4.get$iterator(t4); t4.moveNext$0();) {
+            t5 = t4.get$current(t4);
+            if (callback.call$1(t5.key) != null)
+              t3.$indexSet(0, t5.value.get$span(), "includes " + type);
+          }
+          throw H.wrapException(E.MultiSpanSassScriptException$0(t1, t2, t3));
+        }
+        identity = identityFromModule;
+        value = valueInModule;
+      }
+      return value;
+    },
+    _environment0$_fromOneModule$3: function($name, type, callback) {
+      return this._environment0$_fromOneModule$1$3($name, type, callback, type$.dynamic);
+    }
+  };
+  O.Environment_importForwards_closure3.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$variables();
+      return t1.get$keys(t1);
+    },
+    $signature: 92
+  };
+  O.Environment_importForwards_closure4.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$functions(module);
+      return t1.get$keys(t1);
+    },
+    $signature: 92
+  };
+  O.Environment_importForwards_closure5.prototype = {
+    call$1: function(module) {
+      var t1 = module.get$mixins();
+      return t1.get$keys(t1);
+    },
+    $signature: 92
+  };
+  O.Environment_importForwards_closure6.prototype = {
+    call$1: function(_) {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_Callable_2);
+    },
+    $signature: 327
+  };
+  O.Environment__getVariableFromGlobalModule_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$variables().$index(0, this.name);
+    },
+    $signature: 328
+  };
+  O.Environment_setVariable_closure2.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._environment0$_lastVariableName = this.name;
+      return t1._environment0$_lastVariableIndex = 0;
+    },
+    $signature: 11
+  };
+  O.Environment_setVariable_closure3.prototype = {
+    call$1: function(module) {
+      return module.get$variables().containsKey$1(this.name) ? module : null;
+    },
+    $signature: 197
+  };
+  O.Environment_setVariable_closure4.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._environment0$_variableIndex$1(this.name);
+      return t2 == null ? t1._environment0$_variables.length - 1 : t2;
+    },
+    $signature: 11
+  };
+  O.Environment__getFunctionFromGlobalModule_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$functions(module).$index(0, this.name);
+    },
+    $signature: 196
+  };
+  O.Environment__getMixinFromGlobalModule_closure0.prototype = {
+    call$1: function(module) {
+      return module.get$mixins().$index(0, this.name);
+    },
+    $signature: 196
+  };
+  O._EnvironmentModule1.prototype = {
+    get$url: function() {
+      return this.css.get$span().file.url;
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      var t1, t2,
+        module = this._environment0$_modulesByVariable.$index(0, $name);
+      if (module != null) {
+        module.setVariable$3($name, value, nodeWithSpan);
+        return;
+      }
+      t1 = this._environment0$_environment;
+      t2 = t1._environment0$_variables;
+      if (!C.JSArray_methods.get$first(t2).containsKey$1($name))
+        throw H.wrapException(E.SassScriptException$0("Undefined variable."));
+      J.$indexSet$ax(C.JSArray_methods.get$first(t2), $name, value);
+      t1 = t1._environment0$_variableNodes;
+      if (t1 != null)
+        J.$indexSet$ax(C.JSArray_methods.get$first(t1), $name, nodeWithSpan);
+      return;
+    },
+    variableIdentity$1: function($name) {
+      var module = this._environment0$_modulesByVariable.$index(0, $name);
+      return module == null ? this : module.variableIdentity$1($name);
+    },
+    cloneCss$0: function() {
+      var newCssAndExtender, _this = this,
+        t1 = _this.css;
+      if (J.get$isEmpty$asx(t1.get$children(t1)))
+        return _this;
+      newCssAndExtender = V.cloneCssStylesheet0(t1, _this.extender);
+      return O._EnvironmentModule$_1(_this._environment0$_environment, newCssAndExtender.item1, newCssAndExtender.item2, _this._environment0$_modulesByVariable, _this.variables, _this.variableNodes, _this.functions, _this.mixins, _this.transitivelyContainsCss, _this.transitivelyContainsExtensions);
+    },
+    toString$0: function(_) {
+      var t1 = this.css;
+      if (t1.get$span().file.url == null)
+        t1 = "<unknown url>";
+      else {
+        t1 = t1.get$span();
+        t1 = $.$get$context().prettyUri$1(t1.file.url);
+      }
+      return t1;
+    },
+    $isModule0: 1,
+    get$upstream: function() {
+      return this.upstream;
+    },
+    get$variables: function() {
+      return this.variables;
+    },
+    get$variableNodes: function() {
+      return this.variableNodes;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    },
+    get$extender: function() {
+      return this.extender;
+    },
+    get$css: function(receiver) {
+      return this.css;
+    },
+    get$transitivelyContainsCss: function() {
+      return this.transitivelyContainsCss;
+    },
+    get$transitivelyContainsExtensions: function() {
+      return this.transitivelyContainsExtensions;
+    }
+  };
+  O._EnvironmentModule__EnvironmentModule_closure11.prototype = {
+    call$1: function(module) {
+      return module.get$variables();
+    },
+    $signature: 331
+  };
+  O._EnvironmentModule__EnvironmentModule_closure12.prototype = {
+    call$1: function(module) {
+      return module.get$variableNodes();
+    },
+    $signature: 332
+  };
+  O._EnvironmentModule__EnvironmentModule_closure13.prototype = {
+    call$1: function(module) {
+      return module.get$functions(module);
+    },
+    $signature: 194
+  };
+  O._EnvironmentModule__EnvironmentModule_closure14.prototype = {
+    call$1: function(module) {
+      return module.get$mixins();
+    },
+    $signature: 194
+  };
+  O._EnvironmentModule__EnvironmentModule_closure15.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsCss();
+    },
+    $signature: 102
+  };
+  O._EnvironmentModule__EnvironmentModule_closure16.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsExtensions();
+    },
+    $signature: 102
+  };
+  D.ErrorRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitErrorRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@error " + H.S(this.expression) + ";";
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  R._EvaluateVisitor1.prototype = {
+    _EvaluateVisitor$5$functions$importCache$logger$nodeImporter$sourceMap1: function(functions, importCache, logger, nodeImporter, sourceMap) {
+      var t2, cur, _i, metaModule, t3, module, $function, t4, _this = this,
+        _s20_ = "$name, $module: null",
+        _s9_ = "sass:meta",
+        metaFunctions = [Q.BuiltInCallable$function0("global-variable-exists", _s20_, new R._EvaluateVisitor_closure19(_this), _s9_), Q.BuiltInCallable$function0("variable-exists", "$name", new R._EvaluateVisitor_closure20(_this), _s9_), Q.BuiltInCallable$function0("function-exists", _s20_, new R._EvaluateVisitor_closure21(_this), _s9_), Q.BuiltInCallable$function0("mixin-exists", _s20_, new R._EvaluateVisitor_closure22(_this), _s9_), Q.BuiltInCallable$function0("content-exists", "", new R._EvaluateVisitor_closure23(_this), _s9_), Q.BuiltInCallable$function0("module-variables", "$module", new R._EvaluateVisitor_closure24(_this), _s9_), Q.BuiltInCallable$function0("module-functions", "$module", new R._EvaluateVisitor_closure25(_this), _s9_), Q.BuiltInCallable$function0("get-function", "$name, $css: false, $module: null", new R._EvaluateVisitor_closure26(_this), _s9_), Q.BuiltInCallable$function0("call", "$function, $args...", new R._EvaluateVisitor_closure27(_this), _s9_)],
+        t1 = type$.JSArray_legacy_BuiltInCallable_2,
+        metaMixins = H.setRuntimeTypeInfo([Q.BuiltInCallable$mixin0("load-css", "$url, $with: null", new R._EvaluateVisitor_closure28(_this), _s9_)], t1);
+      t1 = H.setRuntimeTypeInfo([], t1);
+      for (t2 = $.$get$global6(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (_i = 0; _i < 9; ++_i)
+        t1.push(metaFunctions[_i]);
+      metaModule = Q.BuiltInModule$0("meta", t1, metaMixins, null, type$.legacy_BuiltInCallable_2);
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_BuiltInModule_legacy_BuiltInCallable_2);
+      for (t2 = $.$get$coreModules0(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      t1.push(metaModule);
+      t2 = t1.length;
+      t3 = _this._evaluate0$_builtInModules;
+      _i = 0;
+      for (; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        module = t1[_i];
+        t3.$indexSet(0, module.url, module);
+      }
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Callable_2);
+      for (t2 = new H.ListIterator(functions, functions.get$length(functions)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (t2 = $.$get$globalFunctions0(), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      for (_i = 0; _i < 9; ++_i)
+        t1.push(metaFunctions[_i]);
+      for (t2 = t1.length, t3 = _this._evaluate0$_builtInFunctions, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        $function = t1[_i];
+        t4 = $function.get$name($function);
+        t4.toString;
+        t3.$indexSet(0, H.stringReplaceAllUnchecked(t4, "_", "-"), $function);
+      }
+    },
+    run$2: function(_, importer, node) {
+      return this._evaluate0$_withWarnCallback$1$1(new R._EvaluateVisitor_run_closure1(this, node, importer), type$.legacy_EvaluateResult_2);
+    },
+    _evaluate0$_withWarnCallback$1$1: function(callback, $T) {
+      return N.withWarnCallback0(new R._EvaluateVisitor__withWarnCallback_closure1(this), callback, $T._eval$1("0*"));
+    },
+    _evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors: function(url, stackFrame, nodeWithSpan, callback, baseUrl, configuration, namesInErrors) {
+      var t1, _this = this,
+        builtInModule = _this._evaluate0$_builtInModules.$index(0, url);
+      if (builtInModule != null) {
+        if (configuration != null && !configuration.isImplicit) {
+          t1 = namesInErrors ? "Built-in module " + H.S(url) + " can't be configured." : "Built-in modules can't be configured.";
+          throw H.wrapException(_this._evaluate0$_exception$2(t1, nodeWithSpan.get$span()));
+        }
+        _this._evaluate0$_addExceptionSpan$2(nodeWithSpan, new R._EvaluateVisitor__loadModule_closure3(callback, builtInModule));
+        return;
+      }
+      _this._evaluate0$_withStackFrame$3(stackFrame, nodeWithSpan, new R._EvaluateVisitor__loadModule_closure4(_this, url, nodeWithSpan, baseUrl, namesInErrors, configuration, callback));
+    },
+    _evaluate0$_loadModule$5$configuration: function(url, stackFrame, nodeWithSpan, callback, configuration) {
+      return this._evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors(url, stackFrame, nodeWithSpan, callback, null, configuration, false);
+    },
+    _evaluate0$_loadModule$4: function(url, stackFrame, nodeWithSpan, callback) {
+      return this._evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors(url, stackFrame, nodeWithSpan, callback, null, null, false);
+    },
+    _evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan: function(importer, stylesheet, configuration, namesInErrors, nodeWithSpan) {
+      var message, existingNode, environment, extender, module, _this = this, t1 = {},
+        url = stylesheet.span.file.url,
+        t2 = _this._evaluate0$_modules,
+        alreadyLoaded = t2.$index(0, url);
+      if (alreadyLoaded != null) {
+        t1 = configuration == null;
+        if (!(t1 ? _this._evaluate0$_configuration : configuration).isImplicit) {
+          message = namesInErrors ? H.S($.$get$context().prettyUri$1(url)) + string$.x20was_a : string$.This_mw;
+          existingNode = _this._evaluate0$_moduleNodes.$index(0, url);
+          t2 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_FileSpan, type$.legacy_String);
+          if (existingNode != null)
+            t2.$indexSet(0, existingNode.get$span(), "original load");
+          if (t1)
+            t2.$indexSet(0, _this._evaluate0$_configuration.nodeWithSpan.get$span(), "configuration");
+          throw H.wrapException(t2.get$isEmpty(t2) ? _this._evaluate0$_exception$1(message) : _this._evaluate0$_multiSpanException$3(message, "new load", t2));
+        }
+        return alreadyLoaded;
+      }
+      environment = O.Environment$0(_this._evaluate0$_sourceMap);
+      t1.css = null;
+      extender = F.Extender$0();
+      _this._evaluate0$_withEnvironment$2(environment, new R._EvaluateVisitor__execute_closure1(t1, _this, importer, stylesheet, extender, configuration));
+      module = O._EnvironmentModule__EnvironmentModule1(environment, t1.css, extender, environment._environment0$_forwardedModules);
+      t2.$indexSet(0, url, module);
+      _this._evaluate0$_moduleNodes.$indexSet(0, url, nodeWithSpan);
+      return module;
+    },
+    _evaluate0$_execute$2: function(importer, stylesheet) {
+      return this._evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan(importer, stylesheet, null, false, null);
+    },
+    _evaluate0$_addOutOfOrderImports$0: function() {
+      var t1, statements, _this = this;
+      if (_this._evaluate0$_outOfOrderImports == null)
+        return _this._evaluate0$_root.children;
+      t1 = new Array(J.get$length$asx(_this._evaluate0$_root.children._collection$_source) + _this._evaluate0$_outOfOrderImports.length);
+      t1.fixed$length = Array;
+      statements = new G.FixedLengthListBuilder0(H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_ModifiableCssNode_2), type$.FixedLengthListBuilder_legacy_ModifiableCssNode_2);
+      statements.addRange$3(_this._evaluate0$_root.children, 0, _this._evaluate0$_endOfImports);
+      statements.addAll$1(0, _this._evaluate0$_outOfOrderImports);
+      statements.addRange$2(_this._evaluate0$_root.children, _this._evaluate0$_endOfImports);
+      return statements.build$0();
+    },
+    _evaluate0$_combineCss$2$clone: function(root, clone) {
+      var selectors, unsatisfiedExtension, sortedModules, t1, imports, css, cur, t2, statements, index, _this = this;
+      if (!C.JSArray_methods.any$1(root.get$upstream(), new R._EvaluateVisitor__combineCss_closure5())) {
+        selectors = root.get$extender().get$simpleSelectors();
+        unsatisfiedExtension = B.firstOrNull0(root.get$extender().extensionsWhereTarget$1(new R._EvaluateVisitor__combineCss_closure6(selectors)));
+        if (unsatisfiedExtension != null)
+          _this._evaluate0$_throwForUnsatisfiedExtension$1(unsatisfiedExtension);
+        return root.get$css(root);
+      }
+      sortedModules = _this._evaluate0$_topologicalModules$1(root);
+      if (clone) {
+        t1 = sortedModules.$ti._eval$1("MappedListIterable<ListMixin.E,Module0<Callable0*>*>");
+        sortedModules = P.List_List$from(new H.MappedListIterable(sortedModules, new R._EvaluateVisitor__combineCss_closure7(), t1), true, t1._eval$1("ListIterable.E"));
+      }
+      _this._evaluate0$_extendModules$1(sortedModules);
+      t1 = type$.JSArray_legacy_CssNode_2;
+      imports = H.setRuntimeTypeInfo([], t1);
+      css = H.setRuntimeTypeInfo([], t1);
+      for (t1 = J.get$reversed$ax(sortedModules), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        t2 = cur.get$css(cur);
+        statements = t2.get$children(t2);
+        index = _this._evaluate0$_indexAfterImports$1(statements);
+        t2 = J.getInterceptor$ax(statements);
+        C.JSArray_methods.addAll$1(imports, t2.getRange$2(statements, 0, index));
+        C.JSArray_methods.addAll$1(css, t2.getRange$2(statements, index, t2.get$length(statements)));
+      }
+      return new V.CssStylesheet0(new P.UnmodifiableListView(C.JSArray_methods.$add(imports, css), type$.UnmodifiableListView_legacy_CssNode_2), root.get$css(root).get$span());
+    },
+    _evaluate0$_combineCss$1: function(root) {
+      return this._evaluate0$_combineCss$2$clone(root, false);
+    },
+    _evaluate0$_extendModules$1: function(sortedModules) {
+      var t1, t2, originalSelectors, extenders, t3, t4, _i,
+        downstreamExtenders = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_Uri, type$.legacy_List_legacy_Extender_2),
+        unsatisfiedExtensions = new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_Extension_2);
+      for (t1 = J.get$iterator$ax(sortedModules); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        originalSelectors = t2.get$extender().get$simpleSelectors().toSet$0(0);
+        unsatisfiedExtensions.addAll$1(0, t2.get$extender().extensionsWhereTarget$1(new R._EvaluateVisitor__extendModules_closure3(originalSelectors)));
+        extenders = downstreamExtenders.$index(0, t2.get$url());
+        if (extenders != null)
+          t2.get$extender().addExtensions$1(extenders);
+        t3 = t2.get$extender();
+        if (t3.get$isEmpty(t3))
+          continue;
+        for (t3 = t2.get$upstream(), t4 = t3.length, _i = 0; _i < t3.length; t3.length === t4 || (0, H.throwConcurrentModificationError)(t3), ++_i)
+          J.add$1$ax(downstreamExtenders.putIfAbsent$2(t3[_i].get$url(), new R._EvaluateVisitor__extendModules_closure4()), t2.get$extender());
+        unsatisfiedExtensions.removeAll$1(t2.get$extender().extensionsWhereTarget$1(originalSelectors.get$contains(originalSelectors)));
+      }
+      if (unsatisfiedExtensions._collection$_length !== 0)
+        this._evaluate0$_throwForUnsatisfiedExtension$1(unsatisfiedExtensions.get$first(unsatisfiedExtensions));
+    },
+    _evaluate0$_throwForUnsatisfiedExtension$1: function(extension) {
+      throw H.wrapException(E.SassException$0(string$.The_ta + H.S(extension.target) + ' !optional" to avoid this error.', extension.span));
+    },
+    _evaluate0$_topologicalModules$1: function(root) {
+      var t1 = type$.legacy_Module_legacy_Callable_2,
+        sorted = Q.QueueList$(null, t1);
+      new R._EvaluateVisitor__topologicalModules_visitModule1(P.LinkedHashSet_LinkedHashSet$_empty(t1), sorted).call$1(root);
+      return sorted;
+    },
+    _evaluate0$_indexAfterImports$1: function(statements) {
+      var t1, t2, t3, lastImport, i, statement;
+      for (t1 = J.getInterceptor$asx(statements), t2 = type$.legacy_CssComment_2, t3 = type$.legacy_CssImport_2, lastImport = -1, i = 0; i < t1.get$length(statements); ++i) {
+        statement = t1.$index(statements, i);
+        if (t3._is(statement))
+          lastImport = i;
+        else if (!t2._is(statement))
+          break;
+      }
+      return lastImport + 1;
+    },
+    visitStylesheet$1: function(node) {
+      var t1, t2, _i;
+      for (t1 = node.children, t2 = t1.length, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(this);
+      return null;
+    },
+    visitAtRootRule$1: function(node) {
+      var root, innerCopy, outerCopy, cur, copy, _this = this, _null = null,
+        t1 = node.query,
+        query = t1 != null ? _this._evaluate0$_adjustParseError$2(t1, new R._EvaluateVisitor_visitAtRootRule_closure5(_this, _this._evaluate0$_performInterpolation$2$warnForColor(t1, true))) : C.AtRootQuery_UsS0,
+        $parent = _this._evaluate0$_parent,
+        included = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssParentNode_2);
+      for (t1 = type$.legacy_CssStylesheet_2; !t1._is($parent);) {
+        if (!query.excludes$1($parent))
+          included.push($parent);
+        $parent = $parent._node2$_parent;
+      }
+      root = _this._evaluate0$_trimIncluded$1(included);
+      if (root == _this._evaluate0$_parent) {
+        _this._evaluate0$_environment.scope$1$2$when(new R._EvaluateVisitor_visitAtRootRule_closure6(_this, node), node.hasDeclarations, type$.Null);
+        return _null;
+      }
+      innerCopy = included.length === 0 ? _null : C.JSArray_methods.get$first(included).copyWithoutChildren$0();
+      for (t1 = H.SubListIterable$(included, 1, _null, type$.legacy_ModifiableCssParentNode_2), t1 = new H.ListIterator(t1, t1.get$length(t1)), outerCopy = innerCopy; t1.moveNext$0(); outerCopy = copy) {
+        cur = t1.__internal$_current;
+        copy = cur.copyWithoutChildren$0();
+        copy.addChild$1(outerCopy);
+      }
+      if (outerCopy != null)
+        root.addChild$1(outerCopy);
+      _this._evaluate0$_scopeForAtRoot$4(node, innerCopy == null ? root : innerCopy, query, included).call$1(new R._EvaluateVisitor_visitAtRootRule_closure7(_this, node));
+      return _null;
+    },
+    _evaluate0$_trimIncluded$1: function(nodes) {
+      var $parent, innermostContiguous, i, t2, root,
+        t1 = nodes.length;
+      if (t1 === 0)
+        return this._evaluate0$_root;
+      $parent = this._evaluate0$_parent;
+      for (innermostContiguous = null, i = 0; i < t1; ++i) {
+        for (; $parent != nodes[i]; innermostContiguous = null)
+          $parent = $parent._node2$_parent;
+        if (innermostContiguous == null)
+          innermostContiguous = i;
+        $parent = $parent._node2$_parent;
+      }
+      t2 = this._evaluate0$_root;
+      if ($parent != t2)
+        return t2;
+      root = nodes[innermostContiguous];
+      C.JSArray_methods.removeRange$2(nodes, innermostContiguous, t1);
+      return root;
+    },
+    _evaluate0$_scopeForAtRoot$4: function(node, newParent, query, included) {
+      var _this = this,
+        scope = new R._EvaluateVisitor__scopeForAtRoot_closure11(_this, newParent, node),
+        t1 = query._at_root_query0$_all || query._at_root_query0$_rule;
+      if (t1 !== query.include)
+        scope = new R._EvaluateVisitor__scopeForAtRoot_closure12(_this, scope);
+      if (_this._evaluate0$_mediaQueries != null && query.excludesName$1("media"))
+        scope = new R._EvaluateVisitor__scopeForAtRoot_closure13(_this, scope);
+      if (_this._evaluate0$_inKeyframes && query.excludesName$1("keyframes"))
+        scope = new R._EvaluateVisitor__scopeForAtRoot_closure14(_this, scope);
+      return _this._evaluate0$_inUnknownAtRule && !C.JSArray_methods.any$1(included, new R._EvaluateVisitor__scopeForAtRoot_closure15()) ? new R._EvaluateVisitor__scopeForAtRoot_closure16(_this, scope) : scope;
+    },
+    visitContentBlock$1: function(node) {
+      return H.throwExpression(P.UnsupportedError$(string$.Evalua));
+    },
+    visitContentRule$1: function(node) {
+      var $content = this._evaluate0$_environment._environment0$_content;
+      if ($content == null)
+        return null;
+      this._evaluate0$_runUserDefinedCallable$4(node.$arguments, $content, node, new R._EvaluateVisitor_visitContentRule_closure1(this, $content));
+      return null;
+    },
+    visitDebugRule$1: function(node) {
+      var value = node.expression.accept$1(this),
+        t1 = value instanceof D.SassString0 ? value.text : J.toString$0$(value);
+      this._evaluate0$_logger.debug$2(0, t1, node.span);
+      return null;
+    },
+    visitDeclaration$1: function(node) {
+      var t1, $name, t2, cssValue, t3, oldDeclarationName, _this = this;
+      if (!(_this._evaluate0$_styleRule != null && !_this._evaluate0$_atRootExcludingStyleRule) && !_this._evaluate0$_inUnknownAtRule && !_this._evaluate0$_inKeyframes)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Declarm, node.span));
+      t1 = node.name;
+      $name = _this._evaluate0$_interpolationToValue$2$warnForColor(t1, true);
+      t2 = _this._evaluate0$_declarationName;
+      if (t2 != null)
+        $name = new F.CssValue0(t2 + "-" + H.S($name.value), $name.span, type$.CssValue_legacy_String_2);
+      t2 = node.value;
+      cssValue = t2 == null ? null : new F.CssValue0(t2.accept$1(_this), t2.get$span(), type$.CssValue_legacy_Value_2);
+      if (cssValue != null) {
+        t3 = cssValue.value;
+        t3 = !t3.get$isBlank() || t3.get$asList().length === 0;
+      } else
+        t3 = false;
+      if (t3) {
+        t3 = _this._evaluate0$_parent;
+        t1 = C.JSString_methods.startsWith$1(t1.get$initialPlain(), "--");
+        t2 = _this._evaluate0$_expressionNode$1(t2);
+        t2 = t2 == null ? null : t2.get$span();
+        t3.addChild$1(L.ModifiableCssDeclaration$0($name, cssValue, node.span, t1, t2));
+      } else if (J.startsWith$1$s($name.value, "--") && node.children == null)
+        throw H.wrapException(_this._evaluate0$_exception$2("Custom property values may not be empty.", t2.get$span()));
+      if (node.children != null) {
+        oldDeclarationName = _this._evaluate0$_declarationName;
+        _this._evaluate0$_declarationName = $name.value;
+        _this._evaluate0$_environment.scope$1$2$when(new R._EvaluateVisitor_visitDeclaration_closure1(_this, node), node.hasDeclarations, type$.Null);
+        _this._evaluate0$_declarationName = oldDeclarationName;
+      }
+      return null;
+    },
+    visitEachRule$1: function(node) {
+      var _this = this,
+        t1 = node.list,
+        list = t1.accept$1(_this),
+        nodeWithSpan = _this._evaluate0$_expressionNode$1(t1),
+        setVariables = node.variables.length === 1 ? new R._EvaluateVisitor_visitEachRule_closure5(_this, node, nodeWithSpan) : new R._EvaluateVisitor_visitEachRule_closure6(_this, node, nodeWithSpan);
+      return _this._evaluate0$_environment.scope$1$2$semiGlobal(new R._EvaluateVisitor_visitEachRule_closure7(_this, list, setVariables, node), true, type$.legacy_Value_2);
+    },
+    _evaluate0$_setMultipleVariables$3: function(variables, value, nodeWithSpan) {
+      var i,
+        list = value.get$asList(),
+        t1 = variables.length,
+        minLength = Math.min(t1, list.length);
+      for (i = 0; i < minLength; ++i)
+        this._evaluate0$_environment.setLocalVariable$3(variables[i], list[i].withoutSlash$0(), nodeWithSpan);
+      for (i = minLength; i < t1; ++i)
+        this._evaluate0$_environment.setLocalVariable$3(variables[i], C.C_SassNull, nodeWithSpan);
+    },
+    visitErrorRule$1: function(node) {
+      throw H.wrapException(this._evaluate0$_exception$2(J.toString$0$(node.expression.accept$1(this)), node.span));
+    },
+    visitExtendRule$1: function(node) {
+      var targetText, t1, t2, t3, _i, t4, _this = this;
+      if (!(_this._evaluate0$_styleRule != null && !_this._evaluate0$_atRootExcludingStyleRule) || _this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.x40exten, node.span));
+      targetText = _this._evaluate0$_interpolationToValue$2$warnForColor(node.selector, true);
+      for (t1 = _this._evaluate0$_adjustParseError$2(targetText, new R._EvaluateVisitor_visitExtendRule_closure1(_this, targetText)).components, t2 = t1.length, t3 = type$.legacy_CompoundSelector_2, _i = 0; _i < t2; ++_i) {
+        t4 = t1[_i].components;
+        if (t4.length !== 1 || !(C.JSArray_methods.get$first(t4) instanceof X.CompoundSelector0))
+          throw H.wrapException(E.SassFormatException$0("complex selectors may not be extended.", targetText.span));
+        t4 = t3._as(C.JSArray_methods.get$first(t4)).components;
+        if (t4.length !== 1)
+          throw H.wrapException(E.SassFormatException$0(string$.compou + C.JSArray_methods.join$1(t4, ", ") + string$.x60_inst, targetText.span));
+        _this._evaluate0$_extender.addExtension$4(_this._evaluate0$_styleRule.selector, C.JSArray_methods.get$first(t4), node, _this._evaluate0$_mediaQueries);
+      }
+      return null;
+    },
+    visitAtRule$1: function(node) {
+      var $name, t1, value, wasInKeyframes, wasInUnknownAtRule, _this = this;
+      if (_this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.At_rul, node.span));
+      $name = _this._evaluate0$_interpolationToValue$1(node.name);
+      t1 = node.value;
+      value = t1 == null ? null : _this._evaluate0$_interpolationToValue$3$trim$warnForColor(t1, true, true);
+      if (node.children == null) {
+        _this._evaluate0$_parent.addChild$1(U.ModifiableCssAtRule$0($name, node.span, true, value));
+        return null;
+      }
+      wasInKeyframes = _this._evaluate0$_inKeyframes;
+      wasInUnknownAtRule = _this._evaluate0$_inUnknownAtRule;
+      if (B.unvendor0($name.value) === "keyframes")
+        _this._evaluate0$_inKeyframes = true;
+      else
+        _this._evaluate0$_inUnknownAtRule = true;
+      _this._evaluate0$_withParent$2$4$scopeWhen$through(U.ModifiableCssAtRule$0($name, node.span, false, value), new R._EvaluateVisitor_visitAtRule_closure3(_this, node), node.hasDeclarations, new R._EvaluateVisitor_visitAtRule_closure4(), type$.legacy_ModifiableCssAtRule_2, type$.Null);
+      _this._evaluate0$_inUnknownAtRule = wasInUnknownAtRule;
+      _this._evaluate0$_inKeyframes = wasInKeyframes;
+      return null;
+    },
+    visitForRule$1: function(node) {
+      var _this = this, t1 = {},
+        t2 = node.from,
+        fromNumber = _this._evaluate0$_addExceptionSpan$2(t2, new R._EvaluateVisitor_visitForRule_closure9(_this, node)),
+        t3 = node.to,
+        toNumber = _this._evaluate0$_addExceptionSpan$2(t3, new R._EvaluateVisitor_visitForRule_closure10(_this, node)),
+        from = _this._evaluate0$_addExceptionSpan$2(t2, new R._EvaluateVisitor_visitForRule_closure11(fromNumber)),
+        to = t1.to = _this._evaluate0$_addExceptionSpan$2(t3, new R._EvaluateVisitor_visitForRule_closure12(toNumber, fromNumber)),
+        direction = from > to ? -1 : 1;
+      if (from === (!node.isExclusive ? t1.to = to + direction : to))
+        return null;
+      return _this._evaluate0$_environment.scope$1$2$semiGlobal(new R._EvaluateVisitor_visitForRule_closure13(t1, _this, node, from, direction, fromNumber), true, type$.legacy_Value_2);
+    },
+    visitForwardRule$1: function(node) {
+      var newConfiguration, t4, _i, variable, _this = this,
+        _s8_ = "@forward",
+        oldConfiguration = _this._evaluate0$_configuration,
+        adjustedConfiguration = oldConfiguration.throughForward$1(node),
+        t1 = node.configuration,
+        t2 = t1.length,
+        t3 = node.url;
+      if (t2 !== 0) {
+        newConfiguration = _this._evaluate0$_addForwardConfiguration$2(adjustedConfiguration, node);
+        _this._evaluate0$_loadModule$5$configuration(t3, _s8_, node, new R._EvaluateVisitor_visitForwardRule_closure3(_this, node), newConfiguration);
+        t3 = type$.legacy_String;
+        t4 = P.LinkedHashSet_LinkedHashSet(t3);
+        for (_i = 0; _i < t2; ++_i) {
+          variable = t1[_i];
+          if (!variable.isGuarded)
+            t4.add$1(0, variable.name);
+        }
+        _this._evaluate0$_removeUsedConfiguration$3$except(adjustedConfiguration, newConfiguration, t4);
+        t3 = P.LinkedHashSet_LinkedHashSet(t3);
+        for (_i = 0; _i < t2; ++_i)
+          t3.add$1(0, t1[_i].name);
+        _this._evaluate0$_assertConfigurationIsEmpty$2$only(newConfiguration, t3);
+      } else {
+        _this._evaluate0$_configuration = adjustedConfiguration;
+        _this._evaluate0$_loadModule$4(t3, _s8_, node, new R._EvaluateVisitor_visitForwardRule_closure4(_this, node));
+        _this._evaluate0$_configuration = oldConfiguration;
+      }
+      return null;
+    },
+    _evaluate0$_addForwardConfiguration$2: function(configuration, node) {
+      var t2, t3, _i, variable, t4, t5,
+        t1 = configuration._configuration$_values,
+        newValues = P.LinkedHashMap_LinkedHashMap$of(new P.UnmodifiableMapView(t1, type$.UnmodifiableMapView_of_legacy_String_and_legacy_ConfiguredValue_2), type$.legacy_String, type$.legacy_ConfiguredValue_2);
+      for (t2 = node.configuration, t3 = t2.length, _i = 0; _i < t3; ++_i) {
+        variable = t2[_i];
+        if (variable.isGuarded) {
+          t4 = variable.name;
+          t5 = t1.get$isEmpty(t1) ? null : t1.remove$1(0, t4);
+          if (t5 != null && !J.$eq$(t5.value, C.C_SassNull)) {
+            newValues.$indexSet(0, t4, t5);
+            continue;
+          }
+        }
+        t4 = variable.name;
+        t5 = variable.expression;
+        newValues.$indexSet(0, t4, new Z.ConfiguredValue0(t5.accept$1(this).withoutSlash$0(), variable.span, this._evaluate0$_expressionNode$1(t5)));
+      }
+      return new A.Configuration0(newValues, node, false);
+    },
+    _evaluate0$_removeUsedConfiguration$3$except: function(upstream, downstream, except) {
+      var t1, t2, t3, t4, _i, $name;
+      for (t1 = upstream._configuration$_values, t2 = J.toList$0$ax(t1.get$keys(t1)), t3 = t2.length, t4 = downstream._configuration$_values, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i) {
+        $name = t2[_i];
+        if (except.contains$1(0, $name))
+          continue;
+        if (!t4.containsKey$1($name))
+          if (!t1.get$isEmpty(t1))
+            t1.remove$1(0, $name);
+      }
+    },
+    _evaluate0$_assertConfigurationIsEmpty$3$nameInError$only: function(configuration, nameInError, only) {
+      configuration._configuration$_values.forEach$1(0, new R._EvaluateVisitor__assertConfigurationIsEmpty_closure1(this, only, nameInError));
+    },
+    _evaluate0$_assertConfigurationIsEmpty$2$nameInError: function(configuration, nameInError) {
+      return this._evaluate0$_assertConfigurationIsEmpty$3$nameInError$only(configuration, nameInError, null);
+    },
+    _evaluate0$_assertConfigurationIsEmpty$1: function(configuration) {
+      return this._evaluate0$_assertConfigurationIsEmpty$3$nameInError$only(configuration, false, null);
+    },
+    _evaluate0$_assertConfigurationIsEmpty$2$only: function(configuration, only) {
+      return this._evaluate0$_assertConfigurationIsEmpty$3$nameInError$only(configuration, false, only);
+    },
+    visitFunctionRule$1: function(node) {
+      var t1 = this._evaluate0$_environment,
+        t2 = t1.closure$0(),
+        t3 = t1._environment0$_functions,
+        index = t3.length - 1,
+        t4 = node.name;
+      t1._environment0$_functionIndices.$indexSet(0, t4, index);
+      J.$indexSet$ax(t3[index], t4, new E.UserDefinedCallable0(node, t2, type$.UserDefinedCallable_legacy_Environment_2));
+      return null;
+    },
+    visitIfRule$1: function(node) {
+      var t1, t2, _i, clauseToCheck, _box_0 = {};
+      _box_0.clause = node.lastClause;
+      for (t1 = node.clauses, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        clauseToCheck = t1[_i];
+        if (clauseToCheck.expression.accept$1(this).get$isTruthy()) {
+          _box_0.clause = clauseToCheck;
+          break;
+        }
+      }
+      t1 = _box_0.clause;
+      if (t1 == null)
+        return null;
+      return this._evaluate0$_environment.scope$1$3$semiGlobal$when(new R._EvaluateVisitor_visitIfRule_closure1(_box_0, this), true, t1.hasDeclarations, type$.legacy_Value_2);
+    },
+    visitImportRule$1: function(node) {
+      var t1, t2, t3, t4, t5, t6, _i, $import, t7, result, supports, t8, t9, resolvedSupports, mediaQuery, t10, result0, _this = this, _null = null;
+      for (t1 = node.imports, t2 = t1.length, t3 = type$.legacy_CssMediaQuery_2, t4 = type$.CssValue_legacy_String_2, t5 = type$.legacy_StaticImport_2, t6 = type$.JSArray_legacy_ModifiableCssImport_2, _i = 0; _i < t2; ++_i) {
+        $import = t1[_i];
+        if ($import instanceof B.DynamicImport0)
+          _this._evaluate0$_visitDynamicImport$1($import);
+        else {
+          t5._as($import);
+          t7 = $import.url;
+          result = _this._evaluate0$_performInterpolation$2$warnForColor(t7, false);
+          supports = $import.supports;
+          if (supports instanceof L.SupportsDeclaration0) {
+            t8 = supports.name;
+            t8 = H.S(_this._evaluate0$_serialize$3$quote(t8.accept$1(_this), t8, true)) + ": ";
+            t9 = supports.value;
+            resolvedSupports = t8 + H.S(_this._evaluate0$_serialize$3$quote(t9.accept$1(_this), t9, true));
+          } else
+            resolvedSupports = supports == null ? _null : _this._evaluate0$_visitSupportsCondition$1(supports);
+          t8 = $import.media;
+          mediaQuery = t8 == null ? _null : _this._evaluate0$_visitMediaQueries$1(t8);
+          t8 = $import.span;
+          t9 = resolvedSupports == null ? _null : new F.CssValue0("supports(" + resolvedSupports + ")", supports.get$span(), t4);
+          if (mediaQuery == null)
+            t10 = _null;
+          else {
+            result0 = P.List_List$from(mediaQuery, false, t3);
+            result0.fixed$length = Array;
+            result0.immutable$list = Array;
+            t10 = result0;
+          }
+          node = new F.ModifiableCssImport0(new F.CssValue0(result, t7.span, t4), t9, t10, t8);
+          t7 = _this._evaluate0$_parent;
+          t8 = _this._evaluate0$_root;
+          if (t7 != t8)
+            t7.addChild$1(node);
+          else if (_this._evaluate0$_endOfImports === J.get$length$asx(t8.children._collection$_source)) {
+            t7 = _this._evaluate0$_root;
+            t7.toString;
+            node._node2$_parent = t7;
+            t7 = t7._node2$_children;
+            node._node2$_indexInParent = t7.length;
+            t7.push(node);
+            _this._evaluate0$_endOfImports = _this._evaluate0$_endOfImports + 1;
+          } else {
+            t7 = _this._evaluate0$_outOfOrderImports;
+            (t7 == null ? _this._evaluate0$_outOfOrderImports = H.setRuntimeTypeInfo([], t6) : t7).push(node);
+          }
+        }
+      }
+      return _null;
+    },
+    _evaluate0$_visitDynamicImport$1: function($import) {
+      return this._evaluate0$_withStackFrame$3("@import", $import, new R._EvaluateVisitor__visitDynamicImport_closure1(this, $import));
+    },
+    _evaluate0$_loadStylesheet$4$baseUrl$forImport: function(url, span, baseUrl, forImport) {
+      var stylesheet, tuple, error, error0, message, t1, t2, t3, exception, message0, _this = this;
+      try {
+        _this._evaluate0$_importSpan = span;
+        if (_this._nodeImporter != null) {
+          stylesheet = _this._importLikeNode$2(url, forImport);
+          if (stylesheet != null)
+            return new S.Tuple2(null, stylesheet, type$.Tuple2_of_legacy_Importer_and_legacy_Stylesheet_2);
+        } else {
+          t1 = P.Uri_parse(url);
+          t2 = _this._evaluate0$_importer;
+          if (baseUrl == null) {
+            t3 = _this._evaluate0$_stylesheet;
+            t3 = t3 == null ? null : t3.span;
+            t3 = t3 == null ? null : t3.file.url;
+          } else
+            t3 = baseUrl;
+          tuple = _this._evaluate0$_importCache.import$4$baseImporter$baseUrl$forImport(t1, t2, t3, forImport);
+          if (tuple != null)
+            return tuple;
+        }
+        if (C.JSString_methods.startsWith$1(url, "package:") && true)
+          throw H.wrapException(string$.x22packa);
+        else
+          throw H.wrapException("Can't find stylesheet to import.");
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassException0) {
+          error = t1;
+          t1 = _this._evaluate0$_exception$2(error._span_exception$_message, error.get$span());
+          throw H.wrapException(t1);
+        } else {
+          error0 = t1;
+          message = null;
+          try {
+            message = H._asStringS(J.get$message$x(error0));
+          } catch (exception) {
+            H.unwrapException(exception);
+            message0 = J.toString$0$(error0);
+            message = message0;
+          }
+          t1 = _this._evaluate0$_exception$1(message);
+          throw H.wrapException(t1);
+        }
+      } finally {
+        _this._evaluate0$_importSpan = null;
+      }
+    },
+    _evaluate0$_loadStylesheet$3$baseUrl: function(url, span, baseUrl) {
+      return this._evaluate0$_loadStylesheet$4$baseUrl$forImport(url, span, baseUrl, false);
+    },
+    _evaluate0$_loadStylesheet$3$forImport: function(url, span, forImport) {
+      return this._evaluate0$_loadStylesheet$4$baseUrl$forImport(url, span, null, forImport);
+    },
+    _importLikeNode$2: function(originalUrl, forImport) {
+      var contents, url, _this = this,
+        t1 = _this._evaluate0$_stylesheet.span,
+        result = _this._nodeImporter.load$3(0, originalUrl, t1.file.url, forImport);
+      if (result == null)
+        return null;
+      contents = result.item1;
+      url = result.item2;
+      t1 = J.getInterceptor$s(url).startsWith$1(url, "file:") ? $.$get$context().style.pathFromUri$1(M._parseUri(url)) : url;
+      _this._includedFiles.add$1(0, t1);
+      t1 = C.JSString_methods.startsWith$1(url, "file") ? M.Syntax_forPath0(url) : C.Syntax_SCSS0;
+      return V.Stylesheet_Stylesheet$parse0(contents, t1, _this._evaluate0$_logger, url);
+    },
+    visitIncludeRule$1: function(node) {
+      var nodeWithSpan, t1, t2, contentCallable, _this = this,
+        _s37_ = "Mixin doesn't accept a content block.",
+        mixin = _this._evaluate0$_addExceptionSpan$2(node, new R._EvaluateVisitor_visitIncludeRule_closure5(_this, node));
+      if (mixin == null)
+        throw H.wrapException(_this._evaluate0$_exception$2("Undefined mixin.", node.span));
+      nodeWithSpan = new B._FakeAstNode0(new R._EvaluateVisitor_visitIncludeRule_closure6(node));
+      if (mixin instanceof Q.BuiltInCallable0) {
+        if (node.content != null)
+          throw H.wrapException(_this._evaluate0$_exception$2(_s37_, node.span));
+        _this._evaluate0$_runBuiltInCallable$3(node.$arguments, mixin, nodeWithSpan);
+      } else if (type$.legacy_UserDefinedCallable_legacy_Environment_2._is(mixin)) {
+        t1 = node.content;
+        t2 = t1 == null;
+        if (!t2 && !type$.legacy_MixinRule_2._as(mixin.declaration).hasContent)
+          throw H.wrapException(E.MultiSpanSassRuntimeException$0(_s37_, node.get$spanWithoutContent(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([mixin.declaration.$arguments.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), _this._evaluate0$_stackTrace$1(node.get$spanWithoutContent())));
+        contentCallable = t2 ? null : new E.UserDefinedCallable0(t1, _this._evaluate0$_environment.closure$0(), type$.UserDefinedCallable_legacy_Environment_2);
+        _this._evaluate0$_runUserDefinedCallable$4(node.$arguments, mixin, nodeWithSpan, new R._EvaluateVisitor_visitIncludeRule_closure7(_this, contentCallable, mixin, nodeWithSpan));
+      } else
+        throw H.wrapException(P.UnsupportedError$("Unknown callable type " + mixin.toString$0(0) + "."));
+      return null;
+    },
+    visitMixinRule$1: function(node) {
+      var t1 = this._evaluate0$_environment,
+        t2 = t1.closure$0(),
+        t3 = t1._environment0$_mixins,
+        index = t3.length - 1,
+        t4 = node.name;
+      t1._environment0$_mixinIndices.$indexSet(0, t4, index);
+      J.$indexSet$ax(t3[index], t4, new E.UserDefinedCallable0(node, t2, type$.UserDefinedCallable_legacy_Environment_2));
+      return null;
+    },
+    visitLoudComment$1: function(node) {
+      var t1, t2, _this = this;
+      if (_this._evaluate0$_inFunction)
+        return null;
+      t1 = _this._evaluate0$_parent;
+      t2 = _this._evaluate0$_root;
+      if (t1 == t2 && _this._evaluate0$_endOfImports === J.get$length$asx(t2.children._collection$_source))
+        _this._evaluate0$_endOfImports = _this._evaluate0$_endOfImports + 1;
+      t1 = node.text;
+      _this._evaluate0$_parent.addChild$1(new R.ModifiableCssComment0(_this._evaluate0$_performInterpolation$1(t1), t1.span));
+      return null;
+    },
+    visitMediaRule$1: function(node) {
+      var queries, t1, mergedQueries, _this = this;
+      if (_this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Media_, node.span));
+      queries = _this._evaluate0$_visitMediaQueries$1(node.query);
+      t1 = _this._evaluate0$_mediaQueries;
+      mergedQueries = t1 == null ? null : _this._evaluate0$_mergeMediaQueries$2(t1, queries);
+      t1 = mergedQueries == null;
+      if (!t1 && mergedQueries.length === 0)
+        return null;
+      t1 = t1 ? queries : mergedQueries;
+      _this._evaluate0$_withParent$2$4$scopeWhen$through(G.ModifiableCssMediaRule$0(t1, node.span), new R._EvaluateVisitor_visitMediaRule_closure3(_this, mergedQueries, queries, node), node.hasDeclarations, new R._EvaluateVisitor_visitMediaRule_closure4(mergedQueries), type$.legacy_ModifiableCssMediaRule_2, type$.Null);
+      return null;
+    },
+    _evaluate0$_visitMediaQueries$1: function(interpolation) {
+      return this._evaluate0$_adjustParseError$2(interpolation, new R._EvaluateVisitor__visitMediaQueries_closure1(this, this._evaluate0$_performInterpolation$2$warnForColor(interpolation, true)));
+    },
+    _evaluate0$_mergeMediaQueries$2: function(queries1, queries2) {
+      var t1, t2, t3, t4, t5, result,
+        queries = H.setRuntimeTypeInfo([], type$.JSArray_legacy_CssMediaQuery_2);
+      for (t1 = J.get$iterator$ax(queries1), t2 = J.getInterceptor$ax(queries2), t3 = type$.legacy_MediaQuerySuccessfulMergeResult_2; t1.moveNext$0();) {
+        t4 = t1.get$current(t1);
+        for (t5 = t2.get$iterator(queries2); t5.moveNext$0();) {
+          result = t4.merge$1(t5.get$current(t5));
+          if (result === C._SingletonCssMediaQueryMergeResult_empty0)
+            continue;
+          if (result === C._SingletonCssMediaQueryMergeResult_unrepresentable0)
+            return null;
+          queries.push(t3._as(result).query);
+        }
+      }
+      return queries;
+    },
+    visitReturnRule$1: function(node) {
+      return node.expression.accept$1(this);
+    },
+    visitSilentComment$1: function(node) {
+      return null;
+    },
+    visitStyleRule$1: function(node) {
+      var t2, selectorText, parsedSelector, rule, oldAtRootExcludingStyleRule, _this = this, t1 = {};
+      if (_this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Style_, node.span));
+      t2 = node.selector;
+      selectorText = _this._evaluate0$_interpolationToValue$3$trim$warnForColor(t2, true, true);
+      if (_this._evaluate0$_inKeyframes) {
+        _this._evaluate0$_withParent$2$4$scopeWhen$through(U.ModifiableCssKeyframeBlock$0(new F.CssValue0(P.List_List$unmodifiable(_this._evaluate0$_adjustParseError$2(t2, new R._EvaluateVisitor_visitStyleRule_closure13(_this, selectorText)), type$.legacy_String), t2.span, type$.CssValue_legacy_List_legacy_String_2), node.span), new R._EvaluateVisitor_visitStyleRule_closure14(_this, node), node.hasDeclarations, new R._EvaluateVisitor_visitStyleRule_closure15(), type$.legacy_ModifiableCssKeyframeBlock_2, type$.Null);
+        return null;
+      }
+      t1.parsedSelector = _this._evaluate0$_adjustParseError$2(t2, new R._EvaluateVisitor_visitStyleRule_closure16(_this, selectorText));
+      parsedSelector = _this._evaluate0$_addExceptionSpan$2(t2, new R._EvaluateVisitor_visitStyleRule_closure17(t1, _this));
+      t1.parsedSelector = parsedSelector;
+      rule = X.ModifiableCssStyleRule$0(_this._evaluate0$_extender.addSelector$3(parsedSelector, t2.span, _this._evaluate0$_mediaQueries), node.span, t1.parsedSelector);
+      oldAtRootExcludingStyleRule = _this._evaluate0$_atRootExcludingStyleRule;
+      _this._evaluate0$_atRootExcludingStyleRule = false;
+      _this._evaluate0$_withParent$2$4$scopeWhen$through(rule, new R._EvaluateVisitor_visitStyleRule_closure18(_this, rule, node), node.hasDeclarations, new R._EvaluateVisitor_visitStyleRule_closure19(), type$.legacy_ModifiableCssStyleRule_2, type$.Null);
+      _this._evaluate0$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+      if (!(_this._evaluate0$_styleRule != null && !oldAtRootExcludingStyleRule)) {
+        t1 = _this._evaluate0$_parent.children;
+        t1 = !t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = _this._evaluate0$_parent.children;
+        t1.get$last(t1).isGroupEnd = true;
+      }
+      return null;
+    },
+    visitSupportsRule$1: function(node) {
+      var t1, _this = this;
+      if (_this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Suppor, node.span));
+      t1 = node.condition;
+      _this._evaluate0$_withParent$2$4$scopeWhen$through(B.ModifiableCssSupportsRule$0(new F.CssValue0(_this._evaluate0$_visitSupportsCondition$1(t1), t1.get$span(), type$.CssValue_legacy_String_2), node.span), new R._EvaluateVisitor_visitSupportsRule_closure3(_this, node), node.hasDeclarations, new R._EvaluateVisitor_visitSupportsRule_closure4(), type$.legacy_ModifiableCssSupportsRule_2, type$.Null);
+      return null;
+    },
+    _evaluate0$_visitSupportsCondition$1: function(condition) {
+      var t1, t2, _this = this;
+      if (condition instanceof U.SupportsOperation0) {
+        t1 = condition.left;
+        t2 = condition.operator;
+        return H.S(_this._evaluate0$_parenthesize$2(t1, t2)) + " " + t2 + " " + H.S(_this._evaluate0$_parenthesize$2(condition.right, t2));
+      } else if (condition instanceof M.SupportsNegation0)
+        return "not " + H.S(_this._evaluate0$_parenthesize$1(condition.condition));
+      else if (condition instanceof X.SupportsInterpolation0) {
+        t1 = condition.expression;
+        return _this._evaluate0$_serialize$3$quote(t1.accept$1(_this), t1, false);
+      } else if (condition instanceof L.SupportsDeclaration0) {
+        t1 = condition.name;
+        t1 = "(" + H.S(_this._evaluate0$_serialize$3$quote(t1.accept$1(_this), t1, true)) + ": ";
+        t2 = condition.value;
+        return t1 + H.S(_this._evaluate0$_serialize$3$quote(t2.accept$1(_this), t2, true)) + ")";
+      } else if (condition instanceof F.SupportsFunction0)
+        return _this._evaluate0$_performInterpolation$1(condition.name) + "(" + _this._evaluate0$_performInterpolation$1(condition.$arguments) + ")";
+      else if (condition instanceof Y.SupportsAnything0)
+        return "(" + _this._evaluate0$_performInterpolation$1(condition.contents) + ")";
+      else
+        return null;
+    },
+    _evaluate0$_parenthesize$2: function(condition, operator) {
+      var t1;
+      if (!(condition instanceof M.SupportsNegation0))
+        if (condition instanceof U.SupportsOperation0)
+          t1 = operator == null || operator !== condition.operator;
+        else
+          t1 = false;
+      else
+        t1 = true;
+      if (t1)
+        return "(" + H.S(this._evaluate0$_visitSupportsCondition$1(condition)) + ")";
+      else
+        return this._evaluate0$_visitSupportsCondition$1(condition);
+    },
+    _evaluate0$_parenthesize$1: function(condition) {
+      return this._evaluate0$_parenthesize$2(condition, null);
+    },
+    visitVariableDeclaration$1: function(node) {
+      var t1, value, t2, _this = this, _null = null;
+      if (node.isGuarded) {
+        if (node.namespace == null && _this._evaluate0$_environment._environment0$_variables.length === 1) {
+          t1 = _this._evaluate0$_configuration._configuration$_values;
+          t1 = t1.get$isEmpty(t1) ? _null : t1.remove$1(0, node.name);
+          if (t1 != null) {
+            _this._evaluate0$_addExceptionSpan$2(node, new R._EvaluateVisitor_visitVariableDeclaration_closure5(_this, node, t1));
+            return _null;
+          }
+        }
+        value = _this._evaluate0$_addExceptionSpan$2(node, new R._EvaluateVisitor_visitVariableDeclaration_closure6(_this, node));
+        if (value != null && !value.$eq(0, C.C_SassNull))
+          return _null;
+      }
+      if (node.isGlobal && !_this._evaluate0$_environment.globalVariableExists$1(node.name)) {
+        t1 = _this._evaluate0$_environment._environment0$_variables.length === 1 ? string$.As_of_S : string$.As_of_C + B.declarationName0(node.span) + ": null` at the root of the\nstylesheet.";
+        t2 = node.span;
+        _this._evaluate0$_logger.warn$4$deprecation$span$trace(0, t1, true, t2, _this._evaluate0$_stackTrace$1(t2));
+      }
+      _this._evaluate0$_addExceptionSpan$2(node, new R._EvaluateVisitor_visitVariableDeclaration_closure7(_this, node, node.expression.accept$1(_this).withoutSlash$0()));
+      return _null;
+    },
+    visitUseRule$1: function(node) {
+      var configuration, t3, _i, variable, t4, t5, _this = this,
+        t1 = node.configuration,
+        t2 = t1.length;
+      if (t2 === 0)
+        configuration = C.Configuration_Map_empty_null_true0;
+      else {
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_ConfiguredValue_2);
+        for (_i = 0; _i < t2; ++_i) {
+          variable = t1[_i];
+          t4 = variable.name;
+          t5 = variable.expression;
+          t3.$indexSet(0, t4, new Z.ConfiguredValue0(t5.accept$1(_this).withoutSlash$0(), variable.span, _this._evaluate0$_expressionNode$1(t5)));
+        }
+        configuration = new A.Configuration0(t3, node, false);
+      }
+      _this._evaluate0$_loadModule$5$configuration(node.url, "@use", node, new R._EvaluateVisitor_visitUseRule_closure1(_this, node), configuration);
+      _this._evaluate0$_assertConfigurationIsEmpty$1(configuration);
+      return null;
+    },
+    visitWarnRule$1: function(node) {
+      var _this = this,
+        value = _this._evaluate0$_addExceptionSpan$2(node, new R._EvaluateVisitor_visitWarnRule_closure1(_this, node)),
+        t1 = value instanceof D.SassString0 ? value.text : _this._evaluate0$_serialize$2(value, node.expression);
+      _this._evaluate0$_logger.warn$2$trace(0, t1, _this._evaluate0$_stackTrace$1(node.span));
+      return null;
+    },
+    visitWhileRule$1: function(node) {
+      return this._evaluate0$_environment.scope$1$3$semiGlobal$when(new R._EvaluateVisitor_visitWhileRule_closure1(this, node), true, node.hasDeclarations, type$.legacy_Value_2);
+    },
+    visitBinaryOperationExpression$1: function(node) {
+      return this._evaluate0$_addExceptionSpan$2(node, new R._EvaluateVisitor_visitBinaryOperationExpression_closure1(this, node));
+    },
+    visitValueExpression$1: function(node) {
+      return node.value;
+    },
+    visitVariableExpression$1: function(node) {
+      var result = this._evaluate0$_addExceptionSpan$2(node, new R._EvaluateVisitor_visitVariableExpression_closure1(this, node));
+      if (result != null)
+        return result;
+      throw H.wrapException(this._evaluate0$_exception$2("Undefined variable.", node.span));
+    },
+    visitUnaryOperationExpression$1: function(node) {
+      var operand = node.operand.accept$1(this),
+        t1 = node.operator;
+      switch (t1) {
+        case C.UnaryOperator_j2w0:
+          return operand.unaryPlus$0();
+        case C.UnaryOperator_U4G0:
+          return operand.unaryMinus$0();
+        case C.UnaryOperator_zDx0:
+          operand.toString;
+          return new D.SassString0("/" + N.serializeValue(operand, false, true), false);
+        case C.UnaryOperator_not_not0:
+          return operand.unaryNot$0();
+        default:
+          throw H.wrapException(P.StateError$("Unknown unary operator " + H.S(t1) + "."));
+      }
+    },
+    visitBooleanExpression$1: function(node) {
+      return node.value ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    visitIfExpression$1: function(node) {
+      var condition, ifTrue, ifFalse, _this = this,
+        pair = _this._evaluate0$_evaluateMacroArguments$1(node),
+        positional = pair.item1,
+        named = pair.item2,
+        t1 = J.getInterceptor$asx(positional);
+      _this._evaluate0$_verifyArguments$4(t1.get$length(positional), named, $.$get$IfExpression_declaration0(), node);
+      condition = t1.get$length(positional) > 0 ? t1.$index(positional, 0) : named.$index(0, "condition");
+      ifTrue = t1.get$length(positional) > 1 ? t1.$index(positional, 1) : named.$index(0, "if-true");
+      ifFalse = t1.get$length(positional) > 2 ? t1.$index(positional, 2) : named.$index(0, "if-false");
+      return (condition.accept$1(_this).get$isTruthy() ? ifTrue : ifFalse).accept$1(_this);
+    },
+    visitNullExpression$1: function(node) {
+      return C.C_SassNull;
+    },
+    visitNumberExpression$1: function(node) {
+      var t1 = node.value,
+        t2 = node.unit;
+      return t2 == null ? new N.UnitlessSassNumber0(t1, null) : new L.SingleUnitSassNumber0(t2, t1, null);
+    },
+    visitParenthesizedExpression$1: function(node) {
+      return node.expression.accept$1(this);
+    },
+    visitColorExpression$1: function(node) {
+      return node.value;
+    },
+    visitListExpression$1: function(node) {
+      var t1 = node.contents;
+      return D.SassList$0(new H.MappedListIterable(t1, new R._EvaluateVisitor_visitListExpression_closure1(this), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Value0*>")), node.separator, node.hasBrackets);
+    },
+    visitMapExpression$1: function(node) {
+      var t2, t3, _i, pair, t4, keyValue, valueValue,
+        t1 = type$.legacy_Value_2,
+        map = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1),
+        keyNodes = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_AstNode_2);
+      for (t2 = node.pairs, t3 = t2.length, _i = 0; _i < t3; ++_i) {
+        pair = t2[_i];
+        t4 = pair.item1;
+        keyValue = t4.accept$1(this);
+        valueValue = pair.item2.accept$1(this);
+        if (map.containsKey$1(keyValue))
+          throw H.wrapException(E.MultiSpanSassRuntimeException$0("Duplicate key.", t4.get$span(), "second key", P.LinkedHashMap_LinkedHashMap$_literal([keyNodes.$index(0, keyValue).get$span(), "first key"], type$.legacy_FileSpan, type$.legacy_String), this._evaluate0$_stackTrace$1(t4.get$span())));
+        map.$indexSet(0, keyValue, valueValue);
+        keyNodes.$indexSet(0, keyValue, t4);
+      }
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(map, t1, t1));
+    },
+    visitFunctionExpression$1: function(node) {
+      var oldInFunction, result, _this = this, t1 = {},
+        t2 = node.name,
+        plainName = t2.get$asPlain();
+      t1.$function = null;
+      if ((plainName != null ? t1.$function = _this._evaluate0$_addExceptionSpan$2(node, new R._EvaluateVisitor_visitFunctionExpression_closure3(_this, node, plainName)) : null) == null) {
+        if (node.namespace != null)
+          throw H.wrapException(_this._evaluate0$_exception$2("Undefined function.", node.span));
+        t1.$function = new L.PlainCssCallable0(_this._evaluate0$_performInterpolation$1(t2));
+      }
+      oldInFunction = _this._evaluate0$_inFunction;
+      _this._evaluate0$_inFunction = true;
+      result = _this._evaluate0$_addErrorSpan$2(node, new R._EvaluateVisitor_visitFunctionExpression_closure4(t1, _this, node));
+      _this._evaluate0$_inFunction = oldInFunction;
+      return result;
+    },
+    _evaluate0$_getFunction$2$namespace: function($name, namespace) {
+      var local = this._evaluate0$_environment.getFunction$2$namespace($name, namespace);
+      if (local != null || namespace != null)
+        return local;
+      return this._evaluate0$_builtInFunctions.$index(0, $name);
+    },
+    _evaluate0$_runUserDefinedCallable$4: function($arguments, callable, nodeWithSpan, run) {
+      var evaluated = this._evaluate0$_evaluateArguments$1($arguments),
+        t1 = callable.declaration.name,
+        $name = t1 == null ? "@content" : t1 + "()";
+      return this._evaluate0$_withStackFrame$3($name, nodeWithSpan, new R._EvaluateVisitor__runUserDefinedCallable_closure1(this, callable, evaluated, nodeWithSpan, run));
+    },
+    _evaluate0$_runFunctionCallable$3: function($arguments, callable, nodeWithSpan) {
+      var result, t1, t2, t3, first, _i, argument, rest, _this = this;
+      if (callable instanceof Q.BuiltInCallable0) {
+        result = _this._evaluate0$_runBuiltInCallable$3($arguments, callable, nodeWithSpan);
+        if (result == null)
+          throw H.wrapException(_this._evaluate0$_exception$2(string$.Custom, nodeWithSpan.get$span()));
+        return result.withoutSlash$0();
+      } else if (type$.legacy_UserDefinedCallable_legacy_Environment_2._is(callable))
+        return _this._evaluate0$_runUserDefinedCallable$4($arguments, callable, nodeWithSpan, new R._EvaluateVisitor__runFunctionCallable_closure1(_this, callable)).withoutSlash$0();
+      else if (callable instanceof L.PlainCssCallable0) {
+        t1 = $arguments.named;
+        if (t1.get$isNotEmpty(t1) || $arguments.keywordRest != null)
+          throw H.wrapException(_this._evaluate0$_exception$2(string$.Plain_, nodeWithSpan.get$span()));
+        t1 = H.S(callable.name) + "(";
+        for (t2 = $arguments.positional, t3 = t2.length, first = true, _i = 0; _i < t3; ++_i) {
+          argument = t2[_i];
+          if (first)
+            first = false;
+          else
+            t1 += ", ";
+          t1 += H.S(_this._evaluate0$_serialize$3$quote(argument.accept$1(_this), argument, true));
+        }
+        t2 = $arguments.rest;
+        rest = t2 == null ? null : t2.accept$1(_this);
+        if (rest != null) {
+          if (!first)
+            t1 += ", ";
+          t2 = t1 + H.S(_this._evaluate0$_serialize$2(rest, t2));
+          t1 = t2;
+        }
+        t1 += H.Primitives_stringFromCharCode(41);
+        return new D.SassString0(t1.charCodeAt(0) == 0 ? t1 : t1, false);
+      } else
+        return null;
+    },
+    _evaluate0$_runBuiltInCallable$3: function($arguments, callable, nodeWithSpan) {
+      var callback, result, error, error0, error1, message, namedSet, tuple, overload, declaredArguments, i, t1, argument, t2, t3, rest, argumentList, exception, message0, _this = this,
+        evaluated = _this._evaluate0$_evaluateArguments$2$trackSpans($arguments, false),
+        oldCallableNode = _this._evaluate0$_callableNode;
+      _this._evaluate0$_callableNode = nodeWithSpan;
+      namedSet = new M.MapKeySet(evaluated.named, type$.MapKeySet_legacy_String);
+      tuple = callable.callbackFor$2(evaluated.positional.length, namedSet);
+      overload = tuple.item1;
+      callback = tuple.item2;
+      _this._evaluate0$_addExceptionSpan$2(nodeWithSpan, new R._EvaluateVisitor__runBuiltInCallable_closure3(overload, evaluated, namedSet));
+      declaredArguments = overload.$arguments;
+      for (i = evaluated.positional.length, t1 = declaredArguments.length; i < t1; ++i) {
+        argument = declaredArguments[i];
+        t2 = evaluated.positional;
+        t3 = evaluated.named.remove$1(0, argument.name);
+        if (t3 == null) {
+          t3 = argument.defaultValue;
+          t3 = t3 == null ? null : t3.accept$1(_this);
+        }
+        t2.push(t3);
+      }
+      if (overload.restArgument != null) {
+        if (evaluated.positional.length > t1) {
+          rest = C.JSArray_methods.sublist$1(evaluated.positional, t1);
+          C.JSArray_methods.removeRange$2(evaluated.positional, t1, evaluated.positional.length);
+        } else
+          rest = C.List_empty16;
+        t1 = evaluated.named;
+        argumentList = D.SassArgumentList$0(rest, t1, evaluated.separator === C.ListSeparator_undecided0 ? C.ListSeparator_comma0 : evaluated.separator);
+        evaluated.positional.push(argumentList);
+      } else
+        argumentList = null;
+      result = null;
+      try {
+        result = callback.call$1(evaluated.positional);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_SassRuntimeException_2._is(t1))
+          throw exception;
+        else if (t1 instanceof E.MultiSpanSassScriptException0) {
+          error = t1;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$0(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, _this._evaluate0$_stackTrace$1(nodeWithSpan.get$span())));
+        } else if (t1 instanceof E.MultiSpanSassException0) {
+          error0 = t1;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$0(error0._span_exception$_message, error0.get$span(), error0.primaryLabel, error0.secondarySpans, _this._evaluate0$_stackTrace$1(error0.get$span())));
+        } else {
+          error1 = t1;
+          message = null;
+          try {
+            message = H._asStringS(J.get$message$x(error1));
+          } catch (exception) {
+            H.unwrapException(exception);
+            message0 = J.toString$0$(error1);
+            message = message0;
+          }
+          throw H.wrapException(_this._evaluate0$_exception$2(message, nodeWithSpan.get$span()));
+        }
+      }
+      _this._evaluate0$_callableNode = oldCallableNode;
+      if (argumentList == null)
+        return result;
+      t1 = evaluated.named;
+      if (t1.get$isEmpty(t1))
+        return result;
+      if (argumentList._argument_list$_wereKeywordsAccessed)
+        return result;
+      t1 = evaluated.named;
+      t1 = t1.get$keys(t1);
+      t1 = "No " + B.pluralize0("argument", t1.get$length(t1), null) + " named ";
+      t2 = evaluated.named;
+      throw H.wrapException(E.MultiSpanSassRuntimeException$0(t1 + H.S(B.toSentence0(t2.get$keys(t2).map$1$1(0, new R._EvaluateVisitor__runBuiltInCallable_closure4(), type$.legacy_Object), "or")) + ".", nodeWithSpan.get$span(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([overload.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), _this._evaluate0$_stackTrace$1(nodeWithSpan.get$span())));
+    },
+    _evaluate0$_evaluateArguments$2$trackSpans: function($arguments, trackSpans) {
+      var t1, t2, t3, _i, t4, t5, t6, t7, t8, t9, positionalNodes, namedNodes, rest, restNodeForSpan, separator, keywordRest, keywordRestNodeForSpan, _this = this, _null = null;
+      if (trackSpans == null)
+        trackSpans = _this._evaluate0$_sourceMap;
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+      for (t2 = $arguments.positional, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t1.push(t2[_i].accept$1(_this));
+      t4 = type$.legacy_String;
+      t5 = type$.legacy_Value_2;
+      t6 = P.LinkedHashMap_LinkedHashMap$_empty(t4, t5);
+      for (t7 = $arguments.named, t8 = t7.get$entries(t7), t8 = t8.get$iterator(t8); t8.moveNext$0();) {
+        t9 = t8.get$current(t8);
+        t6.$indexSet(0, t9.key, t9.value.accept$1(_this));
+      }
+      if (trackSpans) {
+        t8 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_AstNode_2);
+        for (_i = 0; _i < t3; ++_i)
+          t8.push(_this._evaluate0$_expressionNode$1(t2[_i]));
+        positionalNodes = t8;
+      } else
+        positionalNodes = _null;
+      if (trackSpans) {
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode_2);
+        for (t3 = t7.get$entries(t7), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+          t7 = t3.get$current(t3);
+          t2.$indexSet(0, t7.key, _this._evaluate0$_expressionNode$1(t7.value));
+        }
+        namedNodes = t2;
+      } else
+        namedNodes = _null;
+      t2 = $arguments.rest;
+      if (t2 == null)
+        return new R._ArgumentResults1(t1, positionalNodes, t6, namedNodes, C.ListSeparator_undecided0);
+      rest = t2.accept$1(_this);
+      restNodeForSpan = trackSpans ? _this._evaluate0$_expressionNode$1(t2) : _null;
+      if (rest instanceof A.SassMap0) {
+        _this._evaluate0$_addRestMap$1$3(t6, rest, t2, t5);
+        if (namedNodes != null) {
+          t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode_2);
+          for (t3 = rest.contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), t7 = type$.legacy_SassString_2; t3.moveNext$0();)
+            t2.$indexSet(0, t7._as(t3.get$current(t3)).text, restNodeForSpan);
+          namedNodes.addAll$1(0, t2);
+        }
+        separator = C.ListSeparator_undecided0;
+      } else if (rest instanceof D.SassList0) {
+        t2 = rest._list1$_contents;
+        C.JSArray_methods.addAll$1(t1, t2);
+        if (positionalNodes != null)
+          C.JSArray_methods.addAll$1(positionalNodes, P.List_List$filled(t2.length, restNodeForSpan, false, type$.legacy_AstNode_2));
+        separator = rest.separator;
+        if (rest instanceof D.SassArgumentList0) {
+          rest._argument_list$_wereKeywordsAccessed = true;
+          rest._argument_list$_keywords.forEach$1(0, new R._EvaluateVisitor__evaluateArguments_closure1(t6, namedNodes, restNodeForSpan));
+        }
+      } else {
+        t1.push(rest);
+        if (positionalNodes != null)
+          positionalNodes.push(restNodeForSpan);
+        separator = C.ListSeparator_undecided0;
+      }
+      t2 = $arguments.keywordRest;
+      if (t2 == null)
+        return new R._ArgumentResults1(t1, positionalNodes, t6, namedNodes, separator);
+      keywordRest = t2.accept$1(_this);
+      keywordRestNodeForSpan = trackSpans ? _this._evaluate0$_expressionNode$1(t2) : _null;
+      if (keywordRest instanceof A.SassMap0) {
+        _this._evaluate0$_addRestMap$1$3(t6, keywordRest, t2, t5);
+        if (namedNodes != null) {
+          t2 = P.LinkedHashMap_LinkedHashMap$_empty(t4, type$.legacy_AstNode_2);
+          for (t3 = keywordRest.contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), t4 = type$.legacy_SassString_2; t3.moveNext$0();)
+            t2.$indexSet(0, t4._as(t3.get$current(t3)).text, keywordRestNodeForSpan);
+          namedNodes.addAll$1(0, t2);
+        }
+        return new R._ArgumentResults1(t1, positionalNodes, t6, namedNodes, separator);
+      } else
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Variabs + H.S(keywordRest) + ").", t2.get$span()));
+    },
+    _evaluate0$_evaluateArguments$1: function($arguments) {
+      return this._evaluate0$_evaluateArguments$2$trackSpans($arguments, null);
+    },
+    _evaluate0$_evaluateMacroArguments$1: function(invocation) {
+      var t3, positional, named, rest, keywordRest, _this = this,
+        t1 = invocation.$arguments,
+        t2 = t1.rest;
+      if (t2 == null)
+        return new S.Tuple2(t1.positional, t1.named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2);
+      t3 = t1.positional;
+      positional = H.setRuntimeTypeInfo(t3.slice(0), H._arrayInstanceType(t3)._eval$1("JSArray<1>"));
+      t3 = type$.legacy_Expression_2;
+      named = P.LinkedHashMap_LinkedHashMap$of(t1.named, type$.legacy_String, t3);
+      rest = t2.accept$1(_this);
+      if (rest instanceof A.SassMap0)
+        _this._evaluate0$_addRestMap$1$4(named, rest, invocation, new R._EvaluateVisitor__evaluateMacroArguments_closure7(), t3);
+      else if (rest instanceof D.SassList0) {
+        t2 = rest._list1$_contents;
+        C.JSArray_methods.addAll$1(positional, new H.MappedListIterable(t2, new R._EvaluateVisitor__evaluateMacroArguments_closure8(), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Expression0*>")));
+        if (rest instanceof D.SassArgumentList0) {
+          rest._argument_list$_wereKeywordsAccessed = true;
+          rest._argument_list$_keywords.forEach$1(0, new R._EvaluateVisitor__evaluateMacroArguments_closure9(named));
+        }
+      } else
+        positional.push(new F.ValueExpression0(rest, null));
+      t1 = t1.keywordRest;
+      if (t1 == null)
+        return new S.Tuple2(positional, named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2);
+      keywordRest = t1.accept$1(_this);
+      if (keywordRest instanceof A.SassMap0) {
+        _this._evaluate0$_addRestMap$1$4(named, keywordRest, invocation, new R._EvaluateVisitor__evaluateMacroArguments_closure10(), t3);
+        return new S.Tuple2(positional, named, type$.Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2);
+      } else
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Variabs + H.S(keywordRest) + ").", invocation.span));
+    },
+    _evaluate0$_addRestMap$1$4: function(values, map, nodeWithSpan, convert, $T) {
+      var t1 = {};
+      t1.convert = convert;
+      if (convert == null)
+        t1.convert = new R._EvaluateVisitor__addRestMap_closure3($T);
+      map.contents.forEach$1(0, new R._EvaluateVisitor__addRestMap_closure4(t1, this, values, map, nodeWithSpan));
+    },
+    _evaluate0$_addRestMap$1$3: function(values, map, nodeWithSpan, $T) {
+      return this._evaluate0$_addRestMap$1$4(values, map, nodeWithSpan, null, $T);
+    },
+    _evaluate0$_verifyArguments$4: function(positional, named, $arguments, nodeWithSpan) {
+      return this._evaluate0$_addExceptionSpan$2(nodeWithSpan, new R._EvaluateVisitor__verifyArguments_closure1($arguments, positional, named));
+    },
+    visitSelectorExpression$1: function(node) {
+      var t1 = this._evaluate0$_styleRule;
+      if (t1 == null)
+        return C.C_SassNull;
+      return t1.originalSelector.get$asSassList();
+    },
+    visitStringExpression$1: function(node) {
+      var t1 = node.text.contents;
+      return new D.SassString0(new H.MappedListIterable(t1, new R._EvaluateVisitor_visitStringExpression_closure1(this), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0), node.hasQuotes);
+    },
+    visitCssAtRule$1: function(node) {
+      var wasInKeyframes, wasInUnknownAtRule, t1, _this = this;
+      if (_this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.At_rul, node.span));
+      if (node.isChildless) {
+        _this._evaluate0$_parent.addChild$1(U.ModifiableCssAtRule$0(node.name, node.span, true, node.value));
+        return null;
+      }
+      wasInKeyframes = _this._evaluate0$_inKeyframes;
+      wasInUnknownAtRule = _this._evaluate0$_inUnknownAtRule;
+      t1 = node.name;
+      if (B.unvendor0(t1.get$value(t1)) === "keyframes")
+        _this._evaluate0$_inKeyframes = true;
+      else
+        _this._evaluate0$_inUnknownAtRule = true;
+      _this._evaluate0$_withParent$2$4$scopeWhen$through(U.ModifiableCssAtRule$0(t1, node.span, false, node.value), new R._EvaluateVisitor_visitCssAtRule_closure3(_this, node), false, new R._EvaluateVisitor_visitCssAtRule_closure4(), type$.legacy_ModifiableCssAtRule_2, type$.Null);
+      _this._evaluate0$_inUnknownAtRule = wasInUnknownAtRule;
+      _this._evaluate0$_inKeyframes = wasInKeyframes;
+    },
+    visitCssComment$1: function(node) {
+      var _this = this,
+        t1 = _this._evaluate0$_parent,
+        t2 = _this._evaluate0$_root;
+      if (t1 == t2 && _this._evaluate0$_endOfImports === J.get$length$asx(t2.children._collection$_source))
+        _this._evaluate0$_endOfImports = _this._evaluate0$_endOfImports + 1;
+      _this._evaluate0$_parent.addChild$1(new R.ModifiableCssComment0(node.text, node.span));
+    },
+    visitCssDeclaration$1: function(node) {
+      var t1 = node.name;
+      this._evaluate0$_parent.addChild$1(L.ModifiableCssDeclaration$0(t1, node.value, node.span, J.startsWith$1$s(t1.get$value(t1), "--"), node.valueSpanForMap));
+    },
+    visitCssImport$1: function(node) {
+      var _this = this,
+        modifiableNode = F.ModifiableCssImport$0(node.url, node.span, node.media, node.supports),
+        t1 = _this._evaluate0$_parent,
+        t2 = _this._evaluate0$_root;
+      if (t1 != t2)
+        t1.addChild$1(modifiableNode);
+      else if (_this._evaluate0$_endOfImports === J.get$length$asx(t2.children._collection$_source)) {
+        _this._evaluate0$_root.addChild$1(modifiableNode);
+        _this._evaluate0$_endOfImports = _this._evaluate0$_endOfImports + 1;
+      } else {
+        t1 = _this._evaluate0$_outOfOrderImports;
+        (t1 == null ? _this._evaluate0$_outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport_2) : t1).push(modifiableNode);
+      }
+    },
+    visitCssKeyframeBlock$1: function(node) {
+      this._evaluate0$_withParent$2$4$scopeWhen$through(U.ModifiableCssKeyframeBlock$0(node.selector, node.span), new R._EvaluateVisitor_visitCssKeyframeBlock_closure3(this, node), false, new R._EvaluateVisitor_visitCssKeyframeBlock_closure4(), type$.legacy_ModifiableCssKeyframeBlock_2, type$.Null);
+    },
+    visitCssMediaRule$1: function(node) {
+      var t1, mergedQueries, _this = this;
+      if (_this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Media_, node.span));
+      t1 = _this._evaluate0$_mediaQueries;
+      mergedQueries = t1 == null ? null : _this._evaluate0$_mergeMediaQueries$2(t1, node.queries);
+      t1 = mergedQueries == null;
+      if (!t1 && mergedQueries.length === 0)
+        return null;
+      t1 = t1 ? node.queries : mergedQueries;
+      _this._evaluate0$_withParent$2$4$scopeWhen$through(G.ModifiableCssMediaRule$0(t1, node.span), new R._EvaluateVisitor_visitCssMediaRule_closure3(_this, mergedQueries, node), false, new R._EvaluateVisitor_visitCssMediaRule_closure4(mergedQueries), type$.legacy_ModifiableCssMediaRule_2, type$.Null);
+    },
+    visitCssStyleRule$1: function(node) {
+      var t1, t2, t3, originalSelector, rule, oldAtRootExcludingStyleRule, _this = this;
+      if (_this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Style_, node.span));
+      t1 = node.selector;
+      t2 = t1.value;
+      t3 = _this._evaluate0$_styleRule;
+      t3 = t3 == null ? null : t3.originalSelector;
+      originalSelector = t2.resolveParentSelectors$2$implicitParent(t3, !_this._evaluate0$_atRootExcludingStyleRule);
+      rule = X.ModifiableCssStyleRule$0(_this._evaluate0$_extender.addSelector$3(originalSelector, t1.span, _this._evaluate0$_mediaQueries), node.span, originalSelector);
+      oldAtRootExcludingStyleRule = _this._evaluate0$_atRootExcludingStyleRule;
+      _this._evaluate0$_atRootExcludingStyleRule = false;
+      _this._evaluate0$_withParent$2$4$scopeWhen$through(rule, new R._EvaluateVisitor_visitCssStyleRule_closure3(_this, rule, node), false, new R._EvaluateVisitor_visitCssStyleRule_closure4(), type$.legacy_ModifiableCssStyleRule_2, type$.Null);
+      _this._evaluate0$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+      if (!(_this._evaluate0$_styleRule != null && !oldAtRootExcludingStyleRule)) {
+        t1 = _this._evaluate0$_parent.children;
+        t1 = !t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = _this._evaluate0$_parent.children;
+        t1.get$last(t1).isGroupEnd = true;
+      }
+    },
+    visitCssStylesheet$1: function(node) {
+      var t1;
+      for (t1 = J.get$iterator$ax(node.get$children(node)); t1.moveNext$0();)
+        t1.get$current(t1).accept$1(this);
+    },
+    visitCssSupportsRule$1: function(node) {
+      var _this = this;
+      if (_this._evaluate0$_declarationName != null)
+        throw H.wrapException(_this._evaluate0$_exception$2(string$.Suppor, node.span));
+      _this._evaluate0$_withParent$2$4$scopeWhen$through(B.ModifiableCssSupportsRule$0(node.condition, node.span), new R._EvaluateVisitor_visitCssSupportsRule_closure3(_this, node), false, new R._EvaluateVisitor_visitCssSupportsRule_closure4(), type$.legacy_ModifiableCssSupportsRule_2, type$.Null);
+    },
+    _evaluate0$_handleReturn$1$2: function(list, callback) {
+      var t1, _i, result;
+      for (t1 = list.length, _i = 0; _i < list.length; list.length === t1 || (0, H.throwConcurrentModificationError)(list), ++_i) {
+        result = callback.call$1(list[_i]);
+        if (result != null)
+          return result;
+      }
+      return null;
+    },
+    _evaluate0$_handleReturn$2: function(list, callback) {
+      return this._evaluate0$_handleReturn$1$2(list, callback, type$.dynamic);
+    },
+    _evaluate0$_withEnvironment$1$2: function(environment, callback) {
+      var result,
+        oldEnvironment = this._evaluate0$_environment;
+      this._evaluate0$_environment = environment;
+      result = callback.call$0();
+      this._evaluate0$_environment = oldEnvironment;
+      return result;
+    },
+    _evaluate0$_withEnvironment$2: function(environment, callback) {
+      return this._evaluate0$_withEnvironment$1$2(environment, callback, type$.dynamic);
+    },
+    _evaluate0$_interpolationToValue$3$trim$warnForColor: function(interpolation, trim, warnForColor) {
+      var result = this._evaluate0$_performInterpolation$2$warnForColor(interpolation, warnForColor),
+        t1 = trim ? B.trimAscii0(result, true) : result;
+      return new F.CssValue0(t1, interpolation.span, type$.CssValue_legacy_String_2);
+    },
+    _evaluate0$_interpolationToValue$1: function(interpolation) {
+      return this._evaluate0$_interpolationToValue$3$trim$warnForColor(interpolation, false, false);
+    },
+    _evaluate0$_interpolationToValue$2$warnForColor: function(interpolation, warnForColor) {
+      return this._evaluate0$_interpolationToValue$3$trim$warnForColor(interpolation, false, warnForColor);
+    },
+    _evaluate0$_performInterpolation$2$warnForColor: function(interpolation, warnForColor) {
+      var t1 = interpolation.contents;
+      return new H.MappedListIterable(t1, new R._EvaluateVisitor__performInterpolation_closure1(this, warnForColor), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0);
+    },
+    _evaluate0$_performInterpolation$1: function(interpolation) {
+      return this._evaluate0$_performInterpolation$2$warnForColor(interpolation, false);
+    },
+    _evaluate0$_serialize$3$quote: function(value, nodeWithSpan, quote) {
+      return this._evaluate0$_addExceptionSpan$2(nodeWithSpan, new R._EvaluateVisitor__serialize_closure1(value, quote));
+    },
+    _evaluate0$_serialize$2: function(value, nodeWithSpan) {
+      return this._evaluate0$_serialize$3$quote(value, nodeWithSpan, true);
+    },
+    _evaluate0$_expressionNode$1: function(expression) {
+      var t1;
+      if (!this._evaluate0$_sourceMap)
+        return null;
+      if (expression instanceof S.VariableExpression0) {
+        t1 = this._evaluate0$_environment.getVariableNode$2$namespace(expression.name, expression.namespace);
+        return t1 == null ? expression : t1;
+      } else
+        return expression;
+    },
+    _evaluate0$_withParent$2$4$scopeWhen$through: function(node, callback, scopeWhen, through, $S, $T) {
+      var oldParent, result, _this = this;
+      _this._evaluate0$_addChild$2$through(node, through);
+      oldParent = _this._evaluate0$_parent;
+      _this._evaluate0$_parent = node;
+      result = _this._evaluate0$_environment.scope$1$2$when(callback, scopeWhen, $T._eval$1("0*"));
+      _this._evaluate0$_parent = oldParent;
+      return result;
+    },
+    _evaluate0$_withParent$2$3$scopeWhen: function(node, callback, scopeWhen, $S, $T) {
+      return this._evaluate0$_withParent$2$4$scopeWhen$through(node, callback, scopeWhen, null, $S, $T);
+    },
+    _evaluate0$_withParent$2$2: function(node, callback, $S, $T) {
+      return this._evaluate0$_withParent$2$4$scopeWhen$through(node, callback, true, null, $S, $T);
+    },
+    _evaluate0$_addChild$2$through: function(node, through) {
+      var grandparent,
+        $parent = this._evaluate0$_parent;
+      if (through != null) {
+        for (; through.call$1($parent);)
+          $parent = $parent._node2$_parent;
+        if ($parent.get$hasFollowingSibling()) {
+          grandparent = $parent._node2$_parent;
+          $parent = $parent.copyWithoutChildren$0();
+          grandparent.addChild$1($parent);
+        }
+      }
+      $parent.addChild$1(node);
+    },
+    _evaluate0$_addChild$1: function(node) {
+      return this._evaluate0$_addChild$2$through(node, null);
+    },
+    _evaluate0$_withStyleRule$1$2: function(rule, callback) {
+      var result,
+        oldRule = this._evaluate0$_styleRule;
+      this._evaluate0$_styleRule = rule;
+      result = callback.call$0();
+      this._evaluate0$_styleRule = oldRule;
+      return result;
+    },
+    _evaluate0$_withStyleRule$2: function(rule, callback) {
+      return this._evaluate0$_withStyleRule$1$2(rule, callback, type$.dynamic);
+    },
+    _evaluate0$_withMediaQueries$1$2: function(queries, callback) {
+      var result,
+        oldMediaQueries = this._evaluate0$_mediaQueries;
+      this._evaluate0$_mediaQueries = queries;
+      result = callback.call$0();
+      this._evaluate0$_mediaQueries = oldMediaQueries;
+      return result;
+    },
+    _evaluate0$_withMediaQueries$2: function(queries, callback) {
+      return this._evaluate0$_withMediaQueries$1$2(queries, callback, type$.dynamic);
+    },
+    _evaluate0$_withStackFrame$1$3: function(member, nodeWithSpan, callback) {
+      var oldMember, result, _this = this,
+        t1 = _this._evaluate0$_stack;
+      t1.push(new S.Tuple2(_this._evaluate0$_member, nodeWithSpan, type$.Tuple2_of_legacy_String_and_legacy_AstNode_2));
+      oldMember = _this._evaluate0$_member;
+      _this._evaluate0$_member = member;
+      result = callback.call$0();
+      _this._evaluate0$_member = oldMember;
+      t1.pop();
+      return result;
+    },
+    _evaluate0$_withStackFrame$3: function(member, nodeWithSpan, callback) {
+      return this._evaluate0$_withStackFrame$1$3(member, nodeWithSpan, callback, type$.dynamic);
+    },
+    _evaluate0$_stackFrame$2: function(member, span) {
+      var url = span.file.url;
+      return B.frameForSpan0(span, member, url != null && this._evaluate0$_importCache != null ? this._evaluate0$_importCache.humanize$1(url) : url);
+    },
+    _evaluate0$_stackTrace$1: function(span) {
+      var t2, cur, _this = this,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Frame);
+      for (t2 = _this._evaluate0$_stack, t2 = new H.MappedListIterable(t2, new R._EvaluateVisitor__stackTrace_closure1(_this), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Frame*>")), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        t1.push(cur);
+      }
+      if (span != null)
+        t1.push(_this._evaluate0$_stackFrame$2(_this._evaluate0$_member, span));
+      return new Y.Trace(P.List_List$unmodifiable(new H.ReversedListIterable(t1, type$.ReversedListIterable_legacy_Frame), type$.legacy_Frame), new P._StringStackTrace(null));
+    },
+    _evaluate0$_stackTrace$0: function() {
+      return this._evaluate0$_stackTrace$1(null);
+    },
+    _evaluate0$_warn$3$deprecation: function(message, span, deprecation) {
+      return this._evaluate0$_logger.warn$4$deprecation$span$trace(0, message, deprecation, span, this._evaluate0$_stackTrace$1(span));
+    },
+    _evaluate0$_warn$2: function(message, span) {
+      return this._evaluate0$_warn$3$deprecation(message, span, false);
+    },
+    _evaluate0$_exception$2: function(message, span) {
+      var t1 = span == null ? C.JSArray_methods.get$last(this._evaluate0$_stack).item2.get$span() : span;
+      return new E.SassRuntimeException0(this._evaluate0$_stackTrace$1(span), message, t1);
+    },
+    _evaluate0$_exception$1: function(message) {
+      return this._evaluate0$_exception$2(message, null);
+    },
+    _evaluate0$_multiSpanException$3: function(message, primaryLabel, secondaryLabels) {
+      var t1 = C.JSArray_methods.get$last(this._evaluate0$_stack).item2.get$span();
+      return new E.MultiSpanSassRuntimeException0(this._evaluate0$_stackTrace$0(), primaryLabel, H.ConstantMap_ConstantMap$from(secondaryLabels, type$.legacy_FileSpan, type$.legacy_String), message, t1);
+    },
+    _evaluate0$_adjustParseError$1$2: function(nodeWithSpan, callback) {
+      var error, errorText, span, syntheticFile, syntheticSpan, t1, exception, t2, t3, t4, t5, _null = null;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException0) {
+          error = t1;
+          t1 = error;
+          errorText = P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(G.SourceSpanException.prototype.get$span.call(t1).file._decodedChars, 0, _null), 0, _null);
+          span = nodeWithSpan.get$span();
+          t1 = span;
+          t2 = span;
+          syntheticFile = C.JSString_methods.replaceRange$3(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(span.file._decodedChars, 0, _null), 0, _null), Y.FileLocation$_(t1.file, t1._file$_start).offset, Y.FileLocation$_(t2.file, t2._end).offset, errorText);
+          t2 = Y.SourceFile$fromString(syntheticFile, span.file.url);
+          t1 = span;
+          t1 = Y.FileLocation$_(t1.file, t1._file$_start);
+          t3 = error;
+          t3 = G.SourceSpanException.prototype.get$span.call(t3);
+          t3 = Y.FileLocation$_(t3.file, t3._file$_start);
+          t4 = span;
+          t4 = Y.FileLocation$_(t4.file, t4._file$_start);
+          t5 = error;
+          t5 = G.SourceSpanException.prototype.get$span.call(t5);
+          syntheticSpan = t2.span$2(t1.offset + t3.offset, t4.offset + Y.FileLocation$_(t5.file, t5._end).offset);
+          throw H.wrapException(this._evaluate0$_exception$2(error._span_exception$_message, syntheticSpan));
+        } else
+          throw exception;
+      }
+    },
+    _evaluate0$_adjustParseError$2: function(nodeWithSpan, callback) {
+      return this._evaluate0$_adjustParseError$1$2(nodeWithSpan, callback, type$.dynamic);
+    },
+    _evaluate0$_addExceptionSpan$1$2: function(nodeWithSpan, callback) {
+      var error, error0, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.MultiSpanSassScriptException0) {
+          error = t1;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$0(error.message, nodeWithSpan.get$span(), error.primaryLabel, error.secondarySpans, this._evaluate0$_stackTrace$1(nodeWithSpan.get$span())));
+        } else if (t1 instanceof E.SassScriptException0) {
+          error0 = t1;
+          throw H.wrapException(this._evaluate0$_exception$2(error0.message, nodeWithSpan.get$span()));
+        } else
+          throw exception;
+      }
+    },
+    _evaluate0$_addExceptionSpan$2: function(nodeWithSpan, callback) {
+      return this._evaluate0$_addExceptionSpan$1$2(nodeWithSpan, callback, type$.dynamic);
+    },
+    _evaluate0$_addErrorSpan$1$2: function(nodeWithSpan, callback) {
+      var error, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_SassRuntimeException_2._is(t1)) {
+          error = t1;
+          t1 = error.get$span();
+          if (!C.JSString_methods.startsWith$1(P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t1.file._decodedChars, t1._file$_start, t1._end), 0, null), "@error"))
+            throw exception;
+          throw H.wrapException(E.SassRuntimeException$0(error._span_exception$_message, nodeWithSpan.get$span(), this._evaluate0$_stackTrace$0()));
+        } else
+          throw exception;
+      }
+    },
+    _evaluate0$_addErrorSpan$2: function(nodeWithSpan, callback) {
+      return this._evaluate0$_addErrorSpan$1$2(nodeWithSpan, callback, type$.dynamic);
+    }
+  };
+  R._EvaluateVisitor_closure19.prototype = {
+    call$1: function($arguments) {
+      var module, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this._evaluate0$_environment;
+      t2 = variable.text;
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return t1.globalVariableExists$2$namespace(t2, module == null ? null : module.text) ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  R._EvaluateVisitor_closure20.prototype = {
+    call$1: function($arguments) {
+      var variable = J.$index$asx($arguments, 0).assertString$1("name"),
+        t1 = this.$this._evaluate0$_environment,
+        t2 = variable.text;
+      t2.toString;
+      return t1.getVariable$1(H.stringReplaceAllUnchecked(t2, "_", "-")) != null ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  R._EvaluateVisitor_closure21.prototype = {
+    call$1: function($arguments) {
+      var module, t2, t3, t4,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this;
+      t2 = t1._evaluate0$_environment;
+      t3 = variable.text;
+      t3.toString;
+      t4 = H.stringReplaceAllUnchecked(t3, "_", "-");
+      return t2.getFunction$2$namespace(t4, module == null ? null : module.text) != null || t1._evaluate0$_builtInFunctions.containsKey$1(t3) ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  R._EvaluateVisitor_closure22.prototype = {
+    call$1: function($arguments) {
+      var module, t2,
+        t1 = J.getInterceptor$asx($arguments),
+        variable = t1.$index($arguments, 0).assertString$1("name");
+      t1 = t1.$index($arguments, 1).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      t1 = this.$this._evaluate0$_environment;
+      t2 = variable.text;
+      t2.toString;
+      t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return t1.getMixin$2$namespace(t2, module == null ? null : module.text) != null ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  R._EvaluateVisitor_closure23.prototype = {
+    call$1: function($arguments) {
+      var t1 = this.$this._evaluate0$_environment;
+      if (!t1._environment0$_inMixin)
+        throw H.wrapException(E.SassScriptException$0(string$.conten));
+      return t1._environment0$_content != null ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  R._EvaluateVisitor_closure24.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.$index$asx($arguments, 0).assertString$1("module").text,
+        module = this.$this._evaluate0$_environment._environment0$_modules.$index(0, t1);
+      if (module == null)
+        throw H.wrapException('There is no module with namespace "' + H.S(t1) + '".');
+      t1 = type$.legacy_Value_2;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = module.get$variables(), t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, new D.SassString0(t4.key, true), t4.value);
+      }
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 37
+  };
+  R._EvaluateVisitor_closure25.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.$index$asx($arguments, 0).assertString$1("module").text,
+        module = this.$this._evaluate0$_environment._environment0$_modules.$index(0, t1);
+      if (module == null)
+        throw H.wrapException('There is no module with namespace "' + H.S(t1) + '".');
+      t1 = type$.legacy_Value_2;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = module.get$functions(module), t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, new D.SassString0(t4.key, true), new F.SassFunction0(t4.value));
+      }
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 37
+  };
+  R._EvaluateVisitor_closure26.prototype = {
+    call$1: function($arguments) {
+      var module, callable,
+        t1 = J.getInterceptor$asx($arguments),
+        $name = t1.$index($arguments, 0).assertString$1("name"),
+        css = t1.$index($arguments, 1).get$isTruthy();
+      t1 = t1.$index($arguments, 2).get$realNull();
+      module = t1 == null ? null : t1.assertString$1("module");
+      if (css && module != null)
+        throw H.wrapException(string$.x24css_a);
+      if (css)
+        callable = new L.PlainCssCallable0($name.text);
+      else {
+        t1 = this.$this;
+        callable = t1._evaluate0$_addExceptionSpan$2(t1._evaluate0$_callableNode, new R._EvaluateVisitor__closure7(t1, $name, module));
+      }
+      if (callable != null)
+        return new F.SassFunction0(callable);
+      throw H.wrapException("Function not found: " + $name.toString$0(0));
+    },
+    $signature: 162
+  };
+  R._EvaluateVisitor__closure7.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this.name.text;
+      t1.toString;
+      t1 = H.stringReplaceAllUnchecked(t1, "_", "-");
+      t2 = this.module;
+      t2 = t2 == null ? null : t2.text;
+      return this.$this._evaluate0$_getFunction$2$namespace(t1, t2);
+    },
+    $signature: 90
+  };
+  R._EvaluateVisitor_closure27.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4, t5, t6, t7, t8, t9, t10, invocation, callable,
+        t1 = J.getInterceptor$asx($arguments),
+        $function = t1.$index($arguments, 0),
+        args = type$.legacy_SassArgumentList_2._as(t1.$index($arguments, 1));
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression_2);
+      t2 = type$.legacy_String;
+      t3 = type$.legacy_Expression_2;
+      t4 = this.$this;
+      t5 = t4._evaluate0$_callableNode.get$span();
+      t6 = t4._evaluate0$_callableNode.get$span();
+      args._argument_list$_wereKeywordsAccessed = true;
+      t7 = args._argument_list$_keywords;
+      if (t7.get$isEmpty(t7))
+        t7 = null;
+      else {
+        t8 = type$.legacy_Value_2;
+        t9 = P.LinkedHashMap_LinkedHashMap$_empty(t8, t8);
+        for (args._argument_list$_wereKeywordsAccessed = true, t7 = t7.get$entries(t7), t7 = t7.get$iterator(t7); t7.moveNext$0();) {
+          t10 = t7.get$current(t7);
+          t9.$indexSet(0, new D.SassString0(t10.key, false), t10.value);
+        }
+        t7 = new F.ValueExpression0(new A.SassMap0(H.ConstantMap_ConstantMap$from(t9, t8, t8)), t4._evaluate0$_callableNode.get$span());
+      }
+      invocation = new X.ArgumentInvocation0(P.List_List$unmodifiable(t1, t3), H.ConstantMap_ConstantMap$from(P.LinkedHashMap_LinkedHashMap$_empty(t2, t3), t2, t3), new F.ValueExpression0(args, t6), t7, t5);
+      if ($function instanceof D.SassString0) {
+        N.warn0(string$.Passin + $function.toString$0(0) + ")) instead.", true);
+        return t4.visitFunctionExpression$1(new F.FunctionExpression0(null, X.Interpolation$0(H.setRuntimeTypeInfo([$function.text], type$.JSArray_legacy_Object), t4._evaluate0$_callableNode.get$span()), invocation, t4._evaluate0$_callableNode.get$span()));
+      }
+      callable = $function.assertFunction$1("function").callable;
+      if (type$.legacy_Callable_2._is(callable))
+        return t4._evaluate0$_runFunctionCallable$3(invocation, callable, t4._evaluate0$_callableNode);
+      else
+        throw H.wrapException(E.SassScriptException$0("The function " + H.S(callable.get$name(callable)) + string$.x20is_as));
+    },
+    $signature: 3
+  };
+  R._EvaluateVisitor_closure28.prototype = {
+    call$1: function($arguments) {
+      var withMap, values, configuration, t2, t3, _null = null,
+        t1 = J.getInterceptor$asx($arguments),
+        url = P.Uri_parse(t1.$index($arguments, 0).assertString$1("url").text);
+      t1 = t1.$index($arguments, 1).get$realNull();
+      t1 = t1 == null ? _null : t1.assertMap$1("with");
+      withMap = t1 == null ? _null : t1.contents;
+      if (withMap != null) {
+        values = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_ConfiguredValue_2);
+        t1 = this.$this;
+        withMap.forEach$1(0, new R._EvaluateVisitor__closure5(values, t1._evaluate0$_callableNode.get$span()));
+        configuration = new A.Configuration0(values, t1._evaluate0$_callableNode, false);
+      } else
+        configuration = C.Configuration_Map_empty_null_true0;
+      t1 = this.$this;
+      t2 = t1._evaluate0$_callableNode;
+      t3 = t2.get$span();
+      t3 = t3 == null ? _null : t3.file.url;
+      t1._evaluate0$_loadModule$7$baseUrl$configuration$namesInErrors(url, "load-css()", t2, new R._EvaluateVisitor__closure6(t1), t3, configuration, true);
+      t1._evaluate0$_assertConfigurationIsEmpty$2$nameInError(configuration, true);
+      return _null;
+    },
+    $signature: 98
+  };
+  R._EvaluateVisitor__closure5.prototype = {
+    call$2: function(variable, value) {
+      var $name,
+        t1 = variable.assertString$1("with key").text;
+      t1.toString;
+      $name = H.stringReplaceAllUnchecked(t1, "_", "-");
+      t1 = this.values;
+      if (t1.containsKey$1($name))
+        throw H.wrapException("The variable $" + $name + " was configured twice.");
+      t1.$indexSet(0, $name, new Z.ConfiguredValue0(value, this.span, null));
+    },
+    $signature: 45
+  };
+  R._EvaluateVisitor__closure6.prototype = {
+    call$1: function(module) {
+      var t1 = this.$this;
+      return t1._evaluate0$_combineCss$2$clone(module, true).accept$1(t1);
+    },
+    $signature: 186
+  };
+  R._EvaluateVisitor_run_closure1.prototype = {
+    call$0: function() {
+      var t2, _this = this,
+        t1 = _this.node,
+        url = t1.span.file.url;
+      if (url != null) {
+        t2 = _this.$this;
+        t2._evaluate0$_activeModules.$indexSet(0, url, null);
+        if (t2._nodeImporter != null)
+          if (url.get$scheme() === "file")
+            t2._includedFiles.add$1(0, $.$get$context().style.pathFromUri$1(M._parseUri(url)));
+          else if (url.toString$0(0) !== "stdin")
+            t2._includedFiles.add$1(0, url.toString$0(0));
+      }
+      t2 = _this.$this;
+      return new E.EvaluateResult0(t2._evaluate0$_combineCss$1(t2._evaluate0$_execute$2(_this.importer, t1)), t2._includedFiles);
+    },
+    $signature: 337
+  };
+  R._EvaluateVisitor__withWarnCallback_closure1.prototype = {
+    call$2: function(message, deprecation) {
+      var t1 = this.$this,
+        t2 = t1._evaluate0$_importSpan;
+      return t1._evaluate0$_warn$3$deprecation(message, t2 == null ? t1._evaluate0$_callableNode.get$span() : t2, deprecation);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 72
+  };
+  R._EvaluateVisitor__loadModule_closure3.prototype = {
+    call$0: function() {
+      return this.callback.call$1(this.builtInModule);
+    },
+    $signature: 1
+  };
+  R._EvaluateVisitor__loadModule_closure4.prototype = {
+    call$0: function() {
+      var module, error, error0, error1, error2, message, previousLoad, exception, _this = this,
+        t1 = _this.$this,
+        t2 = _this.nodeWithSpan,
+        result = t1._evaluate0$_loadStylesheet$3$baseUrl(J.toString$0$(_this.url), t2.get$span(), _this.baseUrl),
+        importer = result.item1,
+        stylesheet = result.item2,
+        canonicalUrl = stylesheet.span.file.url,
+        t3 = t1._evaluate0$_activeModules;
+      if (t3.containsKey$1(canonicalUrl)) {
+        message = _this.namesInErrors ? "Module loop: " + H.S($.$get$context().prettyUri$1(canonicalUrl)) + " is already being loaded." : string$.Module;
+        previousLoad = t3.$index(0, canonicalUrl);
+        throw H.wrapException(previousLoad == null ? t1._evaluate0$_exception$1(message) : t1._evaluate0$_multiSpanException$3(message, "new load", P.LinkedHashMap_LinkedHashMap$_literal([previousLoad.get$span(), "original load"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+      t3.$indexSet(0, canonicalUrl, t2);
+      module = null;
+      try {
+        module = t1._evaluate0$_execute$5$configuration$namesInErrors$nodeWithSpan(importer, stylesheet, _this.configuration, _this.namesInErrors, t2);
+      } finally {
+        t3.remove$1(0, canonicalUrl);
+      }
+      try {
+        _this.callback.call$1(module);
+      } catch (exception) {
+        t2 = H.unwrapException(exception);
+        if (type$.legacy_SassRuntimeException_2._is(t2))
+          throw exception;
+        else if (t2 instanceof E.MultiSpanSassException0) {
+          error = t2;
+          throw H.wrapException(E.MultiSpanSassRuntimeException$0(error._span_exception$_message, error.get$span(), error.primaryLabel, error.secondarySpans, t1._evaluate0$_stackTrace$1(error.get$span())));
+        } else if (t2 instanceof E.SassException0) {
+          error0 = t2;
+          throw H.wrapException(t1._evaluate0$_exception$2(error0._span_exception$_message, error0.get$span()));
+        } else if (t2 instanceof E.MultiSpanSassScriptException0) {
+          error1 = t2;
+          throw H.wrapException(t1._evaluate0$_multiSpanException$3(error1.message, error1.primaryLabel, error1.secondarySpans));
+        } else if (t2 instanceof E.SassScriptException0) {
+          error2 = t2;
+          throw H.wrapException(t1._evaluate0$_exception$1(error2.message));
+        } else
+          throw exception;
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor__execute_closure1.prototype = {
+    call$0: function() {
+      var t2, t3, t4, css, _this = this,
+        t1 = _this.$this,
+        oldImporter = t1._evaluate0$_importer,
+        oldStylesheet = t1._evaluate0$_stylesheet,
+        oldRoot = t1._evaluate0$_root,
+        oldParent = t1._evaluate0$_parent,
+        oldEndOfImports = t1._evaluate0$_endOfImports,
+        oldOutOfOrderImports = t1._evaluate0$_outOfOrderImports,
+        oldExtender = t1._evaluate0$_extender,
+        oldStyleRule = t1._evaluate0$_styleRule,
+        oldMediaQueries = t1._evaluate0$_mediaQueries,
+        oldDeclarationName = t1._evaluate0$_declarationName,
+        oldInUnknownAtRule = t1._evaluate0$_inUnknownAtRule,
+        oldAtRootExcludingStyleRule = t1._evaluate0$_atRootExcludingStyleRule,
+        oldInKeyframes = t1._evaluate0$_inKeyframes,
+        oldConfiguration = t1._evaluate0$_configuration;
+      t1._evaluate0$_importer = _this.importer;
+      t2 = t1._evaluate0$_stylesheet = _this.stylesheet;
+      t3 = t2.span;
+      t1._evaluate0$_parent = t1._evaluate0$_root = V.ModifiableCssStylesheet$0(t3);
+      t1._evaluate0$_endOfImports = 0;
+      t1._evaluate0$_outOfOrderImports = null;
+      t1._evaluate0$_extender = _this.extender;
+      t1._evaluate0$_declarationName = t1._evaluate0$_mediaQueries = t1._evaluate0$_styleRule = null;
+      t1._evaluate0$_inKeyframes = t1._evaluate0$_atRootExcludingStyleRule = t1._evaluate0$_inUnknownAtRule = false;
+      t4 = _this.configuration;
+      if (t4 != null)
+        t1._evaluate0$_configuration = t4;
+      t1.visitStylesheet$1(t2);
+      css = t1._evaluate0$_outOfOrderImports == null ? t1._evaluate0$_root : new V.CssStylesheet0(new P.UnmodifiableListView(t1._evaluate0$_addOutOfOrderImports$0(), type$.UnmodifiableListView_legacy_CssNode_2), t3);
+      _this._box_0.css = css;
+      t1._evaluate0$_importer = oldImporter;
+      t1._evaluate0$_stylesheet = oldStylesheet;
+      t1._evaluate0$_root = oldRoot;
+      t1._evaluate0$_parent = oldParent;
+      t1._evaluate0$_endOfImports = oldEndOfImports;
+      t1._evaluate0$_outOfOrderImports = oldOutOfOrderImports;
+      t1._evaluate0$_extender = oldExtender;
+      t1._evaluate0$_styleRule = oldStyleRule;
+      t1._evaluate0$_mediaQueries = oldMediaQueries;
+      t1._evaluate0$_declarationName = oldDeclarationName;
+      t1._evaluate0$_inUnknownAtRule = oldInUnknownAtRule;
+      t1._evaluate0$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+      t1._evaluate0$_inKeyframes = oldInKeyframes;
+      t1._evaluate0$_configuration = oldConfiguration;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor__combineCss_closure5.prototype = {
+    call$1: function(module) {
+      return module.get$transitivelyContainsCss();
+    },
+    $signature: 102
+  };
+  R._EvaluateVisitor__combineCss_closure6.prototype = {
+    call$1: function(target) {
+      return !this.selectors.contains$1(0, target);
+    },
+    $signature: 19
+  };
+  R._EvaluateVisitor__combineCss_closure7.prototype = {
+    call$1: function(module) {
+      return module.cloneCss$0();
+    },
+    $signature: 197
+  };
+  R._EvaluateVisitor__extendModules_closure3.prototype = {
+    call$1: function(target) {
+      return !this.originalSelectors.contains$1(0, target);
+    },
+    $signature: 19
+  };
+  R._EvaluateVisitor__extendModules_closure4.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extender_2);
+    },
+    $signature: 150
+  };
+  R._EvaluateVisitor__topologicalModules_visitModule1.prototype = {
+    call$1: function(module) {
+      var t1, t2, t3, _i, upstream;
+      for (t1 = module.get$upstream(), t2 = t1.length, t3 = this.seen, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        upstream = t1[_i];
+        if (upstream.get$transitivelyContainsCss() && t3.add$1(0, upstream))
+          this.call$1(upstream);
+      }
+      this.sorted.addFirst$1(module);
+    },
+    $signature: 186
+  };
+  R._EvaluateVisitor_visitAtRootRule_closure5.prototype = {
+    call$0: function() {
+      return V.AtRootQueryParser$0(this.resolved, this.$this._evaluate0$_logger, null).parse$0();
+    },
+    $signature: 125
+  };
+  R._EvaluateVisitor_visitAtRootRule_closure6.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitAtRootRule_closure7.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure11.prototype = {
+    call$1: function(callback) {
+      var t1 = this.$this,
+        oldParent = t1._evaluate0$_parent;
+      t1._evaluate0$_parent = this.newParent;
+      t1._evaluate0$_environment.scope$1$2$when(callback, this.node.hasDeclarations, type$.void);
+      t1._evaluate0$_parent = oldParent;
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure12.prototype = {
+    call$1: function(callback) {
+      var t1 = this.$this,
+        oldAtRootExcludingStyleRule = t1._evaluate0$_atRootExcludingStyleRule;
+      t1._evaluate0$_atRootExcludingStyleRule = true;
+      this.innerScope.call$1(callback);
+      t1._evaluate0$_atRootExcludingStyleRule = oldAtRootExcludingStyleRule;
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure13.prototype = {
+    call$1: function(callback) {
+      return this.$this._evaluate0$_withMediaQueries$2(null, new R._EvaluateVisitor__scopeForAtRoot__closure1(this.innerScope, callback));
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor__scopeForAtRoot__closure1.prototype = {
+    call$0: function() {
+      return this.innerScope.call$1(this.callback);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure14.prototype = {
+    call$1: function(callback) {
+      var t1 = this.$this,
+        wasInKeyframes = t1._evaluate0$_inKeyframes;
+      t1._evaluate0$_inKeyframes = false;
+      this.innerScope.call$1(callback);
+      t1._evaluate0$_inKeyframes = wasInKeyframes;
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure15.prototype = {
+    call$1: function($parent) {
+      return type$.legacy_CssAtRule_2._is($parent);
+    },
+    $signature: 146
+  };
+  R._EvaluateVisitor__scopeForAtRoot_closure16.prototype = {
+    call$1: function(callback) {
+      var t1 = this.$this,
+        wasInUnknownAtRule = t1._evaluate0$_inUnknownAtRule;
+      t1._evaluate0$_inUnknownAtRule = false;
+      this.innerScope.call$1(callback);
+      t1._evaluate0$_inUnknownAtRule = wasInUnknownAtRule;
+    },
+    $signature: 34
+  };
+  R._EvaluateVisitor_visitContentRule_closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.content.declaration.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+      return null;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitDeclaration_closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitEachRule_closure5.prototype = {
+    call$1: function(value) {
+      return this.$this._evaluate0$_environment.setLocalVariable$3(C.JSArray_methods.get$first(this.node.variables), value.withoutSlash$0(), this.nodeWithSpan);
+    },
+    $signature: 78
+  };
+  R._EvaluateVisitor_visitEachRule_closure6.prototype = {
+    call$1: function(value) {
+      return this.$this._evaluate0$_setMultipleVariables$3(this.node.variables, value, this.nodeWithSpan);
+    },
+    $signature: 78
+  };
+  R._EvaluateVisitor_visitEachRule_closure7.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this;
+      return t1._evaluate0$_handleReturn$2(_this.list.get$asList(), new R._EvaluateVisitor_visitEachRule__closure1(t1, _this.setVariables, _this.node));
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitEachRule__closure1.prototype = {
+    call$1: function(element) {
+      var t1;
+      this.setVariables.call$1(element);
+      t1 = this.$this;
+      return t1._evaluate0$_handleReturn$2(this.node.children, new R._EvaluateVisitor_visitEachRule___closure1(t1));
+    },
+    $signature: 74
+  };
+  R._EvaluateVisitor_visitEachRule___closure1.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 73
+  };
+  R._EvaluateVisitor_visitExtendRule_closure1.prototype = {
+    call$0: function() {
+      return D.SelectorList_SelectorList$parse0(B.trimAscii0(this.targetText.value, true), false, true, this.$this._evaluate0$_logger);
+    },
+    $signature: 44
+  };
+  R._EvaluateVisitor_visitAtRule_closure3.prototype = {
+    call$0: function() {
+      var t3, _i,
+        t1 = this.$this,
+        t2 = t1._evaluate0$_styleRule;
+      if (!(t2 != null && !t1._evaluate0$_atRootExcludingStyleRule) || t1._evaluate0$_inKeyframes)
+        for (t2 = this.node.children, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t2[_i].accept$1(t1);
+      else
+        t1._evaluate0$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitAtRule__closure1(t1, this.node), false, type$.legacy_ModifiableCssStyleRule_2, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitAtRule__closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitAtRule_closure4.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor_visitForRule_closure9.prototype = {
+    call$0: function() {
+      return this.node.from.accept$1(this.$this).assertNumber$0();
+    },
+    $signature: 174
+  };
+  R._EvaluateVisitor_visitForRule_closure10.prototype = {
+    call$0: function() {
+      return this.node.to.accept$1(this.$this).assertNumber$0();
+    },
+    $signature: 174
+  };
+  R._EvaluateVisitor_visitForRule_closure11.prototype = {
+    call$0: function() {
+      return this.fromNumber.assertInt$0();
+    },
+    $signature: 11
+  };
+  R._EvaluateVisitor_visitForRule_closure12.prototype = {
+    call$0: function() {
+      var t1 = this.fromNumber;
+      return this.toNumber.coerce$2(t1.get$numeratorUnits(), t1.get$denominatorUnits()).assertInt$0();
+    },
+    $signature: 11
+  };
+  R._EvaluateVisitor_visitForRule_closure13.prototype = {
+    call$0: function() {
+      var i, t3, t4, t5, t6, t7, t8, result, _this = this,
+        t1 = _this.$this,
+        t2 = _this.node,
+        nodeWithSpan = t1._evaluate0$_expressionNode$1(t2.from);
+      for (i = _this.from, t3 = _this._box_0, t4 = _this.direction, t5 = t2.variable, t6 = _this.fromNumber, t2 = t2.children; i !== t3.to; i += t4) {
+        t7 = t1._evaluate0$_environment;
+        t8 = t6.get$numeratorUnits();
+        t7.setLocalVariable$3(t5, T.SassNumber_SassNumber$withUnits0(i, t6.get$denominatorUnits(), t8), nodeWithSpan);
+        result = t1._evaluate0$_handleReturn$2(t2, new R._EvaluateVisitor_visitForRule__closure1(t1));
+        if (result != null)
+          return result;
+      }
+      return null;
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitForRule__closure1.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 73
+  };
+  R._EvaluateVisitor_visitForwardRule_closure3.prototype = {
+    call$1: function(module) {
+      this.$this._evaluate0$_environment.forwardModule$2(module, this.node);
+    },
+    $signature: 82
+  };
+  R._EvaluateVisitor_visitForwardRule_closure4.prototype = {
+    call$1: function(module) {
+      this.$this._evaluate0$_environment.forwardModule$2(module, this.node);
+    },
+    $signature: 82
+  };
+  R._EvaluateVisitor__assertConfigurationIsEmpty_closure1.prototype = {
+    call$2: function($name, value) {
+      var t1 = this.only;
+      if (t1 != null && !t1.contains$1(0, $name))
+        return;
+      t1 = this.nameInError ? "$" + H.S($name) + string$.x20was_n : string$.This_v;
+      throw H.wrapException(this.$this._evaluate0$_exception$2(t1, value.configurationSpan));
+    },
+    $signature: 136
+  };
+  R._EvaluateVisitor_visitIfRule_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      return t1._evaluate0$_handleReturn$2(this._box_0.clause.children, new R._EvaluateVisitor_visitIfRule__closure1(t1));
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitIfRule__closure1.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 73
+  };
+  R._EvaluateVisitor__visitDynamicImport_closure1.prototype = {
+    call$0: function() {
+      var previousLoad, oldImporter, oldStylesheet, t4, t5, t6, t7, t8, t9, t10, t11, environment, module, visitor, _null = null,
+        _s34_ = "This file is already being loaded.",
+        _box_0 = {},
+        t1 = this.$this,
+        t2 = this.$import,
+        result = t1._evaluate0$_loadStylesheet$3$forImport(t2.url, t2.span, true),
+        importer = result.item1,
+        stylesheet = result.item2,
+        url = stylesheet.span.file.url,
+        t3 = t1._evaluate0$_activeModules;
+      if (t3.containsKey$1(url)) {
+        previousLoad = t3.$index(0, url);
+        throw H.wrapException(previousLoad == null ? t1._evaluate0$_exception$1(_s34_) : t1._evaluate0$_multiSpanException$3(_s34_, "new load", P.LinkedHashMap_LinkedHashMap$_literal([previousLoad.get$span(), "original load"], type$.legacy_FileSpan, type$.legacy_String)));
+      }
+      t3.$indexSet(0, url, t2);
+      t2 = new P.UnmodifiableListView(stylesheet._stylesheet1$_uses, type$.UnmodifiableListView_legacy_UseRule_2);
+      if (t2.get$length(t2) === 0) {
+        t2 = new P.UnmodifiableListView(stylesheet._stylesheet1$_forwards, type$.UnmodifiableListView_legacy_ForwardRule_2);
+        t2 = t2.get$length(t2) === 0;
+      } else
+        t2 = false;
+      if (t2) {
+        oldImporter = t1._evaluate0$_importer;
+        oldStylesheet = t1._evaluate0$_stylesheet;
+        t1._evaluate0$_importer = importer;
+        t1._evaluate0$_stylesheet = stylesheet;
+        t1.visitStylesheet$1(stylesheet);
+        t1._evaluate0$_importer = oldImporter;
+        t1._evaluate0$_stylesheet = oldStylesheet;
+        t3.remove$1(0, url);
+        return;
+      }
+      _box_0.children = null;
+      t2 = t1._evaluate0$_environment;
+      t4 = type$.legacy_String;
+      t5 = type$.legacy_Module_legacy_Callable_2;
+      t6 = type$.legacy_AstNode_2;
+      t7 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Module_legacy_Callable_2);
+      t8 = t2._environment0$_variables;
+      t8 = H.setRuntimeTypeInfo(t8.slice(0), H._arrayInstanceType(t8));
+      t9 = t2._environment0$_variableNodes;
+      if (t9 == null)
+        t9 = _null;
+      else
+        t9 = H.setRuntimeTypeInfo(t9.slice(0), H._arrayInstanceType(t9));
+      t10 = t2._environment0$_functions;
+      t10 = H.setRuntimeTypeInfo(t10.slice(0), H._arrayInstanceType(t10));
+      t11 = t2._environment0$_mixins;
+      t11 = H.setRuntimeTypeInfo(t11.slice(0), H._arrayInstanceType(t11));
+      environment = O.Environment$_0(P.LinkedHashMap_LinkedHashMap$_empty(t4, t5), P.LinkedHashMap_LinkedHashMap$_empty(t4, t6), P.LinkedHashSet_LinkedHashSet$_empty(t5), P.LinkedHashMap_LinkedHashMap$_empty(t5, t6), _null, _null, _null, t7, t8, t9, t10, t11, t2._environment0$_content);
+      t1._evaluate0$_withEnvironment$2(environment, new R._EvaluateVisitor__visitDynamicImport__closure1(_box_0, t1, importer, stylesheet, environment));
+      module = O._EnvironmentModule__EnvironmentModule1(environment, new V.CssStylesheet0(new P.UnmodifiableListView(C.List_empty12, type$.UnmodifiableListView_legacy_CssNode_2), Y.SourceFile$decoded(C.List_empty1, "<dummy module>").span$1(0)), C.C_EmptyExtender0, environment._environment0$_forwardedModules);
+      t1._evaluate0$_environment.importForwards$1(module);
+      if (module.transitivelyContainsCss)
+        t1._evaluate0$_combineCss$2$clone(module, module.transitivelyContainsExtensions).accept$1(t1);
+      visitor = new R._ImportedCssVisitor1(t1);
+      for (t1 = J.get$iterator$ax(_box_0.children); t1.moveNext$0();)
+        t1.get$current(t1).accept$1(visitor);
+      t3.remove$1(0, url);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor__visitDynamicImport__closure1.prototype = {
+    call$0: function() {
+      var t2, t3, _this = this,
+        t1 = _this.$this,
+        oldImporter = t1._evaluate0$_importer,
+        oldStylesheet = t1._evaluate0$_stylesheet,
+        oldRoot = t1._evaluate0$_root,
+        oldParent = t1._evaluate0$_parent,
+        oldEndOfImports = t1._evaluate0$_endOfImports,
+        oldOutOfOrderImports = t1._evaluate0$_outOfOrderImports,
+        oldConfiguration = t1._evaluate0$_configuration;
+      t1._evaluate0$_importer = _this.importer;
+      t2 = t1._evaluate0$_stylesheet = _this.stylesheet;
+      t1._evaluate0$_parent = t1._evaluate0$_root = V.ModifiableCssStylesheet$0(t2.span);
+      t1._evaluate0$_endOfImports = 0;
+      t1._evaluate0$_outOfOrderImports = null;
+      t3 = new P.UnmodifiableListView(t2._stylesheet1$_forwards, type$.UnmodifiableListView_legacy_ForwardRule_2);
+      if (!t3.get$isEmpty(t3))
+        t1._evaluate0$_configuration = _this.environment.toImplicitConfiguration$0();
+      t1.visitStylesheet$1(t2);
+      _this._box_0.children = t1._evaluate0$_addOutOfOrderImports$0();
+      t1._evaluate0$_importer = oldImporter;
+      t1._evaluate0$_stylesheet = oldStylesheet;
+      t1._evaluate0$_root = oldRoot;
+      t1._evaluate0$_parent = oldParent;
+      t1._evaluate0$_endOfImports = oldEndOfImports;
+      t1._evaluate0$_outOfOrderImports = oldOutOfOrderImports;
+      t1._evaluate0$_configuration = oldConfiguration;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitIncludeRule_closure5.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._evaluate0$_environment.getMixin$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 90
+  };
+  R._EvaluateVisitor_visitIncludeRule_closure6.prototype = {
+    call$0: function() {
+      return this.node.get$spanWithoutContent();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 33
+  };
+  R._EvaluateVisitor_visitIncludeRule_closure7.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = t1._evaluate0$_environment,
+        oldContent = t2._environment0$_content;
+      t2._environment0$_content = _this.contentCallable;
+      new R._EvaluateVisitor_visitIncludeRule__closure1(t1, _this.mixin, _this.nodeWithSpan).call$0();
+      t2._environment0$_content = oldContent;
+      return null;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitIncludeRule__closure1.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._evaluate0$_environment,
+        oldInMixin = t2._environment0$_inMixin;
+      t2._environment0$_inMixin = true;
+      new R._EvaluateVisitor_visitIncludeRule___closure1(t1, this.mixin, this.nodeWithSpan).call$0();
+      t2._environment0$_inMixin = oldInMixin;
+      return null;
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitIncludeRule___closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, t4, _i;
+      for (t1 = this.mixin.declaration.children, t2 = t1.length, t3 = this.$this, t4 = this.nodeWithSpan, _i = 0; _i < t2; ++_i)
+        t3._evaluate0$_addErrorSpan$2(t4, new R._EvaluateVisitor_visitIncludeRule____closure1(t3, t1[_i]));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitIncludeRule____closure1.prototype = {
+    call$0: function() {
+      return this.statement.accept$1(this.$this);
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitMediaRule_closure3.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = _this.mergedQueries;
+      if (t2 == null)
+        t2 = _this.queries;
+      t1._evaluate0$_withMediaQueries$2(t2, new R._EvaluateVisitor_visitMediaRule__closure1(t1, _this.node));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitMediaRule__closure1.prototype = {
+    call$0: function() {
+      var t3, _i,
+        t1 = this.$this,
+        t2 = t1._evaluate0$_styleRule;
+      if (!(t2 != null && !t1._evaluate0$_atRootExcludingStyleRule))
+        for (t2 = this.node.children, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t2[_i].accept$1(t1);
+      else
+        t1._evaluate0$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitMediaRule___closure1(t1, this.node), false, type$.legacy_ModifiableCssStyleRule_2, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitMediaRule___closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitMediaRule_closure4.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule_2._is(node))
+        t1 = this.mergedQueries != null && type$.legacy_CssMediaRule_2._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor__visitMediaQueries_closure1.prototype = {
+    call$0: function() {
+      return F.MediaQueryParser$0(this.resolved, this.$this._evaluate0$_logger, null).parse$0();
+    },
+    $signature: 100
+  };
+  R._EvaluateVisitor_visitStyleRule_closure13.prototype = {
+    call$0: function() {
+      return E.KeyframeSelectorParser$0(this.selectorText.value, this.$this._evaluate0$_logger).parse$0();
+    },
+    $signature: 40
+  };
+  R._EvaluateVisitor_visitStyleRule_closure14.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitStyleRule_closure15.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor_visitStyleRule_closure16.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = !t1._evaluate0$_stylesheet.plainCss;
+      return D.SelectorList_SelectorList$parse0(this.selectorText.value, t2, t2, t1._evaluate0$_logger);
+    },
+    $signature: 44
+  };
+  R._EvaluateVisitor_visitStyleRule_closure17.prototype = {
+    call$0: function() {
+      var t1 = this._box_0.parsedSelector,
+        t2 = this.$this,
+        t3 = t2._evaluate0$_styleRule;
+      t3 = t3 == null ? null : t3.originalSelector;
+      return t1.resolveParentSelectors$2$implicitParent(t3, !t2._evaluate0$_atRootExcludingStyleRule);
+    },
+    $signature: 44
+  };
+  R._EvaluateVisitor_visitStyleRule_closure18.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._evaluate0$_withStyleRule$2(this.rule, new R._EvaluateVisitor_visitStyleRule__closure1(t1, this.node));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitStyleRule__closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitStyleRule_closure19.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor_visitSupportsRule_closure3.prototype = {
+    call$0: function() {
+      var t3, _i,
+        t1 = this.$this,
+        t2 = t1._evaluate0$_styleRule;
+      if (!(t2 != null && !t1._evaluate0$_atRootExcludingStyleRule))
+        for (t2 = this.node.children, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t2[_i].accept$1(t1);
+      else
+        t1._evaluate0$_withParent$2$2(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitSupportsRule__closure1(t1, this.node), type$.legacy_ModifiableCssStyleRule_2, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitSupportsRule__closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i;
+      for (t1 = this.node.children, t2 = t1.length, t3 = this.$this, _i = 0; _i < t2; ++_i)
+        t1[_i].accept$1(t3);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitSupportsRule_closure4.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor_visitVariableDeclaration_closure5.prototype = {
+    call$0: function() {
+      var t1 = this.override;
+      this.$this._evaluate0$_environment.setVariable$4$global(this.node.name, t1.value, t1.assignmentNode, true);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitVariableDeclaration_closure6.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._evaluate0$_environment.getVariable$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitVariableDeclaration_closure7.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = this.node;
+      t1._evaluate0$_environment.setVariable$5$global$namespace(t2.name, this.value, t1._evaluate0$_expressionNode$1(t2.expression), t2.isGlobal, t2.namespace);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitUseRule_closure1.prototype = {
+    call$1: function(module) {
+      var t1 = this.node;
+      this.$this._evaluate0$_environment.addModule$3$namespace(module, t1, t1.namespace);
+    },
+    $signature: 82
+  };
+  R._EvaluateVisitor_visitWarnRule_closure1.prototype = {
+    call$0: function() {
+      return this.node.expression.accept$1(this.$this);
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitWhileRule_closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, result;
+      for (t1 = this.node, t2 = t1.condition, t3 = this.$this, t1 = t1.children; t2.accept$1(t3).get$isTruthy();) {
+        result = t3._evaluate0$_handleReturn$2(t1, new R._EvaluateVisitor_visitWhileRule__closure1(t3));
+        if (result != null)
+          return result;
+      }
+      return null;
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitWhileRule__closure1.prototype = {
+    call$1: function(child) {
+      return child.accept$1(this.$this);
+    },
+    $signature: 73
+  };
+  R._EvaluateVisitor_visitBinaryOperationExpression_closure1.prototype = {
+    call$0: function() {
+      var right, result,
+        t1 = this.node,
+        t2 = this.$this,
+        left = t1.left.accept$1(t2);
+      switch (t1.operator) {
+        case C.BinaryOperator_kjl0:
+          right = t1.right.accept$1(t2);
+          left.toString;
+          t1 = N.serializeValue(left, false, true) + "=";
+          right.toString;
+          return new D.SassString0(t1 + N.serializeValue(right, false, true), false);
+        case C.BinaryOperator_or_or_10:
+          return left.get$isTruthy() ? left : t1.right.accept$1(t2);
+        case C.BinaryOperator_and_and_20:
+          return left.get$isTruthy() ? t1.right.accept$1(t2) : left;
+        case C.BinaryOperator_YlX0:
+          return J.$eq$(left, t1.right.accept$1(t2)) ? C.SassBoolean_true : C.SassBoolean_false;
+        case C.BinaryOperator_i5H0:
+          return !J.$eq$(left, t1.right.accept$1(t2)) ? C.SassBoolean_true : C.SassBoolean_false;
+        case C.BinaryOperator_AcR1:
+          return left.greaterThan$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_1da0:
+          return left.greaterThanOrEquals$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_8qt0:
+          return left.lessThan$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_33h0:
+          return left.lessThanOrEquals$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_AcR2:
+          return left.plus$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_iyO0:
+          return left.minus$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_O1M0:
+          return left.times$1(t1.right.accept$1(t2));
+        case C.BinaryOperator_RTB0:
+          right = t1.right.accept$1(t2);
+          result = left.dividedBy$1(right);
+          if (t1.allowsSlash && left instanceof T.SassNumber0 && right instanceof T.SassNumber0)
+            return type$.legacy_SassNumber_2._as(result).withSlash$2(left, right);
+          else
+            return result;
+        case C.BinaryOperator_2ad0:
+          return left.modulo$1(t1.right.accept$1(t2));
+        default:
+          return null;
+      }
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitVariableExpression_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._evaluate0$_environment.getVariable$2$namespace(t1.name, t1.namespace);
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor_visitListExpression_closure1.prototype = {
+    call$1: function(expression) {
+      return expression.accept$1(this.$this);
+    },
+    $signature: 342
+  };
+  R._EvaluateVisitor_visitFunctionExpression_closure3.prototype = {
+    call$0: function() {
+      var t1 = this.node.namespace,
+        t2 = this.plainName;
+      if (t1 == null)
+        t2 = H.stringReplaceAllUnchecked(t2, "_", "-");
+      return this.$this._evaluate0$_getFunction$2$namespace(t2, t1);
+    },
+    $signature: 90
+  };
+  R._EvaluateVisitor_visitFunctionExpression_closure4.prototype = {
+    call$0: function() {
+      var t1 = this.node;
+      return this.$this._evaluate0$_runFunctionCallable$3(t1.$arguments, this._box_0.$function, t1);
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor__runUserDefinedCallable_closure1.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = _this.callable;
+      return t1._evaluate0$_withEnvironment$2(t2.environment.closure$0(), new R._EvaluateVisitor__runUserDefinedCallable__closure1(t1, _this.evaluated, t2, _this.nodeWithSpan, _this.run));
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor__runUserDefinedCallable__closure1.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this;
+      return t1._evaluate0$_environment.scope$1$1(new R._EvaluateVisitor__runUserDefinedCallable___closure1(t1, _this.evaluated, _this.callable, _this.nodeWithSpan, _this.run), type$.legacy_Value_2);
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor__runUserDefinedCallable___closure1.prototype = {
+    call$0: function() {
+      var declaredArguments, minLength, t8, t9, i, t10, t11, t12, argument, value, t13, rest, argumentList, result, argumentWord, argumentNames, _this = this, _null = null,
+        t1 = _this.$this,
+        t2 = _this.evaluated,
+        t3 = t2.positional,
+        t4 = t3.length,
+        t5 = t2.named,
+        t6 = _this.callable.declaration.$arguments,
+        t7 = _this.nodeWithSpan;
+      t1._evaluate0$_verifyArguments$4(t4, t5, t6, t7);
+      declaredArguments = t6.$arguments;
+      t4 = declaredArguments.length;
+      minLength = Math.min(t3.length, t4);
+      for (t8 = t1._evaluate0$_sourceMap, t9 = t2.positionalNodes, i = 0; i < minLength; ++i) {
+        t10 = t1._evaluate0$_environment;
+        t11 = declaredArguments[i].name;
+        t12 = t3[i].withoutSlash$0();
+        t10.setLocalVariable$3(t11, t12, t8 ? t9[i] : _null);
+      }
+      for (i = t3.length, t9 = t2.namedNodes; i < t4; ++i) {
+        argument = declaredArguments[i];
+        t10 = argument.name;
+        value = t5.remove$1(0, t10);
+        if (value == null)
+          value = argument.defaultValue.accept$1(t1);
+        t11 = t1._evaluate0$_environment;
+        t12 = value.withoutSlash$0();
+        if (t8) {
+          t13 = t9.$index(0, t10);
+          if (t13 == null)
+            t13 = t1._evaluate0$_expressionNode$1(argument.defaultValue);
+        } else
+          t13 = _null;
+        t11.setLocalVariable$3(t10, t12, t13);
+      }
+      t8 = t6.restArgument;
+      if (t8 != null) {
+        rest = t3.length > t4 ? C.JSArray_methods.sublist$1(t3, t4) : C.List_empty16;
+        t2 = t2.separator;
+        argumentList = D.SassArgumentList$0(rest, t5, t2 === C.ListSeparator_undecided0 ? C.ListSeparator_comma0 : t2);
+        t1._evaluate0$_environment.setLocalVariable$3(t8, argumentList, t7);
+      } else
+        argumentList = _null;
+      result = _this.run.call$0();
+      if (argumentList == null)
+        return result;
+      if (t5.get$isEmpty(t5))
+        return result;
+      if (argumentList._argument_list$_wereKeywordsAccessed)
+        return result;
+      t2 = t5.get$keys(t5);
+      argumentWord = B.pluralize0("argument", t2.get$length(t2), _null);
+      t5 = t5.get$keys(t5);
+      argumentNames = B.toSentence0(H.MappedIterable_MappedIterable(t5, new R._EvaluateVisitor__runUserDefinedCallable____closure1(), H._instanceType(t5)._eval$1("Iterable.E"), type$.legacy_Object), "or");
+      throw H.wrapException(E.MultiSpanSassRuntimeException$0("No " + argumentWord + " named " + H.S(argumentNames) + ".", t7.get$span(), "invocation", P.LinkedHashMap_LinkedHashMap$_literal([t6.get$spanWithName(), "declaration"], type$.legacy_FileSpan, type$.legacy_String), t1._evaluate0$_stackTrace$1(t7.get$span())));
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor__runUserDefinedCallable____closure1.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  R._EvaluateVisitor__runFunctionCallable_closure1.prototype = {
+    call$0: function() {
+      var t1, t2, t3, t4, _i, $returnValue;
+      for (t1 = this.callable.declaration, t2 = t1.children, t3 = t2.length, t4 = this.$this, _i = 0; _i < t3; ++_i) {
+        $returnValue = t2[_i].accept$1(t4);
+        if ($returnValue instanceof F.Value0)
+          return $returnValue;
+      }
+      throw H.wrapException(t4._evaluate0$_exception$2("Function finished without @return.", t1.span));
+    },
+    $signature: 21
+  };
+  R._EvaluateVisitor__runBuiltInCallable_closure3.prototype = {
+    call$0: function() {
+      return this.overload.verify$2(this.evaluated.positional.length, this.namedSet);
+    },
+    $signature: 1
+  };
+  R._EvaluateVisitor__runBuiltInCallable_closure4.prototype = {
+    call$1: function($name) {
+      return "$" + H.S($name);
+    },
+    $signature: 4
+  };
+  R._EvaluateVisitor__evaluateArguments_closure1.prototype = {
+    call$2: function(key, value) {
+      var t1;
+      this.named.$indexSet(0, key, value);
+      t1 = this.namedNodes;
+      if (t1 != null)
+        t1.$indexSet(0, key, this.restNodeForSpan);
+    },
+    $signature: 76
+  };
+  R._EvaluateVisitor__evaluateMacroArguments_closure7.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression0(value, null);
+    },
+    $signature: 48
+  };
+  R._EvaluateVisitor__evaluateMacroArguments_closure8.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression0(value, null);
+    },
+    $signature: 48
+  };
+  R._EvaluateVisitor__evaluateMacroArguments_closure9.prototype = {
+    call$2: function(key, value) {
+      this.named.$indexSet(0, key, new F.ValueExpression0(value, null));
+    },
+    $signature: 76
+  };
+  R._EvaluateVisitor__evaluateMacroArguments_closure10.prototype = {
+    call$1: function(value) {
+      return new F.ValueExpression0(value, null);
+    },
+    $signature: 48
+  };
+  R._EvaluateVisitor__addRestMap_closure3.prototype = {
+    call$1: function(value) {
+      return this.T._eval$1("0*")._as(value);
+    },
+    $signature: function() {
+      return this.T._eval$1("0*(Value0*)");
+    }
+  };
+  R._EvaluateVisitor__addRestMap_closure4.prototype = {
+    call$2: function(key, value) {
+      var _this = this;
+      if (key instanceof D.SassString0)
+        _this.values.$indexSet(0, key.text, _this._box_0.convert.call$1(value));
+      else
+        throw H.wrapException(_this.$this._evaluate0$_exception$2(string$.Variab_ + H.S(key) + " is not a string in " + _this.map.toString$0(0) + ".", _this.nodeWithSpan.get$span()));
+    },
+    $signature: 45
+  };
+  R._EvaluateVisitor__verifyArguments_closure1.prototype = {
+    call$0: function() {
+      return this.$arguments.verify$2(this.positional, new M.MapKeySet(this.named, type$.MapKeySet_legacy_String));
+    },
+    $signature: 1
+  };
+  R._EvaluateVisitor_visitStringExpression_closure1.prototype = {
+    call$1: function(value) {
+      var t1, result;
+      if (typeof value == "string")
+        return value;
+      type$.legacy_Expression_2._as(value);
+      t1 = this.$this;
+      result = value.accept$1(t1);
+      return result instanceof D.SassString0 ? result.text : t1._evaluate0$_serialize$3$quote(result, value, false);
+    },
+    $signature: 41
+  };
+  R._EvaluateVisitor_visitCssAtRule_closure3.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssAtRule_closure4.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor_visitCssKeyframeBlock_closure3.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssKeyframeBlock_closure4.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor_visitCssMediaRule_closure3.prototype = {
+    call$0: function() {
+      var _this = this,
+        t1 = _this.$this,
+        t2 = _this.mergedQueries;
+      if (t2 == null)
+        t2 = _this.node.queries;
+      t1._evaluate0$_withMediaQueries$2(t2, new R._EvaluateVisitor_visitCssMediaRule__closure1(t1, _this.node));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssMediaRule__closure1.prototype = {
+    call$0: function() {
+      var cur,
+        t1 = this.$this,
+        t2 = t1._evaluate0$_styleRule;
+      if (!(t2 != null && !t1._evaluate0$_atRootExcludingStyleRule))
+        for (t2 = this.node.children, t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+          cur = t2.__internal$_current;
+          cur.accept$1(t1);
+        }
+      else
+        t1._evaluate0$_withParent$2$3$scopeWhen(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitCssMediaRule___closure1(t1, this.node), false, type$.legacy_ModifiableCssStyleRule_2, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssMediaRule___closure1.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssMediaRule_closure4.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule_2._is(node))
+        t1 = this.mergedQueries != null && type$.legacy_CssMediaRule_2._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor_visitCssStyleRule_closure3.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      t1._evaluate0$_withStyleRule$2(this.rule, new R._EvaluateVisitor_visitCssStyleRule__closure1(t1, this.node));
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssStyleRule__closure1.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssStyleRule_closure4.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor_visitCssSupportsRule_closure3.prototype = {
+    call$0: function() {
+      var cur,
+        t1 = this.$this,
+        t2 = t1._evaluate0$_styleRule;
+      if (!(t2 != null && !t1._evaluate0$_atRootExcludingStyleRule))
+        for (t2 = this.node.children, t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+          cur = t2.__internal$_current;
+          cur.accept$1(t1);
+        }
+      else
+        t1._evaluate0$_withParent$2$2(X.ModifiableCssStyleRule$0(t2.selector, t2.span, t2.originalSelector), new R._EvaluateVisitor_visitCssSupportsRule__closure1(t1, this.node), type$.legacy_ModifiableCssStyleRule_2, type$.Null);
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssSupportsRule__closure1.prototype = {
+    call$0: function() {
+      var t1, t2, cur;
+      for (t1 = this.node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)), t2 = this.$this; t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(t2);
+      }
+    },
+    $signature: 0
+  };
+  R._EvaluateVisitor_visitCssSupportsRule_closure4.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._EvaluateVisitor__performInterpolation_closure1.prototype = {
+    call$1: function(value) {
+      var t1, result, t2, t3;
+      if (typeof value == "string")
+        return value;
+      type$.legacy_Expression_2._as(value);
+      t1 = this.$this;
+      result = value.accept$1(t1);
+      if (this.warnForColor && result instanceof K.SassColor0 && $.$get$namesByColor0().containsKey$1(result)) {
+        t2 = X.Interpolation$0(H.setRuntimeTypeInfo([""], type$.JSArray_legacy_Object), null);
+        t3 = $.$get$namesByColor0();
+        t1._evaluate0$_warn$2(string$.You_pr + H.S(t3.$index(0, result)) + string$.x20in_in + H.S(result) + string$.x2c_whicw + H.S(t3.$index(0, result)) + string$.x22x29__If + new V.BinaryOperationExpression0(C.BinaryOperator_AcR2, new D.StringExpression0(t2, true), value, false).toString$0(0) + "'.", value.get$span());
+      }
+      return t1._evaluate0$_serialize$3$quote(result, value, false);
+    },
+    $signature: 41
+  };
+  R._EvaluateVisitor__serialize_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.value;
+      t1.toString;
+      return N.serializeValue(t1, false, this.quote);
+    },
+    $signature: 12
+  };
+  R._EvaluateVisitor__stackTrace_closure1.prototype = {
+    call$1: function(tuple) {
+      return this.$this._evaluate0$_stackFrame$2(tuple.item1, tuple.item2.get$span());
+    },
+    $signature: 132
+  };
+  R._ImportedCssVisitor1.prototype = {
+    visitCssAtRule$1: function(node) {
+      var t1 = node.isChildless ? null : new R._ImportedCssVisitor_visitCssAtRule_closure1();
+      this._evaluate0$_visitor._evaluate0$_addChild$2$through(node, t1);
+    },
+    visitCssComment$1: function(node) {
+      return this._evaluate0$_visitor._evaluate0$_addChild$1(node);
+    },
+    visitCssDeclaration$1: function(node) {
+    },
+    visitCssImport$1: function(node) {
+      var t1 = this._evaluate0$_visitor,
+        t2 = t1._evaluate0$_parent,
+        t3 = t1._evaluate0$_root;
+      if (t2 != t3)
+        t1._evaluate0$_addChild$1(node);
+      else if (t1._evaluate0$_endOfImports === J.get$length$asx(t3.children._collection$_source)) {
+        t1._evaluate0$_addChild$1(node);
+        t1._evaluate0$_endOfImports = t1._evaluate0$_endOfImports + 1;
+      } else {
+        t2 = t1._evaluate0$_outOfOrderImports;
+        (t2 == null ? t1._evaluate0$_outOfOrderImports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ModifiableCssImport_2) : t2).push(node);
+      }
+    },
+    visitCssKeyframeBlock$1: function(node) {
+    },
+    visitCssMediaRule$1: function(node) {
+      var t1 = this._evaluate0$_visitor,
+        t2 = t1._evaluate0$_mediaQueries;
+      t1._evaluate0$_addChild$2$through(node, new R._ImportedCssVisitor_visitCssMediaRule_closure1(t2 == null || t1._evaluate0$_mergeMediaQueries$2(t2, node.queries) != null));
+    },
+    visitCssStyleRule$1: function(node) {
+      return this._evaluate0$_visitor._evaluate0$_addChild$2$through(node, new R._ImportedCssVisitor_visitCssStyleRule_closure1());
+    },
+    visitCssStylesheet$1: function(node) {
+      var t1, cur;
+      for (t1 = node.children, t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        cur.accept$1(this);
+      }
+    },
+    visitCssSupportsRule$1: function(node) {
+      return this._evaluate0$_visitor._evaluate0$_addChild$2$through(node, new R._ImportedCssVisitor_visitCssSupportsRule_closure1());
+    }
+  };
+  R._ImportedCssVisitor_visitCssAtRule_closure1.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._ImportedCssVisitor_visitCssMediaRule_closure1.prototype = {
+    call$1: function(node) {
+      var t1;
+      if (!type$.legacy_CssStyleRule_2._is(node))
+        t1 = this.hasBeenMerged && type$.legacy_CssMediaRule_2._is(node);
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 8
+  };
+  R._ImportedCssVisitor_visitCssStyleRule_closure1.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._ImportedCssVisitor_visitCssSupportsRule_closure1.prototype = {
+    call$1: function(node) {
+      return type$.legacy_CssStyleRule_2._is(node);
+    },
+    $signature: 8
+  };
+  R._ArgumentResults1.prototype = {};
+  E.SassException0.prototype = {
+    get$trace: function(_) {
+      return new Y.Trace(P.List_List$unmodifiable(H.setRuntimeTypeInfo([B.frameForSpan0(G.SourceSpanException.prototype.get$span.call(this), "root stylesheet", null)], type$.JSArray_legacy_Frame), type$.legacy_Frame), new P._StringStackTrace(null));
+    },
+    get$span: function() {
+      return G.SourceSpanException.prototype.get$span.call(this);
+    },
+    toString$0: function(_) {
+      var t2, _i, frame, t3, _this = this,
+        buffer = new P.StringBuffer(""),
+        t1 = "Error: " + H.S(_this._span_exception$_message) + "\n";
+      buffer._contents = t1;
+      buffer._contents = t1 + G.SourceSpanException.prototype.get$span.call(_this).highlight$1$color(null);
+      for (t1 = _this.get$trace(_this).toString$0(0).split("\n"), t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        frame = t1[_i];
+        frame.toString;
+        if (J.get$length$asx(frame) === 0)
+          continue;
+        t3 = buffer._contents += "\n";
+        buffer._contents = t3 + ("  " + H.S(frame));
+      }
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  E.MultiSpanSassException0.prototype = {
+    toString$0: function(_) {
+      var t2, _i, frame, t3, _this = this,
+        buffer = new P.StringBuffer(""),
+        t1 = "Error: " + H.S(_this._span_exception$_message) + "\n";
+      buffer._contents = t1;
+      buffer._contents = t1 + U.Highlighter$multiple(G.SourceSpanException.prototype.get$span.call(_this), _this.primaryLabel, _this.secondarySpans, false, null, null).highlight$0();
+      for (t1 = _this.get$trace(_this).toString$0(0).split("\n"), t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        frame = t1[_i];
+        frame.toString;
+        if (J.get$length$asx(frame) === 0)
+          continue;
+        t3 = buffer._contents += "\n";
+        buffer._contents = t3 + ("  " + H.S(frame));
+      }
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  E.SassRuntimeException0.prototype = {
+    get$trace: function(receiver) {
+      return this.trace;
+    }
+  };
+  E.MultiSpanSassRuntimeException0.prototype = {$isSassRuntimeException0: 1,
+    get$trace: function(receiver) {
+      return this.trace;
+    }
+  };
+  E.SassFormatException0.prototype = {
+    get$source: function() {
+      return P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(G.SourceSpanException.prototype.get$span.call(this).file._decodedChars, 0, null), 0, null);
+    },
+    $isFormatException: 1,
+    $isSourceSpanFormatException: 1
+  };
+  E.SassScriptException0.prototype = {
+    toString$0: function(_) {
+      return this.message + string$.x0a_BUG_;
+    },
+    get$message: function(receiver) {
+      return this.message;
+    }
+  };
+  E.MultiSpanSassScriptException0.prototype = {};
+  D.Exports.prototype = {};
+  X.ExtendRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitExtendRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@extend " + this.selector.toString$0(0);
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.Extender0.prototype = {
+    get$isEmpty: function(_) {
+      var t1 = this._extender$_extensions;
+      return t1.get$isEmpty(t1);
+    },
+    get$simpleSelectors: function() {
+      return new M.MapKeySet(this._extender$_selectors, type$.MapKeySet_legacy_SimpleSelector_2);
+    },
+    extensionsWhereTarget$1: function($async$callback) {
+      var $async$self = this;
+      return P._makeSyncStarIterable(function() {
+        var callback = $async$callback;
+        var $async$goto = 0, $async$handler = 1, $async$currentError, t1, t2, t3, t4;
+        return function $async$extensionsWhereTarget$1($async$errorCode, $async$result) {
+          if ($async$errorCode === 1) {
+            $async$currentError = $async$result;
+            $async$goto = $async$handler;
+          }
+          while (true)
+            switch ($async$goto) {
+              case 0:
+                // Function start
+                t1 = $async$self._extender$_extensions, t2 = t1.get$keys(t1), t2 = t2.get$iterator(t2);
+              case 2:
+                // for condition
+                if (!t2.moveNext$0()) {
+                  // goto after for
+                  $async$goto = 3;
+                  break;
+                }
+                t3 = t2.get$current(t2);
+                if (!callback.call$1(t3)) {
+                  // goto for condition
+                  $async$goto = 2;
+                  break;
+                }
+                t3 = J.get$values$z(t1.$index(0, t3)), t3 = t3.get$iterator(t3);
+              case 4:
+                // for condition
+                if (!t3.moveNext$0()) {
+                  // goto after for
+                  $async$goto = 5;
+                  break;
+                }
+                t4 = t3.get$current(t3);
+                $async$goto = t4 instanceof A.MergedExtension0 ? 6 : 8;
+                break;
+              case 6:
+                // then
+                t4 = t4.unmerge$0();
+                $async$goto = 9;
+                return P._IterationMarker_yieldStar(new H.WhereIterable(t4, new F.Extender_extensionsWhereTarget_closure0(), t4.$ti._eval$1("WhereIterable<Iterable.E>")));
+              case 9:
+                // after yield
+                // goto join
+                $async$goto = 7;
+                break;
+              case 8:
+                // else
+                $async$goto = !t4.isOptional ? 10 : 11;
+                break;
+              case 10:
+                // then
+                $async$goto = 12;
+                return t4;
+              case 12:
+                // after yield
+              case 11:
+                // join
+              case 7:
+                // join
+                // goto for condition
+                $async$goto = 4;
+                break;
+              case 5:
+                // after for
+                // goto for condition
+                $async$goto = 2;
+                break;
+              case 3:
+                // after for
+                // implicit return
+                return P._IterationMarker_endOfIteration();
+              case 1:
+                // rethrow
+                return P._IterationMarker_uncaughtError($async$currentError);
+            }
+        };
+      }, type$.legacy_Extension_2);
+    },
+    addSelector$3: function(selector, span, mediaContext) {
+      var originalSelector, error, t1, t2, t3, _i, exception, modifiableSelector, _this = this;
+      selector = selector;
+      originalSelector = selector;
+      if (!originalSelector.get$isInvisible())
+        for (t1 = originalSelector.components, t2 = t1.length, t3 = _this._extender$_originals, _i = 0; _i < t2; ++_i)
+          t3.add$1(0, t1[_i]);
+      t1 = _this._extender$_extensions;
+      if (t1.get$isNotEmpty(t1))
+        try {
+          selector = _this._extender$_extendList$3(originalSelector, t1, mediaContext);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (t1 instanceof E.SassException0) {
+            error = t1;
+            throw H.wrapException(E.SassException$0("From " + error.get$span().message$1(0, "") + "\n" + H.S(error._span_exception$_message), span));
+          } else
+            throw exception;
+        }
+      modifiableSelector = new F.ModifiableCssValue0(selector, span, type$.ModifiableCssValue_legacy_SelectorList_2);
+      if (mediaContext != null)
+        _this._extender$_mediaContexts.$indexSet(0, modifiableSelector, mediaContext);
+      _this._extender$_registerSelector$2(selector, modifiableSelector);
+      return modifiableSelector;
+    },
+    _extender$_registerSelector$2: function(list, selector) {
+      var t1, t2, t3, _i, t4, t5, _i0, component, t6, t7, _i1, simple;
+      for (t1 = list.components, t2 = t1.length, t3 = this._extender$_selectors, _i = 0; _i < t2; ++_i)
+        for (t4 = t1[_i].components, t5 = t4.length, _i0 = 0; _i0 < t5; ++_i0) {
+          component = t4[_i0];
+          if (component instanceof X.CompoundSelector0)
+            for (t6 = component.components, t7 = t6.length, _i1 = 0; _i1 < t7; ++_i1) {
+              simple = t6[_i1];
+              J.add$1$ax(t3.putIfAbsent$2(simple, new F.Extender__registerSelector_closure0()), selector);
+              if (simple instanceof D.PseudoSelector0 && simple.selector != null)
+                this._extender$_registerSelector$2(simple.selector, selector);
+            }
+        }
+    },
+    addExtension$4: function(extender, target, extend, mediaContext) {
+      var t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, newExtensions, _i, complex, t12, state, existingState, t13, _i0, component, t14, t15, _i1, simple, newExtensionsByTarget, additionalExtensions, _this = this,
+        selectors = _this._extender$_selectors.$index(0, target),
+        t1 = _this._extender$_extensionsByExtender,
+        existingExtensions = t1.$index(0, target),
+        sources = _this._extender$_extensions.putIfAbsent$2(target, new F.Extender_addExtension_closure2());
+      for (t2 = extender.value.components, t3 = t2.length, t4 = selectors == null, t5 = _this._extender$_sourceSpecificity, t6 = extender.span, t7 = extend.span, t8 = extend.isOptional, t9 = existingExtensions != null, t10 = type$.legacy_ComplexSelector_2, t11 = type$.legacy_Extension_2, newExtensions = null, _i = 0; _i < t3; ++_i) {
+        complex = t2[_i];
+        if (complex._complex0$_maxSpecificity == null)
+          complex._complex0$_computeSpecificity$0();
+        t12 = complex._complex0$_maxSpecificity;
+        state = new S.Extension0(complex, target, t12, t8, false, mediaContext, t6, t7);
+        existingState = sources.$index(0, complex);
+        if (existingState != null) {
+          sources.$indexSet(0, complex, A.MergedExtension_merge0(existingState, state));
+          continue;
+        }
+        sources.$indexSet(0, complex, state);
+        for (t12 = complex.components, t13 = t12.length, _i0 = 0; _i0 < t13; ++_i0) {
+          component = t12[_i0];
+          if (component instanceof X.CompoundSelector0)
+            for (t14 = component.components, t15 = t14.length, _i1 = 0; _i1 < t15; ++_i1) {
+              simple = t14[_i1];
+              J.add$1$ax(t1.putIfAbsent$2(simple, new F.Extender_addExtension_closure3()), state);
+              t5.putIfAbsent$2(simple, new F.Extender_addExtension_closure4(complex));
+            }
+        }
+        if (!t4 || t9) {
+          if (newExtensions == null)
+            newExtensions = P.LinkedHashMap_LinkedHashMap$_empty(t10, t11);
+          newExtensions.$indexSet(0, complex, state);
+        }
+      }
+      if (newExtensions == null)
+        return;
+      t1 = type$.legacy_SimpleSelector_2;
+      newExtensionsByTarget = P.LinkedHashMap_LinkedHashMap$_literal([target, newExtensions], t1, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension_2);
+      if (t9) {
+        additionalExtensions = _this._extender$_extendExistingExtensions$2(existingExtensions, newExtensionsByTarget);
+        if (additionalExtensions != null)
+          B.mapAddAll20(newExtensionsByTarget, additionalExtensions, t1, t10, t11);
+      }
+      if (!t4)
+        _this._extender$_extendExistingSelectors$2(selectors, newExtensionsByTarget);
+    },
+    _extender$_extendExistingExtensions$2: function(extensions, newExtensions) {
+      var extension, selectors, error, t1, t2, t3, t4, t5, t6, additionalExtensions, _i, sources, exception, containsExtension, t7, t8, first, _i0, complex, t9, t10, t11, t12, t13, t14, withExtender, existingExtension, _i1, component, _i2;
+      for (t1 = J.toList$0$ax(extensions), t2 = t1.length, t3 = this._extender$_extensionsByExtender, t4 = type$.legacy_SimpleSelector_2, t5 = type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension_2, t6 = this._extender$_extensions, additionalExtensions = null, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        extension = t1[_i];
+        sources = t6.$index(0, extension.target);
+        selectors = null;
+        try {
+          selectors = this._extender$_extendComplex$3(extension.extender, newExtensions, extension.mediaContext);
+          if (selectors == null)
+            continue;
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (t1 instanceof E.SassException0) {
+            error = t1;
+            throw H.wrapException(E.SassException$0("From " + extension.extenderSpan.message$1(0, "") + "\n" + H.S(error._span_exception$_message), error.get$span()));
+          } else
+            throw exception;
+        }
+        containsExtension = J.$eq$(J.get$first$ax(selectors), extension.extender);
+        for (t7 = selectors, t8 = t7.length, first = false, _i0 = 0; _i0 < t7.length; t7.length === t8 || (0, H.throwConcurrentModificationError)(t7), ++_i0) {
+          complex = t7[_i0];
+          if (containsExtension && first) {
+            first = false;
+            continue;
+          }
+          t9 = extension;
+          t10 = t9.target;
+          t11 = t9.extenderSpan;
+          t12 = t9.span;
+          t13 = t9.mediaContext;
+          t14 = t9.specificity;
+          t9 = t9.isOptional;
+          if (t14 == null) {
+            if (complex._complex0$_maxSpecificity == null)
+              complex._complex0$_computeSpecificity$0();
+            t14 = complex._complex0$_maxSpecificity;
+          }
+          withExtender = new S.Extension0(complex, t10, t14, t9, false, t13, t11, t12);
+          existingExtension = sources.$index(0, complex);
+          if (existingExtension != null)
+            sources.$indexSet(0, complex, A.MergedExtension_merge0(existingExtension, withExtender));
+          else {
+            sources.$indexSet(0, complex, withExtender);
+            for (t9 = complex.components, t10 = t9.length, _i1 = 0; _i1 < t10; ++_i1) {
+              component = t9[_i1];
+              if (component instanceof X.CompoundSelector0)
+                for (t11 = component.components, t12 = t11.length, _i2 = 0; _i2 < t12; ++_i2)
+                  J.add$1$ax(t3.putIfAbsent$2(t11[_i2], new F.Extender__extendExistingExtensions_closure1()), withExtender);
+            }
+            if (newExtensions.containsKey$1(extension.target)) {
+              if (additionalExtensions == null)
+                additionalExtensions = P.LinkedHashMap_LinkedHashMap$_empty(t4, t5);
+              additionalExtensions.putIfAbsent$2(extension.target, new F.Extender__extendExistingExtensions_closure2()).$indexSet(0, complex, withExtender);
+            }
+          }
+        }
+        if (!containsExtension)
+          sources.remove$1(0, extension.extender);
+      }
+      return additionalExtensions;
+    },
+    _extender$_extendExistingSelectors$2: function(selectors, newExtensions) {
+      var selector, error, t1, t2, oldValue, exception;
+      for (t1 = selectors.get$iterator(selectors), t2 = this._extender$_mediaContexts; t1.moveNext$0();) {
+        selector = t1.get$current(t1);
+        oldValue = selector.value;
+        try {
+          selector.value = this._extender$_extendList$3(selector.value, newExtensions, t2.$index(0, selector));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (t1 instanceof E.SassException0) {
+            error = t1;
+            throw H.wrapException(E.SassException$0("From " + selector.span.message$1(0, "") + "\n" + H.S(error._span_exception$_message), error.get$span()));
+          } else
+            throw exception;
+        }
+        if (oldValue == selector.value)
+          continue;
+        this._extender$_registerSelector$2(selector.value, selector);
+      }
+    },
+    addExtensions$1: function(extenders) {
+      var t1, t2, t3, _this = this, _box_0 = {};
+      _box_0.newExtensions = _box_0.selectorsToExtend = _box_0.extensionsToExtend = null;
+      for (t1 = J.get$iterator$ax(extenders), t2 = _this._extender$_sourceSpecificity; t1.moveNext$0();) {
+        t3 = t1.get$current(t1);
+        if (t3.get$isEmpty(t3))
+          continue;
+        t2.addAll$1(0, t3.get$_extender$_sourceSpecificity());
+        t3.get$_extender$_extensions().forEach$1(0, new F.Extender_addExtensions_closure0(_box_0, _this, t3));
+      }
+      t1 = _box_0.newExtensions;
+      if (t1 == null)
+        return;
+      t2 = _box_0.extensionsToExtend;
+      if (t2 != null)
+        _this._extender$_extendExistingExtensions$2(t2, t1);
+      t1 = _box_0.selectorsToExtend;
+      if (t1 != null)
+        _this._extender$_extendExistingSelectors$2(t1, _box_0.newExtensions);
+    },
+    _extender$_extendList$3: function(list, extensions, mediaQueryContext) {
+      var t1, t2, t3, extended, i, complex, result, t4;
+      for (t1 = list.components, t2 = t1.length, t3 = type$.JSArray_legacy_ComplexSelector_2, extended = null, i = 0; i < t2; ++i) {
+        complex = t1[i];
+        result = this._extender$_extendComplex$3(complex, extensions, mediaQueryContext);
+        if (result == null) {
+          if (extended != null)
+            extended.push(complex);
+        } else {
+          if (extended == null)
+            if (i === 0)
+              extended = H.setRuntimeTypeInfo([], t3);
+            else {
+              t4 = C.JSArray_methods.sublist$2(t1, 0, i);
+              extended = H.setRuntimeTypeInfo(t4.slice(0), H._arrayInstanceType(t4)._eval$1("JSArray<1>"));
+            }
+          C.JSArray_methods.addAll$1(extended, result);
+        }
+      }
+      if (extended == null)
+        return list;
+      t1 = this._extender$_originals;
+      return D.SelectorList$0(J.where$1$ax(this._extender$_trim$2(extended, t1.get$contains(t1)), new F.Extender__extendList_closure0()));
+    },
+    _extender$_extendComplex$3: function(complex, extensions, mediaQueryContext) {
+      var t1, t2, t3, t4, t5, t6, t7, t8, t9, extendedNotExpanded, i, component, extended, result, t10,
+        _s28_ = "components may not be empty.",
+        _box_0 = {},
+        isOriginal = this._extender$_originals.contains$1(0, complex);
+      for (t1 = complex.components, t2 = t1.length, t3 = type$.JSArray_legacy_ComplexSelector_2, t4 = type$.JSArray_legacy_ComplexSelectorComponent_2, t5 = type$.legacy_ComplexSelectorComponent_2, t6 = H._arrayInstanceType(t1), t7 = t6._precomputed1, t6 = t6._eval$1("SubListIterable<1>"), t8 = t6._eval$1("MappedListIterable<ListIterable.E,List<ComplexSelector0*>*>"), t9 = t8._eval$1("ListIterable.E"), extendedNotExpanded = null, i = 0; i < t2; ++i) {
+        component = t1[i];
+        if (component instanceof X.CompoundSelector0) {
+          extended = this._extender$_extendCompound$4$inOriginal(component, extensions, mediaQueryContext, isOriginal);
+          if (extended == null) {
+            if (extendedNotExpanded != null) {
+              result = P.List_List$from(H.setRuntimeTypeInfo([component], t4), false, t5);
+              result.fixed$length = Array;
+              result.immutable$list = Array;
+              t10 = result;
+              if (t10.length === 0)
+                H.throwExpression(P.ArgumentError$(_s28_));
+              C.JSArray_methods.add$1(extendedNotExpanded, H.setRuntimeTypeInfo([new S.ComplexSelector0(t10, false)], t3));
+            }
+          } else {
+            if (extendedNotExpanded == null) {
+              t10 = new H.SubListIterable(t1, 0, i, t6);
+              t10.SubListIterable$3(t1, 0, i, t7);
+              extendedNotExpanded = P.List_List$from(new H.MappedListIterable(t10, new F.Extender__extendComplex_closure1(complex), t8), true, t9);
+            }
+            C.JSArray_methods.add$1(extendedNotExpanded, extended);
+          }
+        } else if (extendedNotExpanded != null) {
+          result = P.List_List$from(H.setRuntimeTypeInfo([component], t4), false, t5);
+          result.fixed$length = Array;
+          result.immutable$list = Array;
+          t10 = result;
+          if (t10.length === 0)
+            H.throwExpression(P.ArgumentError$(_s28_));
+          C.JSArray_methods.add$1(extendedNotExpanded, H.setRuntimeTypeInfo([new S.ComplexSelector0(t10, false)], t3));
+        }
+      }
+      if (extendedNotExpanded == null)
+        return null;
+      _box_0.first = true;
+      t1 = type$.legacy_ComplexSelector_2;
+      t1 = J.expand$1$1$ax(Y.paths0(extendedNotExpanded, t1), new F.Extender__extendComplex_closure2(_box_0, this, complex), t1);
+      return P.List_List$from(t1, true, t1.$ti._eval$1("Iterable.E"));
+    },
+    _extender$_extendCompound$4$inOriginal: function(compound, extensions, mediaQueryContext, inOriginal) {
+      var t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, options, i, simple, extended, result, t13, t14, unifiedPaths, isOriginal, _this = this, _null = null,
+        _s28_ = "components may not be empty.",
+        _box_1 = {},
+        t1 = _this._extender$_mode,
+        targetsUsed = t1 === C.ExtendMode_normal0 || extensions.get$length(extensions) < 2 ? _null : P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_SimpleSelector_2);
+      for (t2 = compound.components, t3 = t2.length, t4 = type$.JSArray_legacy_List_legacy_Extension_2, t5 = type$.JSArray_legacy_Extension_2, t6 = type$.JSArray_legacy_ComplexSelectorComponent_2, t7 = type$.legacy_ComplexSelectorComponent_2, t8 = H._arrayInstanceType(t2), t9 = t8._precomputed1, t8 = t8._eval$1("SubListIterable<1>"), t10 = type$.legacy_SimpleSelector_2, t11 = _this._extender$_sourceSpecificity, t12 = type$.JSArray_legacy_SimpleSelector_2, options = _null, i = 0; i < t3; ++i) {
+        simple = t2[i];
+        extended = _this._extender$_extendSimple$4(simple, extensions, mediaQueryContext, targetsUsed);
+        if (extended == null) {
+          if (options != null) {
+            result = P.List_List$from(H.setRuntimeTypeInfo([simple], t12), false, t10);
+            result.fixed$length = Array;
+            result.immutable$list = Array;
+            t13 = result;
+            if (t13.length === 0)
+              H.throwExpression(P.ArgumentError$(_s28_));
+            result = P.List_List$from(H.setRuntimeTypeInfo([new X.CompoundSelector0(t13)], t6), false, t7);
+            result.fixed$length = Array;
+            result.immutable$list = Array;
+            t13 = result;
+            if (t13.length === 0)
+              H.throwExpression(P.ArgumentError$(_s28_));
+            t14 = t11.$index(0, simple);
+            if (t14 == null)
+              t14 = 0;
+            options.push(H.setRuntimeTypeInfo([new S.Extension0(new S.ComplexSelector0(t13, false), _null, t14, true, true, _null, _null, _null)], t5));
+          }
+        } else {
+          if (options == null) {
+            options = H.setRuntimeTypeInfo([], t4);
+            if (i !== 0) {
+              t13 = new H.SubListIterable(t2, 0, i, t8);
+              t13.SubListIterable$3(t2, 0, i, t9);
+              result = P.List_List$from(t13, false, t10);
+              result.fixed$length = Array;
+              result.immutable$list = Array;
+              t13 = result;
+              compound = new X.CompoundSelector0(t13);
+              if (t13.length === 0)
+                H.throwExpression(P.ArgumentError$(_s28_));
+              result = P.List_List$from(H.setRuntimeTypeInfo([compound], t6), false, t7);
+              result.fixed$length = Array;
+              result.immutable$list = Array;
+              t13 = result;
+              if (t13.length === 0)
+                H.throwExpression(P.ArgumentError$(_s28_));
+              t14 = _this._extender$_sourceSpecificityFor$1(compound);
+              options.push(H.setRuntimeTypeInfo([new S.Extension0(new S.ComplexSelector0(t13, false), _null, t14, true, true, _null, _null, _null)], t5));
+            }
+          }
+          C.JSArray_methods.addAll$1(options, extended);
+        }
+      }
+      if (options == null)
+        return _null;
+      if (targetsUsed != null && targetsUsed._collection$_length !== extensions.get$length(extensions))
+        return _null;
+      if (options.length === 1)
+        return J.map$1$1$ax(C.JSArray_methods.get$first(options), new F.Extender__extendCompound_closure5(mediaQueryContext), type$.legacy_ComplexSelector_2).toList$0(0);
+      t1 = _box_1.first = t1 !== C.ExtendMode_replace0;
+      unifiedPaths = J.map$1$1$ax(Y.paths0(options, type$.legacy_Extension_2), new F.Extender__extendCompound_closure6(_box_1, mediaQueryContext), type$.legacy_List_legacy_ComplexSelector_2);
+      isOriginal = new F.Extender__extendCompound_closure7();
+      if (inOriginal && t1)
+        isOriginal = new F.Extender__extendCompound_closure8(J.get$first$ax(unifiedPaths.get$first(unifiedPaths)));
+      t1 = unifiedPaths.where$1(0, new F.Extender__extendCompound_closure9());
+      t2 = t1.$ti._eval$1("ExpandIterable<Iterable.E,ComplexSelector0*>");
+      return _this._extender$_trim$2(P.List_List$from(new H.ExpandIterable(t1, new F.Extender__extendCompound_closure10(), t2), true, t2._eval$1("Iterable.E")), isOriginal);
+    },
+    _extender$_extendSimple$4: function(simple, extensions, mediaQueryContext, targetsUsed) {
+      var extended, result,
+        t1 = new F.Extender__extendSimple_withoutPseudo0(this, extensions, targetsUsed);
+      if (simple instanceof D.PseudoSelector0 && simple.selector != null) {
+        extended = this._extender$_extendPseudo$3(simple, extensions, mediaQueryContext);
+        if (extended != null)
+          return new H.MappedListIterable(extended, new F.Extender__extendSimple_closure0(this, t1), H._arrayInstanceType(extended)._eval$1("MappedListIterable<1,List<Extension0*>*>"));
+      }
+      result = t1.call$1(simple);
+      return result == null ? null : H.setRuntimeTypeInfo([result], type$.JSArray_legacy_List_legacy_Extension_2);
+    },
+    _extender$_extensionForSimple$1: function(simple) {
+      var t1 = S.ComplexSelector$0(H.setRuntimeTypeInfo([X.CompoundSelector$0(H.setRuntimeTypeInfo([simple], type$.JSArray_legacy_SimpleSelector_2))], type$.JSArray_legacy_ComplexSelectorComponent_2), false),
+        t2 = this._extender$_sourceSpecificity.$index(0, simple);
+      return S.Extension$oneOff0(t1, true, t2 == null ? 0 : t2);
+    },
+    _extender$_extendPseudo$3: function(pseudo, extensions, mediaQueryContext) {
+      var complexes, t2, result,
+        t1 = pseudo.selector,
+        extended = this._extender$_extendList$3(t1, extensions, mediaQueryContext);
+      if (extended == t1)
+        return null;
+      complexes = extended.components;
+      t2 = pseudo.normalizedName === "not";
+      if (t2 && !C.JSArray_methods.any$1(t1.components, new F.Extender__extendPseudo_closure4()) && C.JSArray_methods.any$1(complexes, new F.Extender__extendPseudo_closure5()))
+        complexes = new H.WhereIterable(complexes, new F.Extender__extendPseudo_closure6(), H._arrayInstanceType(complexes)._eval$1("WhereIterable<1>"));
+      complexes = J.expand$1$1$ax(complexes, new F.Extender__extendPseudo_closure7(pseudo), type$.legacy_ComplexSelector_2);
+      if (t2 && t1.components.length === 1) {
+        t1 = H.MappedIterable_MappedIterable(complexes, new F.Extender__extendPseudo_closure8(pseudo), complexes.$ti._eval$1("Iterable.E"), type$.legacy_PseudoSelector_2);
+        result = P.List_List$from(t1, true, H._instanceType(t1)._eval$1("Iterable.E"));
+        return result.length === 0 ? null : result;
+      } else
+        return H.setRuntimeTypeInfo([D.PseudoSelector$0(pseudo.name, pseudo.argument, !pseudo.isClass, D.SelectorList$0(complexes))], type$.JSArray_legacy_PseudoSelector_2);
+    },
+    _extender$_trim$2: function(selectors, isOriginal) {
+      var result, i, t1, t2, numOriginals, _box_0, complex1, j, t3, t4, _i, component;
+      if (selectors.length > 100)
+        return selectors;
+      result = Q.QueueList$(null, type$.legacy_ComplexSelector_2);
+      $label0$0:
+        for (i = selectors.length - 1, t1 = H._arrayInstanceType(selectors), t2 = t1._precomputed1, t1 = t1._eval$1("SubListIterable<1>"), numOriginals = 0; i >= 0; --i) {
+          _box_0 = {};
+          complex1 = selectors[i];
+          if (isOriginal.call$1(complex1)) {
+            for (j = 0; j < numOriginals; ++j)
+              if (J.$eq$(result.$index(0, j), complex1)) {
+                B.rotateSlice0(result, 0, j + 1);
+                continue $label0$0;
+              }
+            ++numOriginals;
+            result.addFirst$1(complex1);
+            continue $label0$0;
+          }
+          _box_0.maxSpecificity = 0;
+          for (t3 = complex1.components, t4 = t3.length, _i = 0; _i < t4; ++_i) {
+            component = t3[_i];
+            if (component instanceof X.CompoundSelector0)
+              _box_0.maxSpecificity = Math.max(_box_0.maxSpecificity, this._extender$_sourceSpecificityFor$1(component));
+          }
+          if (result.any$1(result, new F.Extender__trim_closure1(_box_0, complex1)))
+            continue $label0$0;
+          t3 = new H.SubListIterable(selectors, 0, i, t1);
+          t3.SubListIterable$3(selectors, 0, i, t2);
+          if (t3.any$1(0, new F.Extender__trim_closure2(_box_0, complex1)))
+            continue $label0$0;
+          result.addFirst$1(complex1);
+        }
+      return result;
+    },
+    _extender$_sourceSpecificityFor$1: function(compound) {
+      var t1, t2, t3, specificity, _i, t4;
+      for (t1 = compound.components, t2 = t1.length, t3 = this._extender$_sourceSpecificity, specificity = 0, _i = 0; _i < t2; ++_i) {
+        t4 = t3.$index(0, t1[_i]);
+        specificity = Math.max(specificity, H.checkNum(t4 == null ? 0 : t4));
+      }
+      return specificity;
+    },
+    clone$0: function() {
+      var t3, t4, _this = this,
+        t1 = type$.legacy_SimpleSelector_2,
+        newSelectors = P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Set_legacy_ModifiableCssValue_legacy_SelectorList_2),
+        t2 = type$.legacy_ModifiableCssValue_legacy_SelectorList_2,
+        newMediaContexts = P.LinkedHashMap_LinkedHashMap$_empty(t2, type$.legacy_List_legacy_CssMediaQuery_2),
+        oldToNewSelectors = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_CssValue_legacy_SelectorList_2, t2);
+      _this._extender$_selectors.forEach$1(0, new F.Extender_clone_closure0(_this, newSelectors, oldToNewSelectors, newMediaContexts));
+      t2 = type$.legacy_Extension_2;
+      t3 = B.copyMapOfMap0(_this._extender$_extensions, t1, type$.legacy_ComplexSelector_2, t2);
+      t2 = B.copyMapOfList0(_this._extender$_extensionsByExtender, t1, t2);
+      t1 = P._LinkedIdentityHashMap__LinkedIdentityHashMap$es6(t1, type$.legacy_int);
+      t1.addAll$1(0, _this._extender$_sourceSpecificity);
+      t4 = new P._LinkedIdentityHashSet(type$._LinkedIdentityHashSet_legacy_ComplexSelector_2);
+      t4.addAll$1(0, _this._extender$_originals);
+      return new S.Tuple2(new F.Extender0(newSelectors, t3, t2, newMediaContexts, t1, t4, C.ExtendMode_normal0), oldToNewSelectors, type$.Tuple2_of_legacy_Extender_and_legacy_Map_of_legacy_CssValue_legacy_SelectorList_and_legacy_ModifiableCssValue_legacy_SelectorList_2);
+    },
+    get$_extender$_extensions: function() {
+      return this._extender$_extensions;
+    },
+    get$_extender$_sourceSpecificity: function() {
+      return this._extender$_sourceSpecificity;
+    }
+  };
+  F.Extender_extensionsWhereTarget_closure0.prototype = {
+    call$1: function(extension) {
+      return !extension.isOptional;
+    },
+    $signature: 343
+  };
+  F.Extender__registerSelector_closure0.prototype = {
+    call$0: function() {
+      return P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList_2);
+    },
+    $signature: 344
+  };
+  F.Extender_addExtension_closure2.prototype = {
+    call$0: function() {
+      return P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ComplexSelector_2, type$.legacy_Extension_2);
+    },
+    $signature: 85
+  };
+  F.Extender_addExtension_closure3.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extension_2);
+    },
+    $signature: 153
+  };
+  F.Extender_addExtension_closure4.prototype = {
+    call$0: function() {
+      return this.complex.get$maxSpecificity();
+    },
+    $signature: 11
+  };
+  F.Extender__extendExistingExtensions_closure1.prototype = {
+    call$0: function() {
+      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extension_2);
+    },
+    $signature: 153
+  };
+  F.Extender__extendExistingExtensions_closure2.prototype = {
+    call$0: function() {
+      return P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ComplexSelector_2, type$.legacy_Extension_2);
+    },
+    $signature: 85
+  };
+  F.Extender_addExtensions_closure0.prototype = {
+    call$2: function(target, newSources) {
+      var t1, extensionsForTarget, t2, t3, t4, selectorsForTarget, t5, existingSources, _this = this;
+      if (target instanceof N.PlaceholderSelector0 && T.isPrivate0(target.name))
+        return;
+      t1 = _this.$this;
+      extensionsForTarget = t1._extender$_extensionsByExtender.$index(0, target);
+      t2 = extensionsForTarget == null;
+      if (!t2) {
+        t3 = _this._box_0;
+        t4 = t3.extensionsToExtend;
+        C.JSArray_methods.addAll$1(t4 == null ? t3.extensionsToExtend = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extension_2) : t4, extensionsForTarget);
+      }
+      selectorsForTarget = t1._extender$_selectors.$index(0, target);
+      t3 = selectorsForTarget != null;
+      if (t3) {
+        t4 = _this._box_0;
+        t5 = t4.selectorsToExtend;
+        (t5 == null ? t4.selectorsToExtend = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList_2) : t5).addAll$1(0, selectorsForTarget);
+      }
+      t1 = t1._extender$_extensions;
+      existingSources = t1.$index(0, target);
+      if (existingSources == null) {
+        t4 = _this.extender;
+        t1.$indexSet(0, target, t4.get$_extender$_extensions().$index(0, target));
+        if (!t2 || t3) {
+          t1 = _this._box_0;
+          t2 = t1.newExtensions;
+          t1 = t2 == null ? t1.newExtensions = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_SimpleSelector_2, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension_2) : t2;
+          t1.$indexSet(0, target, t4.get$_extender$_extensions().$index(0, target));
+        }
+      } else
+        newSources.forEach$1(0, new F.Extender_addExtensions__closure0(_this._box_0, existingSources, extensionsForTarget, selectorsForTarget, target));
+    },
+    $signature: 347
+  };
+  F.Extender_addExtensions__closure0.prototype = {
+    call$2: function(extender, extension) {
+      var t2, _this = this,
+        t1 = _this.existingSources;
+      if (t1.containsKey$1(extender))
+        return;
+      t1.$indexSet(0, extender, extension);
+      if (_this.extensionsForTarget != null || _this.selectorsForTarget != null) {
+        t1 = _this._box_0;
+        t2 = t1.newExtensions;
+        t1 = t2 == null ? t1.newExtensions = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_SimpleSelector_2, type$.legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension_2) : t2;
+        t1.putIfAbsent$2(_this.target, new F.Extender_addExtensions___closure1()).putIfAbsent$2(extender, new F.Extender_addExtensions___closure2(extension));
+      }
+    },
+    $signature: 348
+  };
+  F.Extender_addExtensions___closure1.prototype = {
+    call$0: function() {
+      return P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_ComplexSelector_2, type$.legacy_Extension_2);
+    },
+    $signature: 85
+  };
+  F.Extender_addExtensions___closure2.prototype = {
+    call$0: function() {
+      return this.extension;
+    },
+    $signature: 349
+  };
+  F.Extender__extendList_closure0.prototype = {
+    call$1: function(complex) {
+      return complex != null;
+    },
+    $signature: 14
+  };
+  F.Extender__extendComplex_closure1.prototype = {
+    call$1: function(component) {
+      return H.setRuntimeTypeInfo([S.ComplexSelector$0(H.setRuntimeTypeInfo([component], type$.JSArray_legacy_ComplexSelectorComponent_2), this.complex.lineBreak)], type$.JSArray_legacy_ComplexSelector_2);
+    },
+    $signature: 351
+  };
+  F.Extender__extendComplex_closure2.prototype = {
+    call$1: function(path) {
+      var t1 = Y.weave0(J.map$1$1$ax(path, new F.Extender__extendComplex__closure1(), type$.legacy_List_legacy_ComplexSelectorComponent_2).toList$0(0));
+      return new H.MappedListIterable(t1, new F.Extender__extendComplex__closure2(this._box_0, this.$this, this.complex, path), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,ComplexSelector0*>"));
+    },
+    $signature: 352
+  };
+  F.Extender__extendComplex__closure1.prototype = {
+    call$1: function(complex) {
+      return complex.components;
+    },
+    $signature: 353
+  };
+  F.Extender__extendComplex__closure2.prototype = {
+    call$1: function(components) {
+      var _this = this,
+        t1 = _this.complex,
+        outputComplex = S.ComplexSelector$0(components, t1.lineBreak || J.any$1$ax(_this.path, new F.Extender__extendComplex___closure0())),
+        t2 = _this._box_0;
+      if (t2.first && _this.$this._extender$_originals.contains$1(0, t1))
+        _this.$this._extender$_originals.add$1(0, outputComplex);
+      t2.first = false;
+      return outputComplex;
+    },
+    $signature: 71
+  };
+  F.Extender__extendComplex___closure0.prototype = {
+    call$1: function(inputComplex) {
+      return inputComplex.lineBreak;
+    },
+    $signature: 14
+  };
+  F.Extender__extendCompound_closure5.prototype = {
+    call$1: function(state) {
+      state.assertCompatibleMediaContext$1(this.mediaQueryContext);
+      return state.extender;
+    },
+    $signature: 355
+  };
+  F.Extender__extendCompound_closure6.prototype = {
+    call$1: function(path) {
+      var complexes, toUnify, t2, t3, originals, t4, _box_0 = {},
+        t1 = this._box_1;
+      if (t1.first) {
+        t1.first = false;
+        complexes = H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([X.CompoundSelector$0(J.expand$1$1$ax(path, new F.Extender__extendCompound__closure1(), type$.legacy_SimpleSelector_2))], type$.JSArray_legacy_ComplexSelectorComponent_2)], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2);
+      } else {
+        toUnify = Q.QueueList$(null, type$.legacy_List_legacy_ComplexSelectorComponent_2);
+        for (t1 = J.get$iterator$ax(path), t2 = type$.legacy_CompoundSelector_2, t3 = type$.JSArray_legacy_SimpleSelector_2, originals = null; t1.moveNext$0();) {
+          t4 = t1.get$current(t1);
+          if (t4.isOriginal) {
+            if (originals == null)
+              originals = H.setRuntimeTypeInfo([], t3);
+            C.JSArray_methods.addAll$1(originals, t2._as(C.JSArray_methods.get$last(t4.extender.components)).components);
+          } else
+            toUnify._queue_list$_add$1(t4.extender.components);
+        }
+        if (originals != null)
+          toUnify.addFirst$1(H.setRuntimeTypeInfo([X.CompoundSelector$0(originals)], type$.JSArray_legacy_ComplexSelectorComponent_2));
+        complexes = Y.unifyComplex0(toUnify);
+        if (complexes == null)
+          return null;
+      }
+      _box_0.lineBreak = false;
+      for (t1 = J.get$iterator$ax(path), t2 = this.mediaQueryContext; t1.moveNext$0();) {
+        t3 = t1.get$current(t1);
+        t3.assertCompatibleMediaContext$1(t2);
+        _box_0.lineBreak = _box_0.lineBreak || t3.extender.lineBreak;
+      }
+      t1 = J.map$1$1$ax(complexes, new F.Extender__extendCompound__closure2(_box_0), type$.legacy_ComplexSelector_2);
+      return P.List_List$from(t1, true, t1.$ti._eval$1("ListIterable.E"));
+    },
+    $signature: 356
+  };
+  F.Extender__extendCompound__closure1.prototype = {
+    call$1: function(state) {
+      return type$.legacy_CompoundSelector_2._as(C.JSArray_methods.get$last(state.extender.components)).components;
+    },
+    $signature: 357
+  };
+  F.Extender__extendCompound__closure2.prototype = {
+    call$1: function(components) {
+      return S.ComplexSelector$0(components, this._box_0.lineBreak);
+    },
+    $signature: 71
+  };
+  F.Extender__extendCompound_closure7.prototype = {
+    call$1: function(_) {
+      return false;
+    },
+    $signature: 14
+  };
+  F.Extender__extendCompound_closure8.prototype = {
+    call$1: function(complex) {
+      return J.$eq$(complex, this.original);
+    },
+    $signature: 14
+  };
+  F.Extender__extendCompound_closure9.prototype = {
+    call$1: function(complexes) {
+      return complexes != null;
+    },
+    $signature: 358
+  };
+  F.Extender__extendCompound_closure10.prototype = {
+    call$1: function(l) {
+      return l;
+    },
+    $signature: 359
+  };
+  F.Extender__extendSimple_withoutPseudo0.prototype = {
+    call$1: function(simple) {
+      var t1, t2,
+        extenders = this.extensions.$index(0, simple);
+      if (extenders == null)
+        return null;
+      t1 = this.targetsUsed;
+      if (t1 != null)
+        t1.add$1(0, simple);
+      t1 = this.$this;
+      if (t1._extender$_mode === C.ExtendMode_replace0) {
+        t1 = extenders.get$values(extenders);
+        return P.List_List$from(t1, true, H._instanceType(t1)._eval$1("Iterable.E"));
+      }
+      t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Extension_2);
+      t2.push(t1._extender$_extensionForSimple$1(simple));
+      for (t1 = extenders.get$values(extenders), t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        t2.push(t1.get$current(t1));
+      return t2;
+    },
+    $signature: 360
+  };
+  F.Extender__extendSimple_closure0.prototype = {
+    call$1: function(pseudo) {
+      var t1 = this.withoutPseudo.call$1(pseudo);
+      return t1 == null ? H.setRuntimeTypeInfo([this.$this._extender$_extensionForSimple$1(pseudo)], type$.JSArray_legacy_Extension_2) : t1;
+    },
+    $signature: 361
+  };
+  F.Extender__extendPseudo_closure4.prototype = {
+    call$1: function(complex) {
+      return complex.components.length > 1;
+    },
+    $signature: 14
+  };
+  F.Extender__extendPseudo_closure5.prototype = {
+    call$1: function(complex) {
+      return complex.components.length === 1;
+    },
+    $signature: 14
+  };
+  F.Extender__extendPseudo_closure6.prototype = {
+    call$1: function(complex) {
+      return complex.components.length <= 1;
+    },
+    $signature: 14
+  };
+  F.Extender__extendPseudo_closure7.prototype = {
+    call$1: function(complex) {
+      var innerPseudo, t2,
+        t1 = complex.components;
+      if (t1.length !== 1)
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector_2);
+      if (!(C.JSArray_methods.get$first(t1) instanceof X.CompoundSelector0))
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector_2);
+      t1 = type$.legacy_CompoundSelector_2._as(C.JSArray_methods.get$first(t1)).components;
+      if (t1.length !== 1)
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector_2);
+      if (!(C.JSArray_methods.get$first(t1) instanceof D.PseudoSelector0))
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector_2);
+      innerPseudo = type$.legacy_PseudoSelector_2._as(C.JSArray_methods.get$first(t1));
+      t1 = innerPseudo.selector;
+      if (t1 == null)
+        return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector_2);
+      t2 = this.pseudo;
+      switch (t2.normalizedName) {
+        case "not":
+          if (innerPseudo.normalizedName !== "matches")
+            return H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelector_2);
+          return t1.components;
+        case "matches":
+        case "any":
+        case "current":
+        case "nth-child":
+        case "nth-last-child":
+          if (innerPseudo.name !== t2.name)
+            return H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelector_2);
+          if (innerPseudo.argument != t2.argument)
+            return H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelector_2);
+          return t1.components;
+        case "has":
+        case "host":
+        case "host-context":
+        case "slotted":
+          return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector_2);
+        default:
+          return H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelector_2);
+      }
+    },
+    $signature: 362
+  };
+  F.Extender__extendPseudo_closure8.prototype = {
+    call$1: function(complex) {
+      var t1 = this.pseudo;
+      return D.PseudoSelector$0(t1.name, t1.argument, !t1.isClass, D.SelectorList$0(H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector_2)));
+    },
+    $signature: 363
+  };
+  F.Extender__trim_closure1.prototype = {
+    call$1: function(complex2) {
+      return complex2.get$minSpecificity() >= this._box_0.maxSpecificity && Y.complexIsSuperselector0(complex2.components, this.complex1.components);
+    },
+    $signature: 14
+  };
+  F.Extender__trim_closure2.prototype = {
+    call$1: function(complex2) {
+      return complex2.get$minSpecificity() >= this._box_0.maxSpecificity && Y.complexIsSuperselector0(complex2.components, this.complex1.components);
+    },
+    $signature: 14
+  };
+  F.Extender_clone_closure0.prototype = {
+    call$2: function(simple, selectors) {
+      var t1, t2, t3, t4, t5, t6, newSelector, mediaContext, _this = this,
+        newSelectorSet = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_ModifiableCssValue_legacy_SelectorList_2);
+      _this.newSelectors.$indexSet(0, simple, newSelectorSet);
+      for (t1 = selectors.get$iterator(selectors), t2 = type$.ModifiableCssValue_legacy_SelectorList_2, t3 = _this.oldToNewSelectors, t4 = _this.$this._extender$_mediaContexts, t5 = _this.newMediaContexts; t1.moveNext$0();) {
+        t6 = t1.get$current(t1);
+        newSelector = new F.ModifiableCssValue0(t6.value, t6.span, t2);
+        newSelectorSet.add$1(0, newSelector);
+        t3.$indexSet(0, t6, newSelector);
+        mediaContext = t4.$index(0, t6);
+        if (mediaContext != null)
+          t5.$indexSet(0, newSelector, mediaContext);
+      }
+    },
+    $signature: 364
+  };
+  S.Extension0.prototype = {
+    assertCompatibleMediaContext$1: function(mediaContext) {
+      var t1 = this.mediaContext;
+      if (t1 == null)
+        return;
+      if (mediaContext != null && C.C_ListEquality.equals$2(0, t1, mediaContext))
+        return;
+      throw H.wrapException(E.SassException$0(string$.You_ma, this.span));
+    },
+    toString$0: function(_) {
+      var t1 = H.S(this.extender) + " {@extend " + H.S(this.target);
+      return t1 + (this.isOptional ? " !optional" : "") + "}";
+    },
+    get$target: function() {
+      return this.target;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  E.FiberClass.prototype = {};
+  E.Fiber.prototype = {};
+  F.FilesystemImporter0.prototype = {
+    canonicalize$1: function(url) {
+      var t1, resolved;
+      if (url.get$scheme() !== "file" && url.get$scheme() !== "")
+        return null;
+      t1 = $.$get$context();
+      resolved = B.resolveImportPath0(D.join(this._filesystem$_loadPath, t1.style.pathFromUri$1(M._parseUri(url)), null));
+      if (resolved == null)
+        t1 = null;
+      else
+        t1 = t1.toUri$1(J.$eq$(J.get$platform$x(self.process), "win32") || J.$eq$(J.get$platform$x(self.process), "darwin") ? F._realCasePath0(D.absolute(t1.normalize$1(resolved))) : t1.canonicalize$1(resolved));
+      return t1;
+    },
+    load$1: function(_, url) {
+      var path = $.$get$context().style.pathFromUri$1(M._parseUri(url)),
+        t1 = B.readFile0(path),
+        t2 = M.Syntax_forPath0(path),
+        t3 = url.get$scheme();
+      if (t3 === "")
+        H.throwExpression(P.ArgumentError$value(url, "sourceMapUrl", "must be absolute"));
+      return new E.ImporterResult0(t1, url, t2);
+    },
+    toString$0: function(_) {
+      return this._filesystem$_loadPath;
+    }
+  };
+  G.FixedLengthListBuilder0.prototype = {
+    add$1: function(_, element) {
+      var t1, _this = this;
+      _this._fixed_length_list_builder0$_checkUnbuilt$0();
+      t1 = _this._fixed_length_list_builder0$_index;
+      _this._fixed_length_list_builder0$_list[t1] = element;
+      _this._fixed_length_list_builder0$_index = t1 + 1;
+    },
+    addAll$1: function(_, elements) {
+      var _this = this;
+      _this._fixed_length_list_builder0$_checkUnbuilt$0();
+      C.JSArray_methods.setAll$2(_this._fixed_length_list_builder0$_list, _this._fixed_length_list_builder0$_index, elements);
+      _this._fixed_length_list_builder0$_index = _this._fixed_length_list_builder0$_index + elements.length;
+    },
+    addRange$3: function(elements, start, end) {
+      var $length, t1, _this = this;
+      _this._fixed_length_list_builder0$_checkUnbuilt$0();
+      $length = (end == null ? J.get$length$asx(elements._collection$_source) : end) - start;
+      t1 = _this._fixed_length_list_builder0$_index;
+      C.JSArray_methods.setRange$4(_this._fixed_length_list_builder0$_list, t1, t1 + $length, elements, start);
+      _this._fixed_length_list_builder0$_index += $length;
+    },
+    addRange$2: function(elements, start) {
+      return this.addRange$3(elements, start, null);
+    },
+    build$0: function() {
+      this._fixed_length_list_builder0$_checkUnbuilt$0();
+      this._fixed_length_list_builder0$_index = -1;
+      return this._fixed_length_list_builder0$_list;
+    },
+    _fixed_length_list_builder0$_checkUnbuilt$0: function() {
+      if (this._fixed_length_list_builder0$_index === -1)
+        throw H.wrapException(P.StateError$("build() has already been called."));
+    }
+  };
+  B.ForRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitForRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var _this = this,
+        t1 = "@for $" + _this.variable + " from " + H.S(_this.from) + " ",
+        t2 = _this.children;
+      return t1 + (_this.isExclusive ? "to" : "through") + " " + H.S(_this.to) + " {" + (t2 && C.JSArray_methods).join$1(t2, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  L.ForwardRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitForwardRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t3, _this = this,
+        t1 = "@forward " + H.S(new D.StringExpression0(X.Interpolation$0(H.setRuntimeTypeInfo([J.toString$0$(_this.url)], type$.JSArray_legacy_Object), null), true).asInterpolation$1$static(true).get$asPlain()),
+        t2 = _this.shownMixinsAndFunctions;
+      if (t2 != null)
+        t1 = t1 + " show " + _this._forward_rule0$_memberList$2(t2, _this.shownVariables);
+      else {
+        t2 = _this.hiddenMixinsAndFunctions;
+        if (t2 != null) {
+          t3 = t2._base;
+          t3 = t3.get$isNotEmpty(t3);
+        } else
+          t3 = false;
+        if (t3)
+          t1 = t1 + " hide " + _this._forward_rule0$_memberList$2(t2, _this.hiddenVariables);
+      }
+      t2 = _this.prefix;
+      if (t2 != null)
+        t1 += " as " + t2 + "*";
+      t2 = _this.configuration;
+      t1 = (t2.length !== 0 ? t1 + (" with (" + C.JSArray_methods.join$1(t2, ", ") + ")") : t1) + ";";
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _forward_rule0$_memberList$2: function(mixinsAndFunctions, variables) {
+      var t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String),
+        t2 = this.shownMixinsAndFunctions;
+      if (t2 != null)
+        for (t2 = t2._base, t2 = t2.get$iterator(t2); t2.moveNext$0();)
+          t1.push(t2.get$current(t2));
+      t2 = this.shownVariables;
+      if (t2 != null)
+        for (t2 = t2._base, t2 = t2.get$iterator(t2); t2.moveNext$0();)
+          t1.push("$" + H.S(t2.get$current(t2)));
+      return C.JSArray_methods.join$1(t1, ", ");
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  R.ForwardedModuleView0.prototype = {
+    get$url: function() {
+      return this._forwarded_view0$_inner.get$url();
+    },
+    get$upstream: function() {
+      return this._forwarded_view0$_inner.get$upstream();
+    },
+    get$extender: function() {
+      return this._forwarded_view0$_inner.get$extender();
+    },
+    get$css: function(_) {
+      var t1 = this._forwarded_view0$_inner;
+      return t1.get$css(t1);
+    },
+    get$transitivelyContainsCss: function() {
+      return this._forwarded_view0$_inner.get$transitivelyContainsCss();
+    },
+    get$transitivelyContainsExtensions: function() {
+      return this._forwarded_view0$_inner.get$transitivelyContainsExtensions();
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      var _s19_ = "Undefined variable.",
+        t1 = this._forwarded_view0$_rule,
+        t2 = t1.shownVariables;
+      if (t2 != null && !t2._base.contains$1(0, $name))
+        throw H.wrapException(E.SassScriptException$0(_s19_));
+      else {
+        t2 = t1.hiddenVariables;
+        if (t2 != null && t2._base.contains$1(0, $name))
+          throw H.wrapException(E.SassScriptException$0(_s19_));
+      }
+      t1 = t1.prefix;
+      if (t1 != null) {
+        if (!C.JSString_methods.startsWith$1($name, t1))
+          throw H.wrapException(E.SassScriptException$0(_s19_));
+        $name = C.JSString_methods.substring$1($name, t1.length);
+      }
+      return this._forwarded_view0$_inner.setVariable$3($name, value, nodeWithSpan);
+    },
+    variableIdentity$1: function($name) {
+      var t1 = this._forwarded_view0$_rule.prefix;
+      if (t1 != null)
+        $name = J.substring$1$s($name, t1.length);
+      return this._forwarded_view0$_inner.variableIdentity$1($name);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof R.ForwardedModuleView0 && J.$eq$(this._forwarded_view0$_inner, other._forwarded_view0$_inner) && this._forwarded_view0$_rule === other._forwarded_view0$_rule;
+    },
+    get$hashCode: function(_) {
+      return (J.get$hashCode$(this._forwarded_view0$_inner) ^ H.Primitives_objectHashCode(this._forwarded_view0$_rule)) >>> 0;
+    },
+    cloneCss$0: function() {
+      return R.ForwardedModuleView$0(this._forwarded_view0$_inner.cloneCss$0(), this._forwarded_view0$_rule, this.$ti._eval$1("1*"));
+    },
+    toString$0: function(_) {
+      return "forwarded " + H.S(this._forwarded_view0$_inner);
+    },
+    $isModule0: 1,
+    get$variables: function() {
+      return this.variables;
+    },
+    get$variableNodes: function() {
+      return this.variableNodes;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    }
+  };
+  F.FunctionExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitFunctionExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.namespace;
+      t1 = t1 != null ? t1 + "." : "";
+      t1 += this.name.toString$0(0) + this.$arguments.toString$0(0);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.JSFunction0.prototype = {};
+  F.SupportsFunction0.prototype = {
+    toString$0: function(_) {
+      return this.name.toString$0(0) + "(" + this.$arguments.toString$0(0) + ")";
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.SassFunction0.prototype = {
+    accept$1$1: function(visitor) {
+      var t1, t2;
+      if (!visitor._inspect)
+        H.throwExpression(E.SassScriptException$0(this.toString$0(0) + " isn't a valid CSS value."));
+      t1 = visitor._buffer;
+      t1.write$1(0, "get-function(");
+      t2 = this.callable;
+      visitor._serialize0$_visitQuotedString$1(t2.get$name(t2));
+      t1.writeCharCode$1(41);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertFunction$1: function($name) {
+      return this;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof F.SassFunction0 && J.$eq$(this.callable, other.callable);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.callable);
+    }
+  };
+  M.FunctionRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitFunctionRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return "@function " + H.S(this.name) + "(" + H.S(this.$arguments) + ") {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    }
+  };
+  Y.unifyComplex_closure0.prototype = {
+    call$1: function(complex) {
+      var t1 = J.getInterceptor$asx(complex);
+      return t1.sublist$2(complex, 0, t1.get$length(complex) - 1);
+    },
+    $signature: 123
+  };
+  Y._weaveParents_closure6.prototype = {
+    call$2: function(group1, group2) {
+      var unified, t1, _null = null;
+      if (C.C_ListEquality.equals$2(0, group1, group2))
+        return group1;
+      if (!(J.get$first$ax(group1) instanceof X.CompoundSelector0) || !(J.get$first$ax(group2) instanceof X.CompoundSelector0))
+        return _null;
+      if (Y.complexIsParentSuperselector0(group1, group2))
+        return group2;
+      if (Y.complexIsParentSuperselector0(group2, group1))
+        return group1;
+      if (!Y._mustUnify0(group1, group2))
+        return _null;
+      unified = Y.unifyComplex0(H.setRuntimeTypeInfo([group1, group2], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+      if (unified == null)
+        return _null;
+      t1 = J.getInterceptor$asx(unified);
+      if (t1.get$length(unified) > 1)
+        return _null;
+      return t1.get$first(unified);
+    },
+    $signature: 366
+  };
+  Y._weaveParents_closure7.prototype = {
+    call$1: function(sequence) {
+      return Y.complexIsParentSuperselector0(sequence.get$first(sequence), this.group);
+    },
+    $signature: 367
+  };
+  Y._weaveParents_closure8.prototype = {
+    call$1: function(chunk) {
+      return J.expand$1$1$ax(chunk, new Y._weaveParents__closure4(), type$.legacy_ComplexSelectorComponent_2);
+    },
+    $signature: 144
+  };
+  Y._weaveParents__closure4.prototype = {
+    call$1: function(group) {
+      return group;
+    },
+    $signature: 123
+  };
+  Y._weaveParents_closure9.prototype = {
+    call$1: function(sequence) {
+      return sequence.get$length(sequence) === 0;
+    },
+    $signature: 131
+  };
+  Y._weaveParents_closure10.prototype = {
+    call$1: function(chunk) {
+      return J.expand$1$1$ax(chunk, new Y._weaveParents__closure3(), type$.legacy_ComplexSelectorComponent_2);
+    },
+    $signature: 144
+  };
+  Y._weaveParents__closure3.prototype = {
+    call$1: function(group) {
+      return group;
+    },
+    $signature: 123
+  };
+  Y._weaveParents_closure11.prototype = {
+    call$1: function(choice) {
+      return J.get$isNotEmpty$asx(choice);
+    },
+    $signature: 369
+  };
+  Y._weaveParents_closure12.prototype = {
+    call$1: function(path) {
+      var t1 = J.expand$1$1$ax(path, new Y._weaveParents__closure2(), type$.legacy_ComplexSelectorComponent_2);
+      return P.List_List$from(t1, true, t1.$ti._eval$1("Iterable.E"));
+    },
+    $signature: 370
+  };
+  Y._weaveParents__closure2.prototype = {
+    call$1: function(group) {
+      return group;
+    },
+    $signature: 371
+  };
+  Y._mustUnify_closure0.prototype = {
+    call$1: function(component) {
+      return component instanceof X.CompoundSelector0 && C.JSArray_methods.any$1(component.components, new Y._mustUnify__closure0(this.uniqueSelectors));
+    },
+    $signature: 93
+  };
+  Y._mustUnify__closure0.prototype = {
+    call$1: function(simple) {
+      var t1;
+      if (!(simple instanceof N.IDSelector0))
+        t1 = simple instanceof D.PseudoSelector0 && !simple.isClass;
+      else
+        t1 = true;
+      return t1 && this.uniqueSelectors.contains$1(0, simple);
+    },
+    $signature: 19
+  };
+  Y.paths_closure0.prototype = {
+    call$2: function(paths, choice) {
+      var t1 = this.T;
+      t1 = J.expand$1$1$ax(choice, new Y.paths__closure0(paths, t1), t1._eval$1("List<0*>*"));
+      return P.List_List$from(t1, true, t1.$ti._eval$1("Iterable.E"));
+    },
+    $signature: function() {
+      return this.T._eval$1("List<List<0*>*>*(List<List<0*>*>*,List<0*>*)");
+    }
+  };
+  Y.paths__closure0.prototype = {
+    call$1: function(option) {
+      var t1 = this.T;
+      return J.map$1$1$ax(this.paths, new Y.paths___closure0(option, t1), t1._eval$1("List<0*>*"));
+    },
+    $signature: function() {
+      return this.T._eval$1("Iterable<List<0*>*>*(0*)");
+    }
+  };
+  Y.paths___closure0.prototype = {
+    call$1: function(path) {
+      var t2,
+        t1 = H.setRuntimeTypeInfo([], this.T._eval$1("JSArray<0*>"));
+      for (t2 = J.get$iterator$ax(path); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      t1.push(this.option);
+      return t1;
+    },
+    $signature: function() {
+      return this.T._eval$1("List<0*>*(List<0*>*)");
+    }
+  };
+  Y._hasRoot_closure0.prototype = {
+    call$1: function(simple) {
+      return simple instanceof D.PseudoSelector0 && simple.isClass && simple.normalizedName === "root";
+    },
+    $signature: 19
+  };
+  Y.listIsSuperselector_closure0.prototype = {
+    call$1: function(complex1) {
+      return C.JSArray_methods.any$1(this.list1, new Y.listIsSuperselector__closure0(complex1));
+    },
+    $signature: 14
+  };
+  Y.listIsSuperselector__closure0.prototype = {
+    call$1: function(complex2) {
+      return Y.complexIsSuperselector0(complex2.components, this.complex1.components);
+    },
+    $signature: 14
+  };
+  Y._simpleIsSuperselectorOfCompound_closure0.prototype = {
+    call$1: function(theirSimple) {
+      var t1 = this.simple;
+      if (J.$eq$(t1, theirSimple))
+        return true;
+      if (theirSimple instanceof D.PseudoSelector0 && theirSimple.selector != null && $._subselectorPseudos0.contains$1(0, theirSimple.normalizedName))
+        return C.JSArray_methods.every$1(theirSimple.selector.components, new Y._simpleIsSuperselectorOfCompound__closure0(t1));
+      else
+        return false;
+    },
+    $signature: 19
+  };
+  Y._simpleIsSuperselectorOfCompound__closure0.prototype = {
+    call$1: function(complex) {
+      var t1 = complex.components;
+      if (t1.length !== 1)
+        return false;
+      return C.JSArray_methods.contains$1(type$.legacy_CompoundSelector_2._as(C.JSArray_methods.get$single(t1)).components, this.simple);
+    },
+    $signature: 14
+  };
+  Y._selectorPseudoIsSuperselector_closure6.prototype = {
+    call$1: function(pseudo2) {
+      var t1 = pseudo2.selector;
+      return Y.listIsSuperselector0(this.pseudo1.selector.components, t1.components);
+    },
+    $signature: 58
+  };
+  Y._selectorPseudoIsSuperselector_closure7.prototype = {
+    call$1: function(complex1) {
+      var t1 = complex1.components,
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent_2),
+        t3 = this.parents;
+      if (t3 != null)
+        for (t3 = t3.get$iterator(t3); t3.moveNext$0();)
+          t2.push(t3.get$current(t3));
+      t2.push(this.compound2);
+      return Y.complexIsSuperselector0(t1, t2);
+    },
+    $signature: 14
+  };
+  Y._selectorPseudoIsSuperselector_closure8.prototype = {
+    call$1: function(pseudo2) {
+      var t1 = pseudo2.selector;
+      return Y.listIsSuperselector0(this.pseudo1.selector.components, t1.components);
+    },
+    $signature: 58
+  };
+  Y._selectorPseudoIsSuperselector_closure9.prototype = {
+    call$1: function(pseudo2) {
+      var t1 = pseudo2.selector;
+      return Y.listIsSuperselector0(this.pseudo1.selector.components, t1.components);
+    },
+    $signature: 58
+  };
+  Y._selectorPseudoIsSuperselector_closure10.prototype = {
+    call$1: function(complex) {
+      return C.JSArray_methods.any$1(this.compound2.components, new Y._selectorPseudoIsSuperselector__closure0(complex, this.pseudo1));
+    },
+    $signature: 14
+  };
+  Y._selectorPseudoIsSuperselector__closure0.prototype = {
+    call$1: function(simple2) {
+      var compound1, _this = this;
+      if (simple2 instanceof F.TypeSelector0) {
+        compound1 = C.JSArray_methods.get$last(_this.complex.components);
+        return compound1 instanceof X.CompoundSelector0 && C.JSArray_methods.any$1(compound1.components, new Y._selectorPseudoIsSuperselector___closure1(simple2));
+      } else if (simple2 instanceof N.IDSelector0) {
+        compound1 = C.JSArray_methods.get$last(_this.complex.components);
+        return compound1 instanceof X.CompoundSelector0 && C.JSArray_methods.any$1(compound1.components, new Y._selectorPseudoIsSuperselector___closure2(simple2));
+      } else if (simple2 instanceof D.PseudoSelector0 && simple2.name === _this.pseudo1.name && simple2.selector != null)
+        return Y.listIsSuperselector0(simple2.selector.components, H.setRuntimeTypeInfo([_this.complex], type$.JSArray_legacy_ComplexSelector_2));
+      else
+        return false;
+    },
+    $signature: 19
+  };
+  Y._selectorPseudoIsSuperselector___closure1.prototype = {
+    call$1: function(simple1) {
+      var t1;
+      if (simple1 instanceof F.TypeSelector0) {
+        t1 = this.simple2.name.$eq(0, simple1.name);
+        t1 = !t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 19
+  };
+  Y._selectorPseudoIsSuperselector___closure2.prototype = {
+    call$1: function(simple1) {
+      var t1;
+      if (simple1 instanceof N.IDSelector0) {
+        t1 = simple1.name;
+        t1 = this.simple2.name !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 19
+  };
+  Y._selectorPseudoIsSuperselector_closure11.prototype = {
+    call$1: function(pseudo2) {
+      return J.$eq$(this.pseudo1.selector, pseudo2.selector);
+    },
+    $signature: 58
+  };
+  Y._selectorPseudoIsSuperselector_closure12.prototype = {
+    call$1: function(pseudo2) {
+      var t1, t2;
+      if (pseudo2 instanceof D.PseudoSelector0) {
+        t1 = this.pseudo1;
+        if (pseudo2.name === t1.name)
+          if (pseudo2.argument == t1.argument) {
+            t2 = pseudo2.selector;
+            t2 = Y.listIsSuperselector0(t1.selector.components, t2.components);
+            t1 = t2;
+          } else
+            t1 = false;
+        else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 19
+  };
+  Y._selectorPseudosNamed_closure0.prototype = {
+    call$1: function(pseudo) {
+      return pseudo.isClass === this.isClass && pseudo.selector != null && pseudo.name === this.name;
+    },
+    $signature: 58
+  };
+  Y.closure114.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return t1.$index($arguments, 0).get$isTruthy() ? t1.$index($arguments, 1) : t1.$index($arguments, 2);
+    },
+    $signature: 3
+  };
+  N.IDSelector0.prototype = {
+    get$minSpecificity: function() {
+      return H._asIntS(Math.pow(M.SimpleSelector0.prototype.get$minSpecificity.call(this), 2));
+    },
+    accept$1$1: function(visitor) {
+      var t1 = visitor._buffer;
+      t1.writeCharCode$1(35);
+      t1.write$1(0, this.name);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    addSuffix$1: function(suffix) {
+      return new N.IDSelector0(this.name + suffix);
+    },
+    unify$1: function(compound) {
+      if (C.JSArray_methods.any$1(compound, new N.IDSelector_unify_closure0(this)))
+        return null;
+      return this.super$SimpleSelector$unify0(compound);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof N.IDSelector0 && other.name === this.name;
+    },
+    get$hashCode: function(_) {
+      return C.JSString_methods.get$hashCode(this.name);
+    }
+  };
+  N.IDSelector_unify_closure0.prototype = {
+    call$1: function(simple) {
+      var t1;
+      if (simple instanceof N.IDSelector0) {
+        t1 = simple.name;
+        t1 = this.$this.name !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 19
+  };
+  L.IfExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitIfExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "if" + this.$arguments.toString$0(0);
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.IfRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitIfRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t2, t1 = {};
+      t1.first = true;
+      t2 = this.clauses;
+      return new H.MappedListIterable(t2, new V.IfRule_toString_closure0(t1), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,String*>")).join$1(0, " ");
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.IfRule_toString_closure0.prototype = {
+    call$1: function(clause) {
+      var t1 = this._box_0,
+        $name = t1.first ? "if" : "else";
+      t1.first = false;
+      return "@" + $name + " " + H.S(clause.expression) + " {" + C.JSArray_methods.join$1(clause.children, " ") + "}";
+    },
+    $signature: 373
+  };
+  V.IfClause0.prototype = {
+    toString$0: function(_) {
+      var t1 = this.expression;
+      t1 = t1 == null ? "@else" : "@if " + t1.toString$0(0);
+      return t1 + (" {" + C.JSArray_methods.join$1(this.children, " ") + "}");
+    }
+  };
+  V.IfClause$__closure0.prototype = {
+    call$1: function(child) {
+      var t1;
+      if (!(child instanceof Z.VariableDeclaration0))
+        if (!(child instanceof M.FunctionRule0))
+          if (!(child instanceof T.MixinRule0))
+            t1 = child instanceof B.ImportRule0 && C.JSArray_methods.any$1(child.imports, new V.IfClause$___closure0());
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 135
+  };
+  V.IfClause$___closure0.prototype = {
+    call$1: function($import) {
+      return $import instanceof B.DynamicImport0;
+    },
+    $signature: 134
+  };
+  F.NodeImporter.prototype = {
+    load$3: function(_, url, previous, forImport) {
+      var result, previousString, t1, t2, t3, t4, _i, value, _this = this,
+        parsed = P.Uri_parse(url);
+      if (parsed.get$scheme() === "" || parsed.get$scheme() === "file") {
+        result = _this._resolveRelativePath$3($.$get$context().style.pathFromUri$1(M._parseUri(parsed)), previous, forImport);
+        if (result != null)
+          return result;
+      }
+      previousString = previous.get$scheme() === "file" ? $.$get$context().style.pathFromUri$1(M._parseUri(previous)) : previous.toString$0(0);
+      for (t1 = _this._implementation$_importers, t2 = t1.length, t3 = _this._implementation$_context, t4 = type$.JSArray_legacy_Object, _i = 0; _i < t2; ++_i) {
+        value = J.apply$2$x(t1[_i], t3, H.setRuntimeTypeInfo([url, previousString], t4));
+        if (value != null)
+          return _this._handleImportResult$4(url, previous, value, forImport);
+      }
+      return _this._resolveLoadPathFromUrl$3(parsed, previous, forImport);
+    },
+    loadAsync$3: function(url, previous, forImport) {
+      return this.loadAsync$body$NodeImporter(url, previous, forImport);
+    },
+    loadAsync$body$NodeImporter: function(url, previous, forImport) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Tuple2_of_legacy_String_and_legacy_String),
+        $async$returnValue, $async$self = this, result, previousString, t1, t2, _i, value, parsed;
+      var $async$loadAsync$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              parsed = P.Uri_parse(url);
+              if (parsed.get$scheme() === "" || parsed.get$scheme() === "file") {
+                result = $async$self._resolveRelativePath$3($.$get$context().style.pathFromUri$1(M._parseUri(parsed)), previous, forImport);
+                if (result != null) {
+                  $async$returnValue = result;
+                  // goto return
+                  $async$goto = 1;
+                  break;
+                }
+              }
+              previousString = previous.get$scheme() === "file" ? $.$get$context().style.pathFromUri$1(M._parseUri(previous)) : previous.toString$0(0);
+              t1 = $async$self._implementation$_importers, t2 = t1.length, _i = 0;
+            case 3:
+              // for condition
+              if (!(_i < t2)) {
+                // goto after for
+                $async$goto = 5;
+                break;
+              }
+              $async$goto = 6;
+              return P._asyncAwait($async$self._callImporterAsync$3(t1[_i], url, previousString), $async$loadAsync$3);
+            case 6:
+              // returning from await.
+              value = $async$result;
+              if (value != null) {
+                $async$returnValue = $async$self._handleImportResult$4(url, previous, value, forImport);
+                // goto return
+                $async$goto = 1;
+                break;
+              }
+            case 4:
+              // for update
+              ++_i;
+              // goto for condition
+              $async$goto = 3;
+              break;
+            case 5:
+              // after for
+              $async$returnValue = $async$self._resolveLoadPathFromUrl$3(parsed, previous, forImport);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$loadAsync$3, $async$completer);
+    },
+    _resolveRelativePath$3: function(path, previous, forImport) {
+      var result,
+        t1 = $.$get$context(),
+        t2 = t1.style;
+      if (t2.rootLength$1(path) > 0)
+        return this._tryPath$2(path, forImport);
+      if (previous.get$scheme() === "file") {
+        result = this._tryPath$2(D.join(t1.dirname$1(t2.pathFromUri$1(M._parseUri(previous))), path, null), forImport);
+        if (result != null)
+          return result;
+      }
+      return null;
+    },
+    _resolveLoadPathFromUrl$3: function(url, previous, forImport) {
+      return url.get$scheme() === "" || url.get$scheme() === "file" ? this._resolveLoadPath$3($.$get$context().style.pathFromUri$1(M._parseUri(url)), previous, forImport) : null;
+    },
+    _resolveLoadPath$3: function(path, previous, forImport) {
+      var t1, t2, _i, includePath, t3, result, _null = null,
+        cwdResult = this._tryPath$2(D.absolute(path), forImport);
+      if (cwdResult != null)
+        return cwdResult;
+      for (t1 = this._includePaths, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        includePath = t1[_i];
+        t3 = $.$get$context();
+        result = this._tryPath$2(t3.absolute$7(t3.join$8(0, includePath, path, _null, _null, _null, _null, _null, _null), _null, _null, _null, _null, _null, _null), forImport);
+        if (result != null)
+          return result;
+      }
+      return _null;
+    },
+    _tryPath$2: function(path, forImport) {
+      var resolved = forImport ? B.inImportRule0(new F.NodeImporter__tryPath_closure(path)) : B.resolveImportPath0(path);
+      return resolved == null ? null : new S.Tuple2(B.readFile0(resolved), $.$get$context().toUri$1(resolved).toString$0(0), type$.Tuple2_of_legacy_String_and_legacy_String);
+    },
+    _handleImportResult$4: function(url, previous, value, forImport) {
+      var resolved,
+        t1 = self.Error;
+      if (H._asBoolS($.$get$_jsInstanceOf().call$2(value, t1)))
+        throw H.wrapException(value);
+      if (!type$.legacy_NodeImporterResult._is(value))
+        return null;
+      t1 = J.getInterceptor$x(value);
+      if (t1.get$file(value) == null) {
+        t1 = t1.get$contents(value);
+        if (t1 == null)
+          t1 = "";
+        return new S.Tuple2(t1, url, type$.Tuple2_of_legacy_String_and_legacy_String);
+      } else if (t1.get$contents(value) != null)
+        return new S.Tuple2(t1.get$contents(value), t1.get$file(value), type$.Tuple2_of_legacy_String_and_legacy_String);
+      else {
+        resolved = this._resolveRelativePath$3(t1.get$file(value), previous, forImport);
+        if (resolved == null)
+          resolved = this._resolveLoadPath$3(t1.get$file(value), previous, forImport);
+        if (resolved != null)
+          return resolved;
+        throw H.wrapException("Can't find stylesheet to import.");
+      }
+    },
+    _callImporterAsync$3: function(importer, url, previousString) {
+      return this._callImporterAsync$body$NodeImporter(importer, url, previousString);
+    },
+    _callImporterAsync$body$NodeImporter: function(importer, url, previousString) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Object),
+        $async$returnValue, $async$self = this, t1, result;
+      var $async$_callImporterAsync$3 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              t1 = new P._Future($.Zone__current, type$._Future_legacy_Object);
+              result = J.apply$2$x(importer, $async$self._implementation$_context, H.setRuntimeTypeInfo([url, previousString, P.allowInterop(new P._AsyncCompleter(t1, type$._AsyncCompleter_legacy_Object).get$complete())], type$.JSArray_legacy_Object));
+              $async$goto = H._asBoolS($.$get$_isUndefined().call$1(result)) ? 3 : 4;
+              break;
+            case 3:
+              // then
+              $async$goto = 5;
+              return P._asyncAwait(t1, $async$_callImporterAsync$3);
+            case 5:
+              // returning from await.
+              $async$returnValue = $async$result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 4:
+              // join
+              $async$returnValue = result;
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$_callImporterAsync$3, $async$completer);
+    }
+  };
+  F.NodeImporter__tryPath_closure.prototype = {
+    call$0: function() {
+      return B.resolveImportPath0(this.path);
+    },
+    $signature: 12
+  };
+  F.ModifiableCssImport0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssImport$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    $isCssImport0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  R.ImportCache0.prototype = {
+    canonicalize$4$baseImporter$baseUrl$forImport: function(url, baseImporter, baseUrl, forImport) {
+      var resolvedUrl, canonicalUrl;
+      if (baseImporter != null) {
+        resolvedUrl = baseUrl != null ? baseUrl.resolveUri$1(url) : url;
+        canonicalUrl = this._import_cache$_canonicalize$3(baseImporter, resolvedUrl, forImport);
+        if (canonicalUrl != null)
+          return new S.Tuple3(baseImporter, canonicalUrl, resolvedUrl, type$.Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri_2);
+      }
+      return this._import_cache$_canonicalizeCache.putIfAbsent$2(new S.Tuple2(url, forImport, type$.Tuple2_of_legacy_Uri_and_legacy_bool), new R.ImportCache_canonicalize_closure0(this, url, forImport));
+    },
+    _import_cache$_canonicalize$3: function(importer, url, forImport) {
+      var result = forImport ? B.inImportRule0(new R.ImportCache__canonicalize_closure0(importer, url)) : importer.canonicalize$1(url);
+      if ((result == null ? null : result.get$scheme()) === "")
+        this._import_cache$_logger.warn$2$deprecation(0, "Importer " + H.S(importer) + " canonicalized " + url.toString$0(0) + " to " + H.S(result) + string$.x2e_Rela, true);
+      return result;
+    },
+    import$4$baseImporter$baseUrl$forImport: function(url, baseImporter, baseUrl, forImport) {
+      var t1, stylesheet,
+        tuple = this.canonicalize$4$baseImporter$baseUrl$forImport(url, baseImporter, baseUrl, forImport);
+      if (tuple == null)
+        return null;
+      t1 = tuple.item1;
+      stylesheet = this.importCanonical$3(t1, tuple.item2, tuple.item3);
+      if (stylesheet == null)
+        return null;
+      return new S.Tuple2(t1, stylesheet, type$.Tuple2_of_legacy_Importer_and_legacy_Stylesheet_2);
+    },
+    importCanonical$3: function(importer, canonicalUrl, originalUrl) {
+      return this._import_cache$_importCache.putIfAbsent$2(canonicalUrl, new R.ImportCache_importCanonical_closure0(this, importer, canonicalUrl, originalUrl));
+    },
+    humanize$1: function(canonicalUrl) {
+      var t2, url,
+        t1 = this._import_cache$_canonicalizeCache;
+      t1 = t1.get$values(t1);
+      t2 = H._instanceType(t1);
+      url = Y.minBy(new H.MappedIterable(new H.WhereIterable(t1, new R.ImportCache_humanize_closure2(canonicalUrl), t2._eval$1("WhereIterable<Iterable.E>")), new R.ImportCache_humanize_closure3(), t2._eval$1("MappedIterable<Iterable.E,Uri*>")), new R.ImportCache_humanize_closure4(), type$.legacy_Uri, type$.dynamic);
+      if (url == null)
+        return canonicalUrl;
+      t1 = $.$get$url();
+      return url.resolve$1(X.ParsedPath_ParsedPath$parse(canonicalUrl.get$path(canonicalUrl), t1.style).get$basename());
+    }
+  };
+  R.ImportCache_canonicalize_closure0.prototype = {
+    call$0: function() {
+      var t1, t2, t3, _i, importer, canonicalUrl;
+      for (t1 = this.$this, t2 = this.url, t3 = this.forImport, _i = 0; false; ++_i) {
+        importer = C.List_empty17[_i];
+        canonicalUrl = t1._import_cache$_canonicalize$3(importer, t2, t3);
+        if (canonicalUrl != null)
+          return new S.Tuple3(importer, canonicalUrl, t2, type$.Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri_2);
+      }
+      return null;
+    },
+    $signature: 376
+  };
+  R.ImportCache__canonicalize_closure0.prototype = {
+    call$0: function() {
+      return this.importer.canonicalize$1(this.url);
+    },
+    $signature: 161
+  };
+  R.ImportCache_importCanonical_closure0.prototype = {
+    call$0: function() {
+      var t3, _this = this,
+        t1 = _this.canonicalUrl,
+        result = _this.importer.load$1(0, t1),
+        t2 = _this.$this;
+      t2._import_cache$_resultsCache.$indexSet(0, t1, result);
+      t3 = _this.originalUrl;
+      t1 = t3 == null ? t1 : t3.resolveUri$1(t1);
+      return V.Stylesheet_Stylesheet$parse0(result.contents, result.syntax, t2._import_cache$_logger, t1);
+    },
+    $signature: 214
+  };
+  R.ImportCache_humanize_closure2.prototype = {
+    call$1: function(tuple) {
+      var t1 = tuple == null ? null : tuple.item2;
+      return J.$eq$(t1, this.canonicalUrl);
+    },
+    $signature: 378
+  };
+  R.ImportCache_humanize_closure3.prototype = {
+    call$1: function(tuple) {
+      return tuple.item3;
+    },
+    $signature: 379
+  };
+  R.ImportCache_humanize_closure4.prototype = {
+    call$1: function(url) {
+      return J.get$length$asx(J.get$path$x(url));
+    },
+    $signature: 43
+  };
+  B.ImportRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitImportRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@import " + C.JSArray_methods.join$1(this.imports, ", ") + ";";
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  M.Importer0.prototype = {};
+  F.NodeImporterResult0.prototype = {};
+  A.IncludeRule0.prototype = {
+    get$spanWithoutContent: function() {
+      var t2, t3,
+        t1 = this.span;
+      if (!(this.content == null)) {
+        t2 = t1.file;
+        t3 = this.$arguments.span;
+        t3 = B.SpanExtensions_trim0(t2.span$2(Y.FileLocation$_(t2, t1._file$_start).offset, Y.FileLocation$_(t3.file, t3._end).offset));
+        t1 = t3;
+      }
+      return t1;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitIncludeRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t2, _this = this,
+        t1 = _this.namespace;
+      t1 = t1 != null ? "@include " + (t1 + ".") : "@include ";
+      t1 += _this.name;
+      t2 = _this.$arguments;
+      if (!t2.get$isEmpty(t2))
+        t1 += "(" + t2.toString$0(0) + ")";
+      t2 = _this.content;
+      t1 += t2 == null ? ";" : " " + t2.toString$0(0);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.Interpolation0.prototype = {
+    get$asPlain: function() {
+      var first,
+        t1 = this.contents,
+        t2 = t1.length;
+      if (t2 === 0)
+        return "";
+      if (t2 > 1)
+        return null;
+      first = C.JSArray_methods.get$first(t1);
+      return typeof first == "string" ? first : null;
+    },
+    get$initialPlain: function() {
+      var first = C.JSArray_methods.get$first(this.contents);
+      return typeof first == "string" ? first : "";
+    },
+    Interpolation$20: function(contents, span) {
+      var t1, t2, t3, i, t4, t5,
+        _s8_ = "contents";
+      for (t1 = this.contents, t2 = t1.length, t3 = type$.legacy_Expression_2, i = 0; i < t2; ++i) {
+        t4 = t1[i];
+        t5 = typeof t4 == "string";
+        if (!t5 && !t3._is(t4))
+          throw H.wrapException(P.ArgumentError$value(t1, _s8_, string$.May_on));
+        if (i !== 0 && typeof t1[i - 1] == "string" && t5)
+          throw H.wrapException(P.ArgumentError$value(t1, _s8_, "May not contain adjacent Strings."));
+      }
+    },
+    toString$0: function(_) {
+      var t1 = this.contents;
+      return new H.MappedListIterable(t1, new X.Interpolation_toString_closure0(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$0(0);
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.Interpolation_toString_closure0.prototype = {
+    call$1: function(value) {
+      return typeof value == "string" ? value : "#{" + H.S(value) + "}";
+    },
+    $signature: 41
+  };
+  X.SupportsInterpolation0.prototype = {
+    toString$0: function(_) {
+      return "#{" + H.S(this.expression) + "}";
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Z.InterpolationBuffer0.prototype = {
+    add$1: function(_, expression) {
+      this._interpolation_buffer0$_flushText$0();
+      this._interpolation_buffer0$_contents.push(expression);
+    },
+    addInterpolation$1: function(interpolation) {
+      var first, t1, _this = this,
+        toAdd = interpolation.contents;
+      if (toAdd.length === 0)
+        return;
+      first = C.JSArray_methods.get$first(toAdd);
+      if (typeof first == "string") {
+        _this._interpolation_buffer0$_text._contents += first;
+        toAdd = H.SubListIterable$(toAdd, 1, null, H._arrayInstanceType(toAdd)._precomputed1);
+      }
+      _this._interpolation_buffer0$_flushText$0();
+      t1 = _this._interpolation_buffer0$_contents;
+      C.JSArray_methods.addAll$1(t1, toAdd);
+      if (typeof C.JSArray_methods.get$last(t1) == "string")
+        _this._interpolation_buffer0$_text._contents += H.S(t1.pop());
+    },
+    _interpolation_buffer0$_flushText$0: function() {
+      var t1 = this._interpolation_buffer0$_text,
+        t2 = t1._contents;
+      if (t2.length === 0)
+        return;
+      this._interpolation_buffer0$_contents.push(t2.charCodeAt(0) == 0 ? t2 : t2);
+      t1._contents = "";
+    },
+    interpolation$1: function(span) {
+      var t2, t3, _i,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
+      for (t2 = this._interpolation_buffer0$_contents, t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        t1.push(t2[_i]);
+      t2 = this._interpolation_buffer0$_text._contents;
+      if (t2.length !== 0)
+        t1.push(t2.charCodeAt(0) == 0 ? t2 : t2);
+      return X.Interpolation$0(t1, span);
+    },
+    toString$0: function(_) {
+      var t1, t2, _i, t3, element;
+      for (t1 = this._interpolation_buffer0$_contents, t2 = t1.length, _i = 0, t3 = ""; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        element = t1[_i];
+        t3 = typeof element == "string" ? t3 + element : t3 + "#{" + H.S(element) + H.Primitives_stringFromCharCode(125);
+      }
+      t1 = t3 + this._interpolation_buffer0$_text.toString$0(0);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  F._realCasePath_helper0.prototype = {
+    call$1: function(path) {
+      var dirname = $.$get$context().dirname$1(path);
+      if (dirname === path)
+        return path;
+      return $._realCaseCache0.putIfAbsent$2(path, new F._realCasePath_helper_closure0(this, dirname, path));
+    },
+    $signature: 4
+  };
+  F._realCasePath_helper_closure0.prototype = {
+    call$0: function() {
+      var matches, t2, exception,
+        realDirname = this.helper.call$1(this.dirname),
+        t1 = this.path,
+        basename = X.ParsedPath_ParsedPath$parse(t1, $.$get$context().style).get$basename();
+      try {
+        matches = J.where$1$ax(B.listDir0(realDirname), new F._realCasePath_helper__closure0(basename)).toList$0(0);
+        t2 = J.get$length$asx(matches) !== 1 ? D.join(realDirname, basename, null) : J.$index$asx(matches, 0);
+        return t2;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof B.FileSystemException0)
+          return t1;
+        else
+          throw exception;
+      }
+    },
+    $signature: 12
+  };
+  F._realCasePath_helper__closure0.prototype = {
+    call$1: function(realPath) {
+      return B.equalsIgnoreCase0(X.ParsedPath_ParsedPath$parse(realPath, $.$get$context().style).get$basename(), this.basename);
+    },
+    $signature: 6
+  };
+  U.ModifiableCssKeyframeBlock0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssKeyframeBlock$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return U.ModifiableCssKeyframeBlock$0(this.selector, this.span);
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  E.KeyframeSelectorParser0.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new E.KeyframeSelectorParser_parse_closure0(this));
+    },
+    _keyframe_selector$_percentage$0: function() {
+      var t3, next,
+        t1 = this.scanner,
+        t2 = t1.scanChar$1(43) ? H.Primitives_stringFromCharCode(43) : "",
+        second = t1.peekChar$0();
+      if (!T.isDigit0(second) && second !== 46)
+        t1.error$1(0, "Expected number.");
+      while (true) {
+        t3 = t1.peekChar$0();
+        if (!(t3 != null && t3 >= 48 && t3 <= 57))
+          break;
+        t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+      }
+      if (t1.peekChar$0() === 46) {
+        t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+        while (true) {
+          t3 = t1.peekChar$0();
+          if (!(t3 != null && t3 >= 48 && t3 <= 57))
+            break;
+          t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+        }
+      }
+      if (this.scanIdentifier$1("e")) {
+        t2 += t1.readChar$0();
+        next = t1.peekChar$0();
+        if (next === 43 || next === 45)
+          t2 += t1.readChar$0();
+        if (!T.isDigit0(t1.peekChar$0()))
+          t1.error$1(0, "Expected digit.");
+        while (true) {
+          t3 = t1.peekChar$0();
+          if (!(t3 != null && t3 >= 48 && t3 <= 57))
+            break;
+          t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+        }
+      }
+      t1.expectChar$1(37);
+      t2 += H.Primitives_stringFromCharCode(37);
+      return t2.charCodeAt(0) == 0 ? t2 : t2;
+    }
+  };
+  E.KeyframeSelectorParser_parse_closure0.prototype = {
+    call$0: function() {
+      var selectors = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String),
+        t1 = this.$this,
+        t2 = t1.scanner;
+      do {
+        t1.whitespace$0();
+        if (t1.lookingAtIdentifier$0())
+          if (t1.scanIdentifier$1("from"))
+            selectors.push("from");
+          else {
+            t1.expectIdentifier$2$name("to", '"to" or "from"');
+            selectors.push("to");
+          }
+        else
+          selectors.push(t1._keyframe_selector$_percentage$0());
+        t1.whitespace$0();
+      } while (t2.scanChar$1(44));
+      t2.expectDone$0();
+      return selectors;
+    },
+    $signature: 40
+  };
+  K.LimitedMapView0.prototype = {
+    get$keys: function(_) {
+      return this._limited_map_view0$_keys;
+    },
+    get$length: function(_) {
+      return this._limited_map_view0$_keys._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._limited_map_view0$_keys._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._limited_map_view0$_keys._collection$_length !== 0;
+    },
+    $index: function(_, key) {
+      return this._limited_map_view0$_keys.contains$1(0, key) ? this._limited_map_view0$_map.$index(0, key) : null;
+    },
+    containsKey$1: function(key) {
+      return this._limited_map_view0$_keys.contains$1(0, key);
+    },
+    remove$1: function(_, key) {
+      return this._limited_map_view0$_keys.contains$1(0, key) ? this._limited_map_view0$_map.remove$1(0, key) : null;
+    }
+  };
+  D.ListExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitListExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var _this = this,
+        t1 = _this.hasBrackets,
+        t2 = t1 ? H.Primitives_stringFromCharCode(91) : "",
+        t3 = _this.contents,
+        t4 = _this.separator === C.ListSeparator_comma0 ? ", " : " ";
+      t4 = t2 + new H.MappedListIterable(t3, new D.ListExpression_toString_closure0(_this), H._arrayInstanceType(t3)._eval$1("MappedListIterable<1,String*>")).join$1(0, t4);
+      t1 = t1 ? t4 + H.Primitives_stringFromCharCode(93) : t4;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    _list3$_elementNeedsParens$1: function(expression) {
+      var t1, t2;
+      if (expression instanceof D.ListExpression0) {
+        if (expression.contents.length < 2)
+          return false;
+        if (expression.hasBrackets)
+          return false;
+        t1 = this.separator;
+        t2 = t1 === C.ListSeparator_comma0;
+        return t2 ? t2 : t1 !== C.ListSeparator_undecided0;
+      }
+      if (this.separator !== C.ListSeparator_space0)
+        return false;
+      if (expression instanceof X.UnaryOperationExpression0) {
+        t1 = expression.operator;
+        return t1 === C.UnaryOperator_j2w0 || t1 === C.UnaryOperator_U4G0;
+      }
+      return false;
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  D.ListExpression_toString_closure0.prototype = {
+    call$1: function(element) {
+      return this.$this._list3$_elementNeedsParens$1(element) ? "(" + H.S(element) + ")" : J.toString$0$(element);
+    },
+    $signature: 380
+  };
+  D.closure158.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).get$asList().length;
+      return new N.UnitlessSassNumber0(t1, null);
+    },
+    $signature: 10
+  };
+  D.closure157.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        list = t1.$index($arguments, 0),
+        index = t1.$index($arguments, 1);
+      return list.get$asList()[list.sassIndexToListIndex$2(index, "n")];
+    },
+    $signature: 3
+  };
+  D.closure156.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        list = t1.$index($arguments, 0),
+        index = t1.$index($arguments, 1),
+        value = t1.$index($arguments, 2),
+        t2 = list.get$asList(),
+        newList = H.setRuntimeTypeInfo(t2.slice(0), H._arrayInstanceType(t2));
+      newList[list.sassIndexToListIndex$2(index, "n")] = value;
+      return t1.$index($arguments, 0).changeListContents$1(newList);
+    },
+    $signature: 27
+  };
+  D.closure155.prototype = {
+    call$1: function($arguments) {
+      var separator, bracketed, t2, t3, _i,
+        t1 = J.getInterceptor$asx($arguments),
+        list1 = t1.$index($arguments, 0),
+        list2 = t1.$index($arguments, 1),
+        separatorParam = t1.$index($arguments, 2).assertString$1("separator"),
+        bracketedParam = t1.$index($arguments, 3);
+      t1 = separatorParam.text;
+      if (t1 === "auto")
+        if (list1.get$separator() !== C.ListSeparator_undecided0)
+          separator = list1.get$separator();
+        else
+          separator = list2.get$separator() !== C.ListSeparator_undecided0 ? list2.get$separator() : C.ListSeparator_space0;
+      else if (t1 === "space")
+        separator = C.ListSeparator_space0;
+      else {
+        if (t1 !== "comma")
+          throw H.wrapException(E.SassScriptException$0(string$.x24separ));
+        separator = C.ListSeparator_comma0;
+      }
+      bracketed = bracketedParam instanceof D.SassString0 && bracketedParam.text === "auto" ? list1.get$hasBrackets() : bracketedParam.get$isTruthy();
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+      for (t2 = list1.get$asList(), t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        t1.push(t2[_i]);
+      for (t2 = list2.get$asList(), t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        t1.push(t2[_i]);
+      return D.SassList$0(t1, separator, bracketed);
+    },
+    $signature: 27
+  };
+  D.closure154.prototype = {
+    call$1: function($arguments) {
+      var separator, t2, t3, _i,
+        t1 = J.getInterceptor$asx($arguments),
+        list = t1.$index($arguments, 0),
+        value = t1.$index($arguments, 1);
+      t1 = t1.$index($arguments, 2).assertString$1("separator").text;
+      if (t1 === "auto")
+        separator = list.get$separator() === C.ListSeparator_undecided0 ? C.ListSeparator_space0 : list.get$separator();
+      else if (t1 === "space")
+        separator = C.ListSeparator_space0;
+      else {
+        if (t1 !== "comma")
+          throw H.wrapException(E.SassScriptException$0(string$.x24separ));
+        separator = C.ListSeparator_comma0;
+      }
+      t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+      for (t2 = list.get$asList(), t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        t1.push(t2[_i]);
+      t1.push(value);
+      return list.changeListContents$2$separator(t1, separator);
+    },
+    $signature: 27
+  };
+  D.closure153.prototype = {
+    call$1: function($arguments) {
+      var results, result, _box_0 = {},
+        t1 = J.$index$asx($arguments, 0).get$asList(),
+        t2 = H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,List<Value0*>*>"),
+        lists = P.List_List$from(new H.MappedListIterable(t1, new D._closure20(), t2), true, t2._eval$1("ListIterable.E"));
+      if (lists.length === 0)
+        return C.SassList_lmy0;
+      _box_0.i = 0;
+      results = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SassList_2);
+      for (t1 = H._arrayInstanceType(lists)._eval$1("MappedListIterable<1,Value0*>"), t2 = type$.legacy_Value_2; C.JSArray_methods.every$1(lists, new D._closure21(_box_0));) {
+        result = P.List_List$from(new H.MappedListIterable(lists, new D._closure22(_box_0), t1), false, t2);
+        result.fixed$length = Array;
+        result.immutable$list = Array;
+        results.push(new D.SassList0(result, C.ListSeparator_space0, false));
+        ++_box_0.i;
+      }
+      return D.SassList$0(results, C.ListSeparator_comma0, false);
+    },
+    $signature: 27
+  };
+  D._closure20.prototype = {
+    call$1: function(list) {
+      return list.get$asList();
+    },
+    $signature: 382
+  };
+  D._closure21.prototype = {
+    call$1: function(list) {
+      return this._box_0.i !== J.get$length$asx(list);
+    },
+    $signature: 383
+  };
+  D._closure22.prototype = {
+    call$1: function(list) {
+      return J.$index$asx(list, this._box_0.i);
+    },
+    $signature: 3
+  };
+  D.closure152.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        index = C.JSArray_methods.indexOf$1(t1.$index($arguments, 0).get$asList(), t1.$index($arguments, 1));
+      if (index === -1)
+        t1 = C.C_SassNull;
+      else
+        t1 = new N.UnitlessSassNumber0(index + 1, null);
+      return t1;
+    },
+    $signature: 3
+  };
+  D.closure150.prototype = {
+    call$1: function($arguments) {
+      return J.$index$asx($arguments, 0).get$separator() === C.ListSeparator_comma0 ? new D.SassString0("comma", false) : new D.SassString0("space", false);
+    },
+    $signature: 17
+  };
+  D.closure151.prototype = {
+    call$1: function($arguments) {
+      return J.$index$asx($arguments, 0).get$hasBrackets() ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  D.SelectorList0.prototype = {
+    get$isInvisible: function() {
+      return C.JSArray_methods.every$1(this.components, new D.SelectorList_isInvisible_closure0());
+    },
+    get$asSassList: function() {
+      var t1 = this.components;
+      return D.SassList$0(new H.MappedListIterable(t1, new D.SelectorList_asSassList_closure0(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Value0*>")), C.ListSeparator_comma0, false);
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitSelectorList$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unify$1: function(other) {
+      var t1 = this.components,
+        t2 = H._arrayInstanceType(t1)._eval$1("ExpandIterable<1,ComplexSelector0*>"),
+        contents = P.List_List$from(new H.ExpandIterable(t1, new D.SelectorList_unify_closure0(other), t2), true, t2._eval$1("Iterable.E"));
+      return contents.length === 0 ? null : D.SelectorList$0(contents);
+    },
+    resolveParentSelectors$2$implicitParent: function($parent, implicitParent) {
+      var t1, _this = this;
+      if ($parent == null) {
+        if (!C.JSArray_methods.any$1(_this.components, _this.get$_list2$_complexContainsParentSelector()))
+          return _this;
+        throw H.wrapException(E.SassScriptException$0(string$.Top_le));
+      }
+      t1 = _this.components;
+      return D.SelectorList$0(B.flattenVertically0(new H.MappedListIterable(t1, new D.SelectorList_resolveParentSelectors_closure0(_this, implicitParent, $parent), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Iterable<ComplexSelector0*>*>")), type$.legacy_ComplexSelector_2));
+    },
+    resolveParentSelectors$1: function($parent) {
+      return this.resolveParentSelectors$2$implicitParent($parent, true);
+    },
+    _list2$_complexContainsParentSelector$1: function(complex) {
+      return C.JSArray_methods.any$1(complex.components, new D.SelectorList__complexContainsParentSelector_closure0());
+    },
+    _list2$_resolveParentSelectorsCompound$2: function(compound, $parent) {
+      var resolvedMembers0, parentSelector, t1,
+        resolvedMembers = compound.components,
+        containsSelectorPseudo = C.JSArray_methods.any$1(resolvedMembers, new D.SelectorList__resolveParentSelectorsCompound_closure2());
+      if (!containsSelectorPseudo && !(C.JSArray_methods.get$first(resolvedMembers) instanceof M.ParentSelector0))
+        return null;
+      resolvedMembers0 = containsSelectorPseudo ? new H.MappedListIterable(resolvedMembers, new D.SelectorList__resolveParentSelectorsCompound_closure3($parent), H._arrayInstanceType(resolvedMembers)._eval$1("MappedListIterable<1,SimpleSelector0*>")) : resolvedMembers;
+      parentSelector = C.JSArray_methods.get$first(resolvedMembers);
+      if (parentSelector instanceof M.ParentSelector0) {
+        if (resolvedMembers.length === 1 && parentSelector.suffix == null)
+          return $parent.components;
+      } else
+        return H.setRuntimeTypeInfo([S.ComplexSelector$0(H.setRuntimeTypeInfo([X.CompoundSelector$0(resolvedMembers0)], type$.JSArray_legacy_ComplexSelectorComponent_2), false)], type$.JSArray_legacy_ComplexSelector_2);
+      t1 = $parent.components;
+      return new H.MappedListIterable(t1, new D.SelectorList__resolveParentSelectorsCompound_closure4(compound, resolvedMembers0), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,ComplexSelector0*>"));
+    },
+    get$hashCode: function(_) {
+      return C.C_ListEquality.hash$1(this.components);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof D.SelectorList0 && C.C_ListEquality.equals$2(0, this.components, other.components);
+    }
+  };
+  D.SelectorList_isInvisible_closure0.prototype = {
+    call$1: function(complex) {
+      return complex.get$isInvisible();
+    },
+    $signature: 14
+  };
+  D.SelectorList_asSassList_closure0.prototype = {
+    call$1: function(complex) {
+      var t1 = complex.components;
+      return D.SassList$0(new H.MappedListIterable(t1, new D.SelectorList_asSassList__closure0(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Value0*>")), C.ListSeparator_space0, false);
+    },
+    $signature: 384
+  };
+  D.SelectorList_asSassList__closure0.prototype = {
+    call$1: function(component) {
+      return new D.SassString0(J.toString$0$(component), false);
+    },
+    $signature: 385
+  };
+  D.SelectorList_unify_closure0.prototype = {
+    call$1: function(complex1) {
+      var t1 = this.other.components;
+      return new H.ExpandIterable(t1, new D.SelectorList_unify__closure0(complex1), H._arrayInstanceType(t1)._eval$1("ExpandIterable<1,ComplexSelector0*>"));
+    },
+    $signature: 120
+  };
+  D.SelectorList_unify__closure0.prototype = {
+    call$1: function(complex2) {
+      var unified = Y.unifyComplex0(H.setRuntimeTypeInfo([this.complex1.components, complex2.components], type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2));
+      if (unified == null)
+        return C.List_empty15;
+      return J.map$1$1$ax(unified, new D.SelectorList_unify___closure0(), type$.legacy_ComplexSelector_2);
+    },
+    $signature: 120
+  };
+  D.SelectorList_unify___closure0.prototype = {
+    call$1: function(complex) {
+      return S.ComplexSelector$0(complex, false);
+    },
+    $signature: 71
+  };
+  D.SelectorList_resolveParentSelectors_closure0.prototype = {
+    call$1: function(complex) {
+      var t2, t3, newComplexes, t4, t5, t6, t7, _i, component, resolved, t8, _i0, previousLineBreaks, newComplexes0, t9, i, newComplex, i0, lineBreak, t10, t11, t12, t13, t14, t15, _i1, _this = this, _box_0 = {},
+        t1 = _this.$this;
+      if (!t1._list2$_complexContainsParentSelector$1(complex)) {
+        if (!_this.implicitParent)
+          return H.setRuntimeTypeInfo([complex], type$.JSArray_legacy_ComplexSelector_2);
+        t1 = _this.parent.components;
+        return new H.MappedListIterable(t1, new D.SelectorList_resolveParentSelectors__closure1(complex), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,ComplexSelector0*>"));
+      }
+      t2 = type$.JSArray_legacy_ComplexSelectorComponent_2;
+      t3 = type$.JSArray_legacy_List_legacy_ComplexSelectorComponent_2;
+      newComplexes = H.setRuntimeTypeInfo([H.setRuntimeTypeInfo([], t2)], t3);
+      t4 = type$.JSArray_legacy_bool;
+      _box_0.lineBreaks = H.setRuntimeTypeInfo([false], t4);
+      for (t5 = complex.components, t6 = t5.length, t7 = _this.parent, _i = 0; _i < t6; ++_i) {
+        component = t5[_i];
+        if (component instanceof X.CompoundSelector0) {
+          resolved = t1._list2$_resolveParentSelectorsCompound$2(component, t7);
+          if (resolved == null) {
+            for (t8 = newComplexes.length, _i0 = 0; _i0 < newComplexes.length; newComplexes.length === t8 || (0, H.throwConcurrentModificationError)(newComplexes), ++_i0)
+              newComplexes[_i0].push(component);
+            continue;
+          }
+          previousLineBreaks = _box_0.lineBreaks;
+          newComplexes0 = H.setRuntimeTypeInfo([], t3);
+          _box_0.lineBreaks = H.setRuntimeTypeInfo([], t4);
+          for (t8 = newComplexes.length, t9 = J.getInterceptor$ax(resolved), i = 0, _i0 = 0; _i0 < newComplexes.length; newComplexes.length === t8 || (0, H.throwConcurrentModificationError)(newComplexes), ++_i0, i = i0) {
+            newComplex = newComplexes[_i0];
+            i0 = i + 1;
+            lineBreak = previousLineBreaks[i];
+            for (t10 = t9.get$iterator(resolved), t11 = !lineBreak; t10.moveNext$0();) {
+              t12 = t10.get$current(t10);
+              t13 = H.setRuntimeTypeInfo([], t2);
+              for (t14 = C.JSArray_methods.get$iterator(newComplex); t14.moveNext$0();)
+                t13.push(t14.get$current(t14));
+              for (t14 = t12.components, t15 = t14.length, _i1 = 0; _i1 < t15; ++_i1)
+                t13.push(t14[_i1]);
+              newComplexes0.push(t13);
+              t13 = _box_0.lineBreaks;
+              t13.push(!t11 || t12.lineBreak);
+            }
+          }
+          newComplexes = newComplexes0;
+        } else
+          for (t8 = newComplexes.length, _i0 = 0; _i0 < newComplexes.length; newComplexes.length === t8 || (0, H.throwConcurrentModificationError)(newComplexes), ++_i0)
+            newComplexes[_i0].push(component);
+      }
+      _box_0.i = 0;
+      return new H.MappedListIterable(newComplexes, new D.SelectorList_resolveParentSelectors__closure2(_box_0), H._arrayInstanceType(newComplexes)._eval$1("MappedListIterable<1,ComplexSelector0*>"));
+    },
+    $signature: 120
+  };
+  D.SelectorList_resolveParentSelectors__closure1.prototype = {
+    call$1: function(parentComplex) {
+      var t2, t3, _i, t4,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent_2);
+      for (t2 = parentComplex.components, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t1.push(t2[_i]);
+      for (t2 = this.complex, t3 = t2.components, t4 = t3.length, _i = 0; _i < t4; ++_i)
+        t1.push(t3[_i]);
+      return S.ComplexSelector$0(t1, t2.lineBreak || parentComplex.lineBreak);
+    },
+    $signature: 99
+  };
+  D.SelectorList_resolveParentSelectors__closure2.prototype = {
+    call$1: function(newComplex) {
+      var t1 = this._box_0;
+      return S.ComplexSelector$0(newComplex, t1.lineBreaks[t1.i++]);
+    },
+    $signature: 71
+  };
+  D.SelectorList__complexContainsParentSelector_closure0.prototype = {
+    call$1: function(component) {
+      return component instanceof X.CompoundSelector0 && C.JSArray_methods.any$1(component.components, new D.SelectorList__complexContainsParentSelector__closure0());
+    },
+    $signature: 93
+  };
+  D.SelectorList__complexContainsParentSelector__closure0.prototype = {
+    call$1: function(simple) {
+      var t1;
+      if (!(simple instanceof M.ParentSelector0))
+        if (simple instanceof D.PseudoSelector0) {
+          t1 = simple.selector;
+          t1 = t1 != null && C.JSArray_methods.any$1(t1.components, t1.get$_list2$_complexContainsParentSelector());
+        } else
+          t1 = false;
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 19
+  };
+  D.SelectorList__resolveParentSelectorsCompound_closure2.prototype = {
+    call$1: function(simple) {
+      var t1;
+      if (simple instanceof D.PseudoSelector0) {
+        t1 = simple.selector;
+        t1 = t1 != null && C.JSArray_methods.any$1(t1.components, t1.get$_list2$_complexContainsParentSelector());
+      } else
+        t1 = false;
+      return t1;
+    },
+    $signature: 19
+  };
+  D.SelectorList__resolveParentSelectorsCompound_closure3.prototype = {
+    call$1: function(simple) {
+      var t1, t2, t3;
+      if (simple instanceof D.PseudoSelector0) {
+        t1 = simple.selector;
+        if (t1 == null)
+          return simple;
+        if (!C.JSArray_methods.any$1(t1.components, t1.get$_list2$_complexContainsParentSelector()))
+          return simple;
+        t1 = t1.resolveParentSelectors$2$implicitParent(this.parent, false);
+        t2 = simple.name;
+        t3 = simple.isClass;
+        return D.PseudoSelector$0(t2, simple.argument, !t3, t1);
+      } else
+        return simple;
+    },
+    $signature: 388
+  };
+  D.SelectorList__resolveParentSelectorsCompound_closure4.prototype = {
+    call$1: function(complex) {
+      var suffix, t2, t3, t4, cur, last, _i,
+        t1 = complex.components,
+        lastComponent = C.JSArray_methods.get$last(t1);
+      if (!(lastComponent instanceof X.CompoundSelector0))
+        throw H.wrapException(E.SassScriptException$0('Parent "' + complex.toString$0(0) + '" is incompatible with this selector.'));
+      suffix = type$.legacy_ParentSelector_2._as(C.JSArray_methods.get$first(this.compound.components)).suffix;
+      t2 = type$.JSArray_legacy_SimpleSelector_2;
+      if (suffix != null) {
+        t2 = H.setRuntimeTypeInfo([], t2);
+        for (t3 = lastComponent.components, t4 = H.SubListIterable$(t3, 0, t3.length - 1, H._arrayInstanceType(t3)._precomputed1), t4 = new H.ListIterator(t4, t4.get$length(t4)); t4.moveNext$0();) {
+          cur = t4.__internal$_current;
+          t2.push(cur);
+        }
+        t2.push(C.JSArray_methods.get$last(t3).addSuffix$1(suffix));
+        for (t3 = J.skip$1$ax(this.resolvedMembers, 1), t3 = new H.ListIterator(t3, t3.get$length(t3)); t3.moveNext$0();) {
+          cur = t3.__internal$_current;
+          t2.push(cur);
+        }
+        last = X.CompoundSelector$0(t2);
+      } else {
+        t2 = H.setRuntimeTypeInfo([], t2);
+        for (t3 = lastComponent.components, t4 = t3.length, _i = 0; _i < t4; ++_i)
+          t2.push(t3[_i]);
+        for (t3 = J.skip$1$ax(this.resolvedMembers, 1), t3 = new H.ListIterator(t3, t3.get$length(t3)); t3.moveNext$0();) {
+          cur = t3.__internal$_current;
+          t2.push(cur);
+        }
+        last = X.CompoundSelector$0(t2);
+      }
+      t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent_2);
+      for (t1 = H.SubListIterable$(t1, 0, t1.length - 1, H._arrayInstanceType(t1)._precomputed1), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        t2.push(cur);
+      }
+      t2.push(last);
+      return S.ComplexSelector$0(t2, complex.lineBreak);
+    },
+    $signature: 99
+  };
+  D._NodeSassList.prototype = {};
+  D.closure246.prototype = {
+    call$4: function(thisArg, $length, commaSeparator, dartValue) {
+      var t1;
+      if (dartValue == null) {
+        t1 = P.Iterable_Iterable$generate($length, new D._closure33(), type$.legacy_Value_2);
+        t1 = D.SassList$0(t1, commaSeparator !== false ? C.ListSeparator_comma0 : C.ListSeparator_space0, false);
+      } else
+        t1 = dartValue;
+      J.set$dartValue$x(thisArg, t1);
+    },
+    call$2: function(thisArg, $length) {
+      return this.call$4(thisArg, $length, null, null);
+    },
+    call$3: function(thisArg, $length, commaSeparator) {
+      return this.call$4(thisArg, $length, commaSeparator, null);
+    },
+    "call*": "call$4",
+    $requiredArgCount: 2,
+    $defaultValues: function() {
+      return [null, null];
+    },
+    $signature: 389
+  };
+  D._closure33.prototype = {
+    call$1: function(_) {
+      return C.C_SassNull;
+    },
+    $signature: 188
+  };
+  D.closure247.prototype = {
+    call$2: function(thisArg, index) {
+      return F.wrapValue(J.get$dartValue$x(thisArg)._list1$_contents[index]);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 391
+  };
+  D.closure248.prototype = {
+    call$3: function(thisArg, index, value) {
+      var t1 = J.getInterceptor$x(thisArg),
+        t2 = t1.get$dartValue(thisArg)._list1$_contents,
+        mutable = H.setRuntimeTypeInfo(t2.slice(0), H._arrayInstanceType(t2)._eval$1("JSArray<1>"));
+      mutable[index] = F.unwrapValue(value);
+      t1.set$dartValue(thisArg, t1.get$dartValue(thisArg).changeListContents$1(mutable));
+    },
+    "call*": "call$3",
+    $requiredArgCount: 3,
+    $signature: 392
+  };
+  D.closure249.prototype = {
+    call$1: function(thisArg) {
+      return J.get$dartValue$x(thisArg).separator === C.ListSeparator_comma0;
+    },
+    $signature: 393
+  };
+  D.closure250.prototype = {
+    call$2: function(thisArg, isComma) {
+      var t1 = J.getInterceptor$x(thisArg),
+        t2 = t1.get$dartValue(thisArg)._list1$_contents,
+        t3 = isComma ? C.ListSeparator_comma0 : C.ListSeparator_space0;
+      t1.set$dartValue(thisArg, D.SassList$0(t2, t3, t1.get$dartValue(thisArg).hasBrackets));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 394
+  };
+  D.closure251.prototype = {
+    call$1: function(thisArg) {
+      return J.get$dartValue$x(thisArg)._list1$_contents.length;
+    },
+    $signature: 395
+  };
+  D.closure252.prototype = {
+    call$1: function(thisArg) {
+      return J.toString$0$(J.get$dartValue$x(thisArg));
+    },
+    $signature: 396
+  };
+  D.SassList0.prototype = {
+    get$isBlank: function() {
+      return C.JSArray_methods.every$1(this._list1$_contents, new D.SassList_isBlank_closure0());
+    },
+    get$asList: function() {
+      return this._list1$_contents;
+    },
+    get$lengthAsList: function() {
+      return this._list1$_contents.length;
+    },
+    SassList$3$brackets0: function(contents, separator, brackets) {
+      if (this.separator === C.ListSeparator_undecided0 && this._list1$_contents.length > 1)
+        throw H.wrapException(P.ArgumentError$(string$.A_list));
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitList$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertMap$1: function($name) {
+      return this._list1$_contents.length === 0 ? C.SassMap_Map_empty0 : this.super$Value$assertMap0($name);
+    },
+    tryMap$0: function() {
+      return this._list1$_contents.length === 0 ? C.SassMap_Map_empty0 : null;
+    },
+    $eq: function(_, other) {
+      var t1, _this = this;
+      if (other == null)
+        return false;
+      if (!(other instanceof D.SassList0 && other.separator === _this.separator && other.hasBrackets === _this.hasBrackets && C.C_ListEquality.equals$2(0, other._list1$_contents, _this._list1$_contents)))
+        t1 = _this._list1$_contents.length === 0 && other instanceof A.SassMap0 && other.get$asList().length === 0;
+      else
+        t1 = true;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      return C.C_ListEquality.hash$1(this._list1$_contents);
+    },
+    get$separator: function() {
+      return this.separator;
+    },
+    get$hasBrackets: function() {
+      return this.hasBrackets;
+    }
+  };
+  D.SassList_isBlank_closure0.prototype = {
+    call$1: function(element) {
+      return element.get$isBlank();
+    },
+    $signature: 55
+  };
+  D.ListSeparator0.prototype = {
+    toString$0: function(_) {
+      return this._list1$_name;
+    }
+  };
+  L.LoudComment0.prototype = {
+    get$span: function() {
+      return this.text.span;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitLoudComment$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return this.text.toString$0(0);
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1
+  };
+  A.MapExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitMapExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.pairs;
+      return "(" + new H.MappedListIterable(t1, new A.MapExpression_toString_closure0(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,String*>")).join$1(0, ", ") + ")";
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  A.MapExpression_toString_closure0.prototype = {
+    call$1: function(pair) {
+      return H.S(pair.item1) + ": " + H.S(pair.item2);
+    },
+    $signature: 397
+  };
+  A.closure149.prototype = {
+    call$1: function($arguments) {
+      var t3, _i, cur, value,
+        t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+      t2.push(t1.$index($arguments, 1));
+      for (t1 = t1.$index($arguments, 2).get$asList(), t3 = t1.length, _i = 0; _i < t1.length; t1.length === t3 || (0, H.throwConcurrentModificationError)(t1), ++_i)
+        t2.push(t1[_i]);
+      for (t1 = H.SubListIterable$(t2, 0, t2.length - 1, type$.legacy_Value_2), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0(); map = value) {
+        cur = t1.__internal$_current;
+        value = map.contents.$index(0, cur);
+        if (!(value instanceof A.SassMap0))
+          return C.C_SassNull;
+      }
+      t1 = map.contents.$index(0, C.JSArray_methods.get$last(t2));
+      return t1 == null ? C.C_SassNull : t1;
+    },
+    $signature: 3
+  };
+  A.closure212.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return A._modify0(t1.$index($arguments, 0).assertMap$1("map"), H.setRuntimeTypeInfo([t1.$index($arguments, 1)], type$.JSArray_legacy_Value_2), new A._closure27($arguments));
+    },
+    $signature: 3
+  };
+  A._closure27.prototype = {
+    call$1: function(_) {
+      return J.$index$asx(this.$arguments, 2);
+    },
+    $signature: 74
+  };
+  A.closure213.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        args = t1.$index($arguments, 1).get$asList();
+      t1 = args.length;
+      if (t1 === 0)
+        throw H.wrapException(E.SassScriptException$0("Expected $args to contain a key."));
+      else if (t1 === 1)
+        throw H.wrapException(E.SassScriptException$0("Expected $args to contain a value."));
+      return A._modify0(map, C.JSArray_methods.sublist$2(args, 0, t1 - 1), new A._closure26(args));
+    },
+    $signature: 3
+  };
+  A._closure26.prototype = {
+    call$1: function(_) {
+      return C.JSArray_methods.get$last(this.args);
+    },
+    $signature: 74
+  };
+  A.closure147.prototype = {
+    call$1: function($arguments) {
+      var t2, t3, t4,
+        t1 = J.getInterceptor$asx($arguments),
+        map1 = t1.$index($arguments, 0).assertMap$1("map1"),
+        map2 = t1.$index($arguments, 1).assertMap$1("map2");
+      t1 = type$.legacy_Value_2;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = map1.contents, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, t4.key, t4.value);
+      }
+      for (t3 = map2.contents, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, t4.key, t4.value);
+      }
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 37
+  };
+  A.closure148.prototype = {
+    call$1: function($arguments) {
+      var map2,
+        t1 = J.getInterceptor$asx($arguments),
+        map1 = t1.$index($arguments, 0).assertMap$1("map1"),
+        args = t1.$index($arguments, 1).get$asList();
+      t1 = args.length;
+      if (t1 === 0)
+        throw H.wrapException(E.SassScriptException$0("Expected $args to contain a key."));
+      else if (t1 === 1)
+        throw H.wrapException(E.SassScriptException$0("Expected $args to contain a map."));
+      map2 = C.JSArray_methods.get$last(args).assertMap$1("map2");
+      return A._modify0(map1, H.SubListIterable$(args, 0, args.length - 1, H._arrayInstanceType(args)._precomputed1), new A._closure19(map2));
+    },
+    $signature: 3
+  };
+  A._closure19.prototype = {
+    call$1: function(oldValue) {
+      var t1, t2, t3, t4,
+        nestedMap = oldValue == null ? null : oldValue.tryMap$0();
+      if (nestedMap == null)
+        return this.map2;
+      t1 = type$.legacy_Value_2;
+      t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t3 = nestedMap.contents, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, t4.key, t4.value);
+      }
+      for (t3 = this.map2.contents, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        t2.$indexSet(0, t4.key, t4.value);
+      }
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+    },
+    $signature: 398
+  };
+  A.closure211.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return A._deepMergeImpl0(t1.$index($arguments, 0).assertMap$1("map1"), t1.$index($arguments, 1).assertMap$1("map2"));
+    },
+    $signature: 37
+  };
+  A.closure210.prototype = {
+    call$1: function($arguments) {
+      var t3, _i,
+        t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+      t2.push(t1.$index($arguments, 1));
+      for (t1 = t1.$index($arguments, 2).get$asList(), t3 = t1.length, _i = 0; _i < t1.length; t1.length === t3 || (0, H.throwConcurrentModificationError)(t1), ++_i)
+        t2.push(t1[_i]);
+      return A._modify0(map, H.SubListIterable$(t2, 0, t2.length - 1, type$.legacy_Value_2), new A._closure25(t2));
+    },
+    $signature: 3
+  };
+  A._closure25.prototype = {
+    call$1: function(value) {
+      var t2,
+        nestedMap = value == null ? null : value.tryMap$0(),
+        t1 = nestedMap == null ? null : nestedMap.contents;
+      t1 = t1 == null ? null : t1.containsKey$1(C.JSArray_methods.get$last(this.keys));
+      if (t1 === true) {
+        t1 = type$.legacy_Value_2;
+        t2 = P.LinkedHashMap_LinkedHashMap$of(nestedMap.contents, t1, t1);
+        t2.remove$1(0, C.JSArray_methods.get$last(this.keys));
+        return new A.SassMap0(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+      }
+      return value;
+    },
+    $signature: 74
+  };
+  A.closure145.prototype = {
+    call$1: function($arguments) {
+      return J.$index$asx($arguments, 0).assertMap$1("map");
+    },
+    $signature: 37
+  };
+  A.closure146.prototype = {
+    call$1: function($arguments) {
+      var t3, _i, mutableMap,
+        t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+      t2.push(t1.$index($arguments, 1));
+      for (t1 = t1.$index($arguments, 2).get$asList(), t3 = t1.length, _i = 0; _i < t1.length; t1.length === t3 || (0, H.throwConcurrentModificationError)(t1), ++_i)
+        t2.push(t1[_i]);
+      t1 = type$.legacy_Value_2;
+      mutableMap = P.LinkedHashMap_LinkedHashMap$of(map.contents, t1, t1);
+      for (t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
+        mutableMap.remove$1(0, t2[_i]);
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(mutableMap, t1, t1));
+    },
+    $signature: 37
+  };
+  A.closure144.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).assertMap$1("map").contents;
+      return D.SassList$0(t1.get$keys(t1), C.ListSeparator_comma0, false);
+    },
+    $signature: 27
+  };
+  A.closure143.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).assertMap$1("map").contents;
+      return D.SassList$0(t1.get$values(t1), C.ListSeparator_comma0, false);
+    },
+    $signature: 27
+  };
+  A.closure142.prototype = {
+    call$1: function($arguments) {
+      var t3, _i, cur, value,
+        t1 = J.getInterceptor$asx($arguments),
+        map = t1.$index($arguments, 0).assertMap$1("map"),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+      t2.push(t1.$index($arguments, 1));
+      for (t1 = t1.$index($arguments, 2).get$asList(), t3 = t1.length, _i = 0; _i < t1.length; t1.length === t3 || (0, H.throwConcurrentModificationError)(t1), ++_i)
+        t2.push(t1[_i]);
+      for (t1 = H.SubListIterable$(t2, 0, t2.length - 1, type$.legacy_Value_2), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0(); map = value) {
+        cur = t1.__internal$_current;
+        value = map.contents.$index(0, cur);
+        if (!(value instanceof A.SassMap0))
+          return C.SassBoolean_false;
+      }
+      return map.contents.containsKey$1(C.JSArray_methods.get$last(t2)) ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  A._modify__modifyNestedMap0.prototype = {
+    call$2: function(map, newValue) {
+      var nestedMap, _this = this,
+        t1 = type$.legacy_Value_2,
+        mutableMap = P.LinkedHashMap_LinkedHashMap$of(map.contents, t1, t1),
+        t2 = _this.keyIterator,
+        key = t2.get$current(t2);
+      if (!t2.moveNext$0()) {
+        mutableMap.$indexSet(0, key, newValue == null ? _this.modify.call$1(mutableMap.$index(0, key)) : newValue);
+        return new A.SassMap0(H.ConstantMap_ConstantMap$from(mutableMap, t1, t1));
+      }
+      t2 = mutableMap.$index(0, key);
+      nestedMap = t2 == null ? null : t2.tryMap$0();
+      t2 = nestedMap == null;
+      if (t2) {
+        newValue = _this.modify.call$1(null);
+        if (newValue == null)
+          return new A.SassMap0(H.ConstantMap_ConstantMap$from(mutableMap, t1, t1));
+      }
+      mutableMap.$indexSet(0, key, _this.call$2(t2 ? C.SassMap_Map_empty0 : nestedMap, newValue));
+      return new A.SassMap0(H.ConstantMap_ConstantMap$from(mutableMap, t1, t1));
+    },
+    call$1: function(map) {
+      return this.call$2(map, null);
+    },
+    $signature: 399
+  };
+  A._deepMergeImpl__ensureMutable0.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this._box_0;
+      if (t1.mutable)
+        return;
+      t1.mutable = true;
+      t2 = type$.legacy_Value_2;
+      t1.result = P.LinkedHashMap_LinkedHashMap$of(t1.result, t2, t2);
+    },
+    $signature: 1
+  };
+  A._deepMergeImpl_closure0.prototype = {
+    call$2: function(key, value) {
+      var resultMap, valueMap, merged,
+        t1 = this._box_0,
+        resultValue = t1.result.$index(0, key);
+      if (resultValue == null) {
+        this._ensureMutable.call$0();
+        t1.result.$indexSet(0, key, value);
+      } else {
+        resultMap = resultValue.tryMap$0();
+        valueMap = value.tryMap$0();
+        if (resultMap != null && valueMap != null) {
+          merged = A._deepMergeImpl0(valueMap, resultMap);
+          if (merged === resultMap)
+            return;
+          this._ensureMutable.call$0();
+          t1.result.$indexSet(0, key, merged);
+        }
+      }
+    },
+    $signature: 45
+  };
+  A._NodeSassMap.prototype = {};
+  A.closure239.prototype = {
+    call$3: function(thisArg, $length, dartValue) {
+      var t1, t2, t3, map;
+      if (dartValue == null) {
+        t1 = type$.legacy_Value_2;
+        t2 = P.Iterable_Iterable$generate($length, new A._closure31(), t1);
+        t3 = P.Iterable_Iterable$generate($length, new A._closure32(), t1);
+        map = P.LinkedHashMap_LinkedHashMap(null, null, null, t1, t1);
+        P.MapBase__fillMapWithIterables(map, t2, t3);
+        t1 = new A.SassMap0(H.ConstantMap_ConstantMap$from(map, t1, t1));
+      } else
+        t1 = dartValue;
+      J.set$dartValue$x(thisArg, t1);
+    },
+    call$2: function(thisArg, $length) {
+      return this.call$3(thisArg, $length, null);
+    },
+    "call*": "call$3",
+    $requiredArgCount: 2,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 400
+  };
+  A._closure31.prototype = {
+    call$1: function(i) {
+      return new N.UnitlessSassNumber0(i, null);
+    },
+    $signature: 401
+  };
+  A._closure32.prototype = {
+    call$1: function(_) {
+      return C.C_SassNull;
+    },
+    $signature: 188
+  };
+  A.closure240.prototype = {
+    call$2: function(thisArg, index) {
+      var t1 = J.get$dartValue$x(thisArg).contents;
+      return F.wrapValue(J.elementAt$1$ax(t1.get$keys(t1), index));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 177
+  };
+  A.closure241.prototype = {
+    call$2: function(thisArg, index) {
+      var t1 = J.get$dartValue$x(thisArg).contents;
+      return F.wrapValue(t1.get$values(t1).elementAt$1(0, index));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 177
+  };
+  A.closure242.prototype = {
+    call$1: function(thisArg) {
+      var t1 = J.get$dartValue$x(thisArg).contents;
+      return t1.get$length(t1);
+    },
+    $signature: 403
+  };
+  A.closure243.prototype = {
+    call$3: function(thisArg, index, key) {
+      var newKey, t2, newMap, t3, i, t4,
+        t1 = J.getInterceptor$x(thisArg),
+        oldMap = t1.get$dartValue(thisArg).contents;
+      P.RangeError_checkValidIndex(index, oldMap, "index");
+      newKey = F.unwrapValue(key);
+      t2 = type$.legacy_Value_2;
+      newMap = P.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
+      for (t3 = t1.get$dartValue(thisArg).contents, t3 = J.get$iterator$ax(t3.get$keys(t3)), i = 0; t3.moveNext$0();) {
+        t4 = t3.get$current(t3);
+        if (i === index)
+          newMap.$indexSet(0, newKey, oldMap.$index(0, t4));
+        else {
+          if (newKey.$eq(0, t4))
+            throw H.wrapException(P.ArgumentError$value(key, "key", "is already in the map"));
+          newMap.$indexSet(0, t4, oldMap.$index(0, t4));
+        }
+        ++i;
+      }
+      t1.set$dartValue(thisArg, new A.SassMap0(H.ConstantMap_ConstantMap$from(newMap, t2, t2)));
+    },
+    "call*": "call$3",
+    $requiredArgCount: 3,
+    $signature: 164
+  };
+  A.closure244.prototype = {
+    call$3: function(thisArg, index, value) {
+      var t3, t4, t5,
+        t1 = J.getInterceptor$x(thisArg),
+        t2 = t1.get$dartValue(thisArg).contents,
+        key = J.elementAt$1$ax(t2.get$keys(t2), index);
+      t2 = type$.legacy_Value_2;
+      t3 = P.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
+      for (t4 = t1.get$dartValue(thisArg).contents, t4 = t4.get$entries(t4), t4 = t4.get$iterator(t4); t4.moveNext$0();) {
+        t5 = t4.get$current(t4);
+        t3.$indexSet(0, t5.key, t5.value);
+      }
+      t3.$indexSet(0, key, F.unwrapValue(value));
+      t1.set$dartValue(thisArg, new A.SassMap0(H.ConstantMap_ConstantMap$from(t3, t2, t2)));
+    },
+    "call*": "call$3",
+    $requiredArgCount: 3,
+    $signature: 164
+  };
+  A.closure245.prototype = {
+    call$1: function(thisArg) {
+      return J.toString$0$(J.get$dartValue$x(thisArg));
+    },
+    $signature: 405
+  };
+  A.SassMap0.prototype = {
+    get$separator: function() {
+      var t1 = this.contents;
+      return t1.get$isEmpty(t1) ? C.ListSeparator_undecided0 : C.ListSeparator_comma0;
+    },
+    get$asList: function() {
+      var result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Value_2);
+      this.contents.forEach$1(0, new A.SassMap_asList_closure0(result));
+      return result;
+    },
+    get$lengthAsList: function() {
+      var t1 = this.contents;
+      return t1.get$length(t1);
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitMap$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertMap$1: function($name) {
+      return this;
+    },
+    tryMap$0: function() {
+      return this;
+    },
+    $eq: function(_, other) {
+      var t1;
+      if (other == null)
+        return false;
+      if (!(other instanceof A.SassMap0 && C.C_MapEquality.equals$2(0, other.contents, this.contents))) {
+        t1 = this.contents;
+        t1 = t1.get$isEmpty(t1) && other instanceof D.SassList0 && other._list1$_contents.length === 0;
+      } else
+        t1 = true;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.contents;
+      return t1.get$isEmpty(t1) ? C.C_ListEquality.hash$1(C.List_empty16) : C.C_MapEquality.hash$1(t1);
+    }
+  };
+  A.SassMap_asList_closure0.prototype = {
+    call$2: function(key, value) {
+      this.result.push(D.SassList$0(H.setRuntimeTypeInfo([key, value], type$.JSArray_legacy_Value_2), C.ListSeparator_space0, false));
+    },
+    $signature: 45
+  };
+  K.closure140.prototype = {
+    call$1: function(value) {
+      return J.ceil$0$n(value);
+    },
+    $signature: 39
+  };
+  K.closure205.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        min = t1.$index($arguments, 0).assertNumber$1("min"),
+        number = t1.$index($arguments, 1).assertNumber$1("number"),
+        max = t1.$index($arguments, 2).assertNumber$1("max");
+      number.convertValueToMatch$3(min, "number", "min");
+      max.convertValueToMatch$3(min, "max", "min");
+      if (min.greaterThanOrEquals$1(max).value)
+        return min;
+      if (min.greaterThanOrEquals$1(number).value)
+        return min;
+      if (number.greaterThanOrEquals$1(max).value)
+        return max;
+      return number;
+    },
+    $signature: 10
+  };
+  K.closure139.prototype = {
+    call$1: function(value) {
+      return J.floor$0$n(value);
+    },
+    $signature: 39
+  };
+  K.closure138.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, max, _i, number;
+      for (t1 = J.$index$asx($arguments, 0).get$asList(), t2 = t1.length, max = null, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        number = t1[_i].assertNumber$0();
+        if (max == null || max.lessThan$1(number).value)
+          max = number;
+      }
+      if (max != null)
+        return max;
+      throw H.wrapException(E.SassScriptException$0("At least one argument must be passed."));
+    },
+    $signature: 10
+  };
+  K.closure137.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, min, _i, number;
+      for (t1 = J.$index$asx($arguments, 0).get$asList(), t2 = t1.length, min = null, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
+        number = t1[_i].assertNumber$0();
+        if (min == null || min.greaterThan$1(number).value)
+          min = number;
+      }
+      if (min != null)
+        return min;
+      throw H.wrapException(E.SassScriptException$0("At least one argument must be passed."));
+    },
+    $signature: 10
+  };
+  K.closure141.prototype = {
+    call$1: function(value) {
+      return Math.abs(value);
+    },
+    $signature: 155
+  };
+  K.closure203.prototype = {
+    call$1: function($arguments) {
+      var subtotal, i, i0, value,
+        t1 = J.$index$asx($arguments, 0).get$asList(),
+        t2 = H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,SassNumber0*>"),
+        numbers = P.List_List$from(new H.MappedListIterable(t1, new K._closure24(), t2), true, t2._eval$1("ListIterable.E"));
+      if (numbers.length === 0)
+        throw H.wrapException(E.SassScriptException$0("At least one argument must be passed."));
+      for (subtotal = 0, i = 0; i < numbers.length; i = i0) {
+        i0 = i + 1;
+        value = numbers[i].convertValueToMatch$3(numbers[0], "numbers[" + i0 + "]", "numbers[1]");
+        H.checkNum(value);
+        subtotal += Math.pow(value, 2);
+      }
+      t1 = Math.sqrt(subtotal);
+      t2 = numbers[0].get$numeratorUnits();
+      return T.SassNumber_SassNumber$withUnits0(t1, numbers[0].get$denominatorUnits(), t2);
+    },
+    $signature: 10
+  };
+  K._closure24.prototype = {
+    call$1: function(argument) {
+      return argument.assertNumber$0();
+    },
+    $signature: 406
+  };
+  K.closure202.prototype = {
+    call$1: function($arguments) {
+      var numberValue, base, baseValue, t2,
+        _s18_ = " to have no units.",
+        t1 = J.getInterceptor$asx($arguments),
+        number = t1.$index($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$0("$number: Expected " + number.toString$0(0) + _s18_));
+      numberValue = K._fuzzyRoundIfZero0(number.value);
+      if (J.$eq$(t1.$index($arguments, 1), C.C_SassNull)) {
+        t1 = Math.log(H.checkNum(numberValue));
+        return new N.UnitlessSassNumber0(t1, null);
+      }
+      base = t1.$index($arguments, 1).assertNumber$1("base");
+      if (base.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$0("$base: Expected " + base.toString$0(0) + _s18_));
+      t1 = base.value;
+      baseValue = Math.abs(t1 - 1) < $.$get$epsilon0() ? T.fuzzyRound0(t1) : K._fuzzyRoundIfZero0(t1);
+      t1 = Math.log(H.checkNum(numberValue));
+      t2 = Math.log(H.checkNum(baseValue));
+      return new N.UnitlessSassNumber0(t1 / t2, null);
+    },
+    $signature: 10
+  };
+  K.closure201.prototype = {
+    call$1: function($arguments) {
+      var baseValue, exponentValue, t2, t3,
+        _s18_ = " to have no units.",
+        _null = null,
+        t1 = J.getInterceptor$asx($arguments),
+        base = t1.$index($arguments, 0).assertNumber$1("base"),
+        exponent = t1.$index($arguments, 1).assertNumber$1("exponent");
+      if (base.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$0("$base: Expected " + base.toString$0(0) + _s18_));
+      else if (exponent.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$0("$exponent: Expected " + exponent.toString$0(0) + _s18_));
+      baseValue = K._fuzzyRoundIfZero0(base.value);
+      exponentValue = K._fuzzyRoundIfZero0(exponent.value);
+      t1 = $.$get$epsilon0();
+      if (Math.abs(Math.abs(baseValue) - 1) < t1) {
+        exponentValue.toString;
+        t2 = exponentValue == 1 / 0 || exponentValue == -1 / 0;
+      } else
+        t2 = false;
+      if (t2)
+        return new N.UnitlessSassNumber0(0 / 0, _null);
+      else {
+        t2 = Math.abs(baseValue - 0);
+        if (t2 < t1) {
+          exponentValue.toString;
+          if (isFinite(exponentValue))
+            if (T.fuzzyIsInt0(exponentValue))
+              t1 = C.JSInt_methods.$mod(T.fuzzyIsInt0(exponentValue) ? C.JSNumber_methods.round$0(exponentValue) : _null, 2) === 1;
+            else
+              t1 = false;
+          else
+            t1 = false;
+          if (t1)
+            exponentValue = T.fuzzyRound0(exponentValue);
+        } else {
+          if (isFinite(baseValue))
+            if (baseValue < 0 && !(t2 < t1)) {
+              exponentValue.toString;
+              t3 = isFinite(exponentValue) && T.fuzzyIsInt0(exponentValue);
+            } else
+              t3 = false;
+          else
+            t3 = false;
+          if (t3)
+            exponentValue = T.fuzzyRound0(exponentValue);
+          else {
+            if (baseValue == 1 / 0 || baseValue == -1 / 0)
+              if (baseValue < 0 && !(t2 < t1)) {
+                exponentValue.toString;
+                if (isFinite(exponentValue))
+                  if (T.fuzzyIsInt0(exponentValue))
+                    t1 = C.JSInt_methods.$mod(T.fuzzyIsInt0(exponentValue) ? C.JSNumber_methods.round$0(exponentValue) : _null, 2) === 1;
+                  else
+                    t1 = false;
+                else
+                  t1 = false;
+              } else
+                t1 = false;
+            else
+              t1 = false;
+            if (t1)
+              exponentValue = T.fuzzyRound0(exponentValue);
+          }
+        }
+      }
+      H.checkNum(exponentValue);
+      t1 = Math.pow(baseValue, exponentValue);
+      return new N.UnitlessSassNumber0(t1, _null);
+    },
+    $signature: 10
+  };
+  K.closure199.prototype = {
+    call$1: function($arguments) {
+      var t1,
+        number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$0("$number: Expected " + number.toString$0(0) + " to have no units."));
+      t1 = Math.sqrt(H.checkNum(K._fuzzyRoundIfZero0(number.value)));
+      return new N.UnitlessSassNumber0(t1, null);
+    },
+    $signature: 10
+  };
+  K.closure209.prototype = {
+    call$1: function($arguments) {
+      var numberValue,
+        number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$0("$number: Expected " + number.toString$0(0) + " to have no units."));
+      numberValue = number.value;
+      if (Math.abs(Math.abs(numberValue) - 1) < $.$get$epsilon0())
+        numberValue = T.fuzzyRound0(numberValue);
+      return T.SassNumber_SassNumber$withUnits0(Math.acos(numberValue) * 180 / 3.141592653589793, null, H.setRuntimeTypeInfo(["deg"], type$.JSArray_legacy_String));
+    },
+    $signature: 10
+  };
+  K.closure208.prototype = {
+    call$1: function($arguments) {
+      var t1,
+        number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$0("$number: Expected " + number.toString$0(0) + " to have no units."));
+      t1 = number.value;
+      return T.SassNumber_SassNumber$withUnits0(Math.asin(H.checkNum(Math.abs(Math.abs(t1) - 1) < $.$get$epsilon0() ? T.fuzzyRound0(t1) : K._fuzzyRoundIfZero0(t1))) * 180 / 3.141592653589793, null, H.setRuntimeTypeInfo(["deg"], type$.JSArray_legacy_String));
+    },
+    $signature: 10
+  };
+  K.closure207.prototype = {
+    call$1: function($arguments) {
+      var number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      if (number.get$hasUnits())
+        throw H.wrapException(E.SassScriptException$0("$number: Expected " + number.toString$0(0) + " to have no units."));
+      return T.SassNumber_SassNumber$withUnits0(Math.atan(H.checkNum(K._fuzzyRoundIfZero0(number.value))) * 180 / 3.141592653589793, null, H.setRuntimeTypeInfo(["deg"], type$.JSArray_legacy_String));
+    },
+    $signature: 10
+  };
+  K.closure206.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        y = t1.$index($arguments, 0).assertNumber$1("y"),
+        xValue = K._fuzzyRoundIfZero0(t1.$index($arguments, 1).assertNumber$1("x").convertValueToMatch$3(y, "x", "y"));
+      return T.SassNumber_SassNumber$withUnits0(Math.atan2(H.checkNum(K._fuzzyRoundIfZero0(y.value)), H.checkNum(xValue)) * 180 / 3.141592653589793, null, H.setRuntimeTypeInfo(["deg"], type$.JSArray_legacy_String));
+    },
+    $signature: 10
+  };
+  K.closure204.prototype = {
+    call$1: function($arguments) {
+      var t1 = Math.cos(H.checkNum(J.$index$asx($arguments, 0).assertNumber$1("number").coerceValueToUnit$2("rad", "number")));
+      return new N.UnitlessSassNumber0(t1, null);
+    },
+    $signature: 10
+  };
+  K.closure200.prototype = {
+    call$1: function($arguments) {
+      var t1 = Math.sin(H.checkNum(K._fuzzyRoundIfZero0(J.$index$asx($arguments, 0).assertNumber$1("number").coerceValueToUnit$2("rad", "number"))));
+      return new N.UnitlessSassNumber0(t1, null);
+    },
+    $signature: 10
+  };
+  K.closure198.prototype = {
+    call$1: function($arguments) {
+      var value = J.$index$asx($arguments, 0).assertNumber$1("number").coerceValueToUnit$2("rad", "number"),
+        t1 = C.JSNumber_methods.$mod(value - 1.5707963267948966, 6.283185307179586),
+        t2 = $.$get$epsilon0();
+      if (Math.abs(t1 - 0) < t2)
+        return new N.UnitlessSassNumber0(1 / 0, null);
+      else if (Math.abs(C.JSNumber_methods.$mod(value + 1.5707963267948966, 6.283185307179586) - 0) < t2)
+        return new N.UnitlessSassNumber0(-1 / 0, null);
+      else {
+        t1 = Math.tan(H.checkNum(K._fuzzyRoundIfZero0(value)));
+        return new N.UnitlessSassNumber0(t1, null);
+      }
+    },
+    $signature: 10
+  };
+  K.closure133.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments);
+      return t1.$index($arguments, 0).assertNumber$1("number1").isComparableTo$1(t1.$index($arguments, 1).assertNumber$1("number2")) ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  K.closure132.prototype = {
+    call$1: function($arguments) {
+      return !J.$index$asx($arguments, 0).assertNumber$1("number").get$hasUnits() ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  K.closure134.prototype = {
+    call$1: function($arguments) {
+      return new D.SassString0(J.$index$asx($arguments, 0).assertNumber$1("number").get$unitString(), true);
+    },
+    $signature: 17
+  };
+  K.closure136.prototype = {
+    call$1: function($arguments) {
+      var number = J.$index$asx($arguments, 0).assertNumber$1("number");
+      number.assertNoUnits$1("number");
+      return new L.SingleUnitSassNumber0("%", number.value * 100, null);
+    },
+    $signature: 10
+  };
+  K.closure135.prototype = {
+    call$1: function($arguments) {
+      var limit,
+        t1 = J.getInterceptor$asx($arguments);
+      if (J.$eq$(t1.$index($arguments, 0), C.C_SassNull)) {
+        t1 = $.$get$_random2().nextDouble$0();
+        return new N.UnitlessSassNumber0(t1, null);
+      }
+      limit = t1.$index($arguments, 0).assertNumber$1("limit").assertInt$1("limit");
+      if (limit < 1)
+        throw H.wrapException(E.SassScriptException$0("$limit: Must be greater than 0, was " + limit + "."));
+      t1 = $.$get$_random2().nextInt$1(limit);
+      return new N.UnitlessSassNumber0(t1 + 1, null);
+    },
+    $signature: 10
+  };
+  K._numberFunction_closure0.prototype = {
+    call$1: function($arguments) {
+      var number = J.$index$asx($arguments, 0).assertNumber$1("number"),
+        t1 = this.transform.call$1(number.value),
+        t2 = number.get$numeratorUnits();
+      return T.SassNumber_SassNumber$withUnits0(t1, number.get$denominatorUnits(), t2);
+    },
+    $signature: 10
+  };
+  F.CssMediaQuery0.prototype = {
+    merge$1: function(other) {
+      var _i, t8, negativeFeatures, features, type, modifier, fewerFeatures, fewerFeatures0, moreFeatures, _this = this, _null = null, _s3_ = "all",
+        t1 = _this.modifier,
+        ourModifier = t1 == null ? _null : t1.toLowerCase(),
+        t2 = _this.type,
+        t3 = t2 == null,
+        ourType = t3 ? _null : t2.toLowerCase(),
+        t4 = other.modifier,
+        theirModifier = t4 == null ? _null : t4.toLowerCase(),
+        t5 = other.type,
+        t6 = t5 == null,
+        theirType = t6 ? _null : t5.toLowerCase(),
+        t7 = ourType == null;
+      if (t7 && theirType == null) {
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+        for (t2 = _this.features, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t1.push(t2[_i]);
+        for (t2 = other.features, t3 = t2.length, _i = 0; _i < t3; ++_i)
+          t1.push(t2[_i]);
+        return new F.MediaQuerySuccessfulMergeResult0(new F.CssMediaQuery0(_null, _null, P.List_List$unmodifiable(t1, type$.legacy_String)));
+      }
+      t8 = ourModifier === "not";
+      if (t8 !== (theirModifier === "not")) {
+        if (ourType == theirType) {
+          negativeFeatures = t8 ? _this.features : other.features;
+          if (C.JSArray_methods.every$1(negativeFeatures, C.JSArray_methods.get$contains(t8 ? other.features : _this.features)))
+            return C._SingletonCssMediaQueryMergeResult_empty0;
+          else
+            return C._SingletonCssMediaQueryMergeResult_unrepresentable0;
+        } else if (t3 || B.equalsIgnoreCase0(t2, _s3_) || t6 || B.equalsIgnoreCase0(t5, _s3_))
+          return C._SingletonCssMediaQueryMergeResult_unrepresentable0;
+        if (t8) {
+          features = other.features;
+          type = theirType;
+          modifier = theirModifier;
+        } else {
+          features = _this.features;
+          type = ourType;
+          modifier = ourModifier;
+        }
+      } else if (t8) {
+        if (ourType != theirType)
+          return C._SingletonCssMediaQueryMergeResult_unrepresentable0;
+        fewerFeatures = _this.features;
+        fewerFeatures0 = other.features;
+        t3 = fewerFeatures.length > fewerFeatures0.length;
+        moreFeatures = t3 ? fewerFeatures : fewerFeatures0;
+        if (t3)
+          fewerFeatures = fewerFeatures0;
+        if (!C.JSArray_methods.every$1(fewerFeatures, C.JSArray_methods.get$contains(moreFeatures)))
+          return C._SingletonCssMediaQueryMergeResult_unrepresentable0;
+        features = moreFeatures;
+        type = ourType;
+        modifier = ourModifier;
+      } else if (t3 || B.equalsIgnoreCase0(t2, _s3_)) {
+        type = (t6 || B.equalsIgnoreCase0(t5, _s3_)) && t7 ? _null : theirType;
+        t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+        for (t6 = _this.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+          t3.push(t6[_i]);
+        for (t6 = other.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+          t3.push(t6[_i]);
+        features = t3;
+        modifier = theirModifier;
+      } else {
+        if (t6 || B.equalsIgnoreCase0(t5, _s3_)) {
+          t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+          for (t6 = _this.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+            t3.push(t6[_i]);
+          for (t6 = other.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+            t3.push(t6[_i]);
+          features = t3;
+          modifier = ourModifier;
+        } else {
+          if (ourType != theirType)
+            return C._SingletonCssMediaQueryMergeResult_empty0;
+          else {
+            modifier = ourModifier == null ? theirModifier : ourModifier;
+            t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+            for (t6 = _this.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+              t3.push(t6[_i]);
+            for (t6 = other.features, t7 = t6.length, _i = 0; _i < t7; ++_i)
+              t3.push(t6[_i]);
+          }
+          features = t3;
+        }
+        type = ourType;
+      }
+      t2 = type == ourType ? t2 : t5;
+      t1 = modifier == ourModifier ? t1 : t4;
+      t3 = P.List_List$unmodifiable(features, type$.legacy_String);
+      return new F.MediaQuerySuccessfulMergeResult0(new F.CssMediaQuery0(t1, t2, t3));
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof F.CssMediaQuery0 && other.modifier == this.modifier && other.type == this.type && C.C_ListEquality.equals$2(0, other.features, this.features);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.modifier) ^ J.get$hashCode$(this.type) ^ C.C_ListEquality.hash$1(this.features);
+    },
+    toString$0: function(_) {
+      var t2, _this = this,
+        t1 = _this.modifier;
+      t1 = t1 != null ? t1 + " " : "";
+      t2 = _this.type;
+      if (t2 != null) {
+        t1 += t2;
+        if (_this.features.length !== 0)
+          t1 += " and ";
+      }
+      t1 += C.JSArray_methods.join$1(_this.features, " and ");
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    }
+  };
+  F._SingletonCssMediaQueryMergeResult0.prototype = {
+    toString$0: function(_) {
+      return this._media_query1$_name;
+    }
+  };
+  F.MediaQuerySuccessfulMergeResult0.prototype = {};
+  F.MediaQueryParser0.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new F.MediaQueryParser_parse_closure0(this));
+    },
+    _media_query0$_mediaQuery$0: function() {
+      var identifier1, identifier2, type, modifier, features, _this = this, _null = null,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() !== 40) {
+        identifier1 = _this.identifier$0();
+        _this.whitespace$0();
+        if (!_this.lookingAtIdentifier$0())
+          return new F.CssMediaQuery0(_null, identifier1, C.List_empty);
+        identifier2 = _this.identifier$0();
+        _this.whitespace$0();
+        if (B.equalsIgnoreCase0(identifier2, "and")) {
+          type = identifier1;
+          modifier = _null;
+        } else {
+          if (_this.scanIdentifier$1("and"))
+            _this.whitespace$0();
+          else
+            return new F.CssMediaQuery0(identifier1, identifier2, C.List_empty);
+          type = identifier2;
+          modifier = identifier1;
+        }
+      } else {
+        type = _null;
+        modifier = type;
+      }
+      features = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      do {
+        _this.whitespace$0();
+        t1.expectChar$1(40);
+        features.push("(" + _this.declarationValue$0() + ")");
+        t1.expectChar$1(41);
+        _this.whitespace$0();
+      } while (_this.scanIdentifier$1("and"));
+      if (type == null)
+        return new F.CssMediaQuery0(_null, _null, P.List_List$unmodifiable(features, type$.legacy_String));
+      else {
+        t1 = P.List_List$unmodifiable(features, type$.legacy_String);
+        return new F.CssMediaQuery0(modifier, type, t1);
+      }
+    }
+  };
+  F.MediaQueryParser_parse_closure0.prototype = {
+    call$0: function() {
+      var queries = H.setRuntimeTypeInfo([], type$.JSArray_legacy_CssMediaQuery_2),
+        t1 = this.$this,
+        t2 = t1.scanner;
+      do {
+        t1.whitespace$0();
+        queries.push(t1._media_query0$_mediaQuery$0());
+      } while (t2.scanChar$1(44));
+      t2.expectDone$0();
+      return queries;
+    },
+    $signature: 100
+  };
+  G.ModifiableCssMediaRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssMediaRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return G.ModifiableCssMediaRule$0(this.queries, this.span);
+    },
+    $isCssMediaRule0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  G.MediaRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitMediaRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return "@media " + this.query.toString$0(0) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  A.MergedExtension0.prototype = {
+    unmerge$0: function() {
+      var $async$self = this;
+      return P._makeSyncStarIterable(function() {
+        var $async$goto = 0, $async$handler = 1, $async$currentError, t1;
+        return function $async$unmerge$0($async$errorCode, $async$result) {
+          if ($async$errorCode === 1) {
+            $async$currentError = $async$result;
+            $async$goto = $async$handler;
+          }
+          while (true)
+            switch ($async$goto) {
+              case 0:
+                // Function start
+                t1 = $async$self.left;
+                $async$goto = t1 instanceof A.MergedExtension0 ? 2 : 4;
+                break;
+              case 2:
+                // then
+                $async$goto = 5;
+                return P._IterationMarker_yieldStar(t1.unmerge$0());
+              case 5:
+                // after yield
+                // goto join
+                $async$goto = 3;
+                break;
+              case 4:
+                // else
+                $async$goto = 6;
+                return t1;
+              case 6:
+                // after yield
+              case 3:
+                // join
+                $async$goto = 7;
+                return $async$self.right;
+              case 7:
+                // after yield
+                // implicit return
+                return P._IterationMarker_endOfIteration();
+              case 1:
+                // rethrow
+                return P._IterationMarker_uncaughtError($async$currentError);
+            }
+        };
+      }, type$.legacy_Extension_2);
+    }
+  };
+  Z.MergedMapView0.prototype = {
+    get$keys: function(_) {
+      var t1 = this._merged_map_view$_mapsByKey;
+      return t1.get$keys(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._merged_map_view$_mapsByKey;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._merged_map_view$_mapsByKey;
+      return t1.get$isEmpty(t1);
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._merged_map_view$_mapsByKey;
+      return t1.get$isNotEmpty(t1);
+    },
+    MergedMapView$10: function(maps, $K, $V) {
+      var t1, t2, t3, _i, map, t4, t5;
+      for (t1 = maps.length, t2 = this._merged_map_view$_mapsByKey, t3 = $K._eval$1("@<0>")._bind$1($V)._eval$1("MergedMapView0<1*,2*>*"), _i = 0; _i < maps.length; maps.length === t1 || (0, H.throwConcurrentModificationError)(maps), ++_i) {
+        map = maps[_i];
+        if (t3._is(map))
+          for (t4 = map._merged_map_view$_mapsByKey, t4 = t4.get$values(t4), t4 = t4.get$iterator(t4); t4.moveNext$0();) {
+            t5 = t4.get$current(t4);
+            B.setAll0(t2, t5.get$keys(t5), t5);
+          }
+        else
+          B.setAll0(t2, map.get$keys(map), map);
+      }
+    },
+    $index: function(_, key) {
+      var child = this._merged_map_view$_mapsByKey.$index(0, key);
+      return child == null ? null : child.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      var child = this._merged_map_view$_mapsByKey.$index(0, key);
+      if (child == null)
+        throw H.wrapException(P.UnsupportedError$(string$.New_en));
+      child.$indexSet(0, key, value);
+    },
+    remove$1: function(_, key) {
+      throw H.wrapException(P.UnsupportedError$(string$.Entrie));
+    },
+    containsKey$1: function(key) {
+      return this._merged_map_view$_mapsByKey.containsKey$1(key);
+    }
+  };
+  Q.closure223.prototype = {
+    call$1: function($arguments) {
+      return $._features0.contains$1(0, J.$index$asx($arguments, 0).assertString$1("feature").text) ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  Q.closure224.prototype = {
+    call$1: function($arguments) {
+      return new D.SassString0(J.toString$0$(J.get$first$ax($arguments)), false);
+    },
+    $signature: 17
+  };
+  Q.closure225.prototype = {
+    call$1: function($arguments) {
+      var value = J.$index$asx($arguments, 0);
+      if (value instanceof D.SassArgumentList0)
+        return new D.SassString0("arglist", false);
+      if (value instanceof Z.SassBoolean0)
+        return new D.SassString0("bool", false);
+      if (value instanceof K.SassColor0)
+        return new D.SassString0("color", false);
+      if (value instanceof D.SassList0)
+        return new D.SassString0("list", false);
+      if (value instanceof A.SassMap0)
+        return new D.SassString0("map", false);
+      if (value instanceof O.SassNull0)
+        return new D.SassString0("null", false);
+      if (value instanceof T.SassNumber0)
+        return new D.SassString0("number", false);
+      if (value instanceof F.SassFunction0)
+        return new D.SassString0("function", false);
+      return new D.SassString0("string", false);
+    },
+    $signature: 17
+  };
+  Q.closure226.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, t3, t4,
+        argumentList = J.$index$asx($arguments, 0);
+      if (argumentList instanceof D.SassArgumentList0) {
+        t1 = type$.legacy_Value_2;
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+        for (argumentList._argument_list$_wereKeywordsAccessed = true, t3 = argumentList._argument_list$_keywords, t3 = t3.get$entries(t3), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
+          t4 = t3.get$current(t3);
+          t2.$indexSet(0, new D.SassString0(t4.key, false), t4.value);
+        }
+        return new A.SassMap0(H.ConstantMap_ConstantMap$from(t2, t1, t1));
+      } else
+        throw H.wrapException("$args: " + H.S(argumentList) + " is not an argument list.");
+    },
+    $signature: 37
+  };
+  T.MixinRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitMixinRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = "@mixin " + H.S(this.name),
+        t2 = this.$arguments;
+      if (!(t2.$arguments.length === 0 && t2.restArgument == null))
+        t1 += "(" + t2.toString$0(0) + ")";
+      t2 = this.children;
+      t2 = t1 + (" {" + (t2 && C.JSArray_methods).join$1(t2, " ") + "}");
+      return t2.charCodeAt(0) == 0 ? t2 : t2;
+    }
+  };
+  L.ExtendMode0.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  M.SupportsNegation0.prototype = {
+    toString$0: function(_) {
+      var t1 = this.condition;
+      if (t1 instanceof M.SupportsNegation0 || t1 instanceof U.SupportsOperation0)
+        return "not (" + t1.toString$0(0) + ")";
+      else
+        return "not " + t1.toString$0(0);
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  N.NoSourceMapBuffer.prototype = {
+    get$length: function(_) {
+      return this._no_source_map_buffer$_buffer._contents.length;
+    },
+    get$sourceFiles: function() {
+      return C.Map_empty;
+    },
+    forSpan$1$2: function(span, callback) {
+      return callback.call$0();
+    },
+    forSpan$2: function(span, callback) {
+      return this.forSpan$1$2(span, callback, type$.dynamic);
+    },
+    write$1: function(_, object) {
+      this._no_source_map_buffer$_buffer._contents += H.S(object);
+      return null;
+    },
+    writeCharCode$1: function(charCode) {
+      this._no_source_map_buffer$_buffer._contents += H.Primitives_stringFromCharCode(charCode);
+      return null;
+    },
+    toString$0: function(_) {
+      var t1 = this._no_source_map_buffer$_buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    buildSourceMap$1$prefix: function(prefix) {
+      return H.throwExpression(P.UnsupportedError$(string$.NoSour));
+    },
+    $isStringBuffer: 1
+  };
+  B.AstNode0.prototype = {};
+  B._FakeAstNode0.prototype = {
+    get$span: function() {
+      return this._node3$_callback.call$0();
+    },
+    $isAstNode0: 1
+  };
+  B.CssNode0.prototype = {
+    toString$0: function(_) {
+      return N.serialize0(this, true, null, true, null, false, null, true).css;
+    }
+  };
+  B.CssParentNode0.prototype = {};
+  B.FileSystemException0.prototype = {
+    toString$0: function(_) {
+      var t1 = $.$get$context();
+      return H.S(t1.prettyUri$1(t1.toUri$1(this.path))) + ": " + this.message;
+    },
+    get$message: function(receiver) {
+      return this.message;
+    },
+    get$path: function(receiver) {
+      return this.path;
+    }
+  };
+  B.Stderr0.prototype = {
+    writeln$1: function(object) {
+      J.write$1$x(this._node1$_stderr, (object == null ? "" : object) + "\n");
+    },
+    writeln$0: function() {
+      return this.writeln$1(null);
+    }
+  };
+  B._readFile_closure0.prototype = {
+    call$0: function() {
+      return J.readFileSync$2$x(D.fs(), this.path, this.encoding);
+    },
+    $signature: 66
+  };
+  B.fileExists_closure0.prototype = {
+    call$0: function() {
+      var error, systemError, exception,
+        t1 = this.path;
+      if (!J.existsSync$1$x(D.fs(), t1))
+        return false;
+      try {
+        t1 = J.isFile$0$x(J.statSync$1$x(D.fs(), t1));
+        return t1;
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        systemError = type$.legacy_JsSystemError._as(error);
+        if (J.$eq$(J.get$code$x(systemError), "ENOENT"))
+          return false;
+        throw exception;
+      }
+    },
+    $signature: 35
+  };
+  B.dirExists_closure0.prototype = {
+    call$0: function() {
+      var error, systemError, exception,
+        t1 = this.path;
+      if (!J.existsSync$1$x(D.fs(), t1))
+        return false;
+      try {
+        t1 = J.isDirectory$0$x(J.statSync$1$x(D.fs(), t1));
+        return t1;
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        systemError = type$.legacy_JsSystemError._as(error);
+        if (J.$eq$(J.get$code$x(systemError), "ENOENT"))
+          return false;
+        throw exception;
+      }
+    },
+    $signature: 35
+  };
+  B.listDir_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.path;
+      if (!this.recursive)
+        return J.map$1$1$ax(J.readdirSync$1$x(D.fs(), t1), new B.listDir__closure1(t1), type$.legacy_String).where$1(0, new B.listDir__closure2());
+      else
+        return new B.listDir_closure_list0().call$1(t1);
+    },
+    $signature: 169
+  };
+  B.listDir__closure1.prototype = {
+    call$1: function(child) {
+      return D.join(this.path, H._asStringS(child), null);
+    },
+    $signature: 107
+  };
+  B.listDir__closure2.prototype = {
+    call$1: function(child) {
+      return !B.dirExists0(child);
+    },
+    $signature: 6
+  };
+  B.listDir_closure_list0.prototype = {
+    call$1: function($parent) {
+      return J.expand$1$1$ax(J.readdirSync$1$x(D.fs(), $parent), new B.listDir__list_closure0($parent, this), type$.legacy_String);
+    },
+    $signature: 170
+  };
+  B.listDir__list_closure0.prototype = {
+    call$1: function(child) {
+      var path = D.join(this.parent, H._asStringS(child), null);
+      return B.dirExists0(path) ? this.list.call$1(path) : H.setRuntimeTypeInfo([path], type$.JSArray_legacy_String);
+    },
+    $signature: 171
+  };
+  B.ModifiableCssNode0.prototype = {
+    get$hasFollowingSibling: function() {
+      var siblings, i, t2,
+        t1 = this._node2$_parent;
+      if (t1 == null)
+        return false;
+      siblings = t1.children;
+      for (i = this._node2$_indexInParent + 1, t1 = siblings._collection$_source, t2 = J.getInterceptor$asx(t1); i < t2.get$length(t1); ++i)
+        if (!this._node2$_isInvisible$1(t2.elementAt$1(t1, i)))
+          return true;
+      return false;
+    },
+    _node2$_isInvisible$1: function(node) {
+      if (type$.legacy_CssParentNode_2._is(node)) {
+        if (type$.legacy_CssAtRule_2._is(node))
+          return false;
+        if (type$.legacy_CssStyleRule_2._is(node) && node.selector.value.get$isInvisible())
+          return true;
+        return J.every$1$ax(node.get$children(node), this.get$_node2$_isInvisible());
+      } else
+        return false;
+    },
+    get$isGroupEnd: function() {
+      return this.isGroupEnd;
+    }
+  };
+  B.ModifiableCssParentNode0.prototype = {
+    get$isChildless: function() {
+      return false;
+    },
+    addChild$1: function(child) {
+      var t1;
+      child._node2$_parent = this;
+      t1 = this._node2$_children;
+      child._node2$_indexInParent = t1.length;
+      t1.push(child);
+    },
+    $isCssParentNode0: 1,
+    get$children: function(receiver) {
+      return this.children;
+    }
+  };
+  B._render_closure.prototype = {
+    call$0: function() {
+      var error, exception;
+      try {
+        this.callback.call$2(null, B._renderSync(this.options));
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        this.callback.call$2(error, null);
+      }
+      return null;
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 0
+  };
+  B._render_closure0.prototype = {
+    call$1: function(result) {
+      this.callback.call$2(null, result);
+    },
+    $signature: 407
+  };
+  B._render_closure1.prototype = {
+    call$2: function(error, stackTrace) {
+      var _null = null,
+        t1 = this.callback;
+      if (error instanceof E.SassException0)
+        t1.call$2(B._wrapException(error), _null);
+      else
+        t1.call$2(B._newRenderError(J.toString$0$(error), _null, _null, _null, 3), _null);
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 408
+  };
+  B._parseFunctions_closure.prototype = {
+    call$2: function(signature, callback) {
+      var error, exception, t1, context, _this = this, tuple = null;
+      try {
+        tuple = L.ScssParser$0(signature, null, null).parseSignature$0();
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException0) {
+          error = t1;
+          throw H.wrapException(E.SassFormatException$0('Invalid signature "' + H.S(signature) + '": ' + H.S(error._span_exception$_message), error.get$span()));
+        } else
+          throw exception;
+      }
+      t1 = _this.options;
+      context = B._contextWithOptions(t1, _this.start);
+      if (J.get$fiber$x(t1) != null)
+        _this.result.push(Q.BuiltInCallable$parsed(tuple.item1, tuple.item2, new B._parseFunctions__closure(t1, callback, context)));
+      else {
+        t1 = _this.result;
+        if (!_this.asynch)
+          t1.push(Q.BuiltInCallable$parsed(tuple.item1, tuple.item2, new B._parseFunctions__closure0(callback, context)));
+        else
+          t1.push(new S.AsyncBuiltInCallable0(tuple.item1, tuple.item2, new B._parseFunctions__closure1(callback, context)));
+      }
+    },
+    $signature: 409
+  };
+  B._parseFunctions__closure.prototype = {
+    call$1: function($arguments) {
+      var t3, t4, result,
+        t1 = this.options,
+        fiber = J.get$current$x(J.get$fiber$x(t1)),
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
+      for (t3 = type$.legacy_Object, t4 = J.map$1$1$ax($arguments, F.value1__wrapValue$closure(), t3), t4 = t4.get$iterator(t4); t4.moveNext$0();)
+        t2.push(t4.get$current(t4));
+      t2.push(P.allowInterop(new B._parseFunctions___closure0(fiber)));
+      result = J.apply$2$x(type$.legacy_JSFunction._as(this.callback), this.context, t2);
+      return F.unwrapValue(H._asBoolS($.$get$_isUndefined().call$1(result)) ? P.runZoned(new B._parseFunctions___closure1(t1), null, t3) : result);
+    },
+    $signature: 3
+  };
+  B._parseFunctions___closure0.prototype = {
+    call$1: function(result) {
+      P.scheduleMicrotask(new B._parseFunctions____closure(this.fiber, result));
+    },
+    call$0: function() {
+      return this.call$1(null);
+    },
+    "call*": "call$1",
+    $requiredArgCount: 0,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 65
+  };
+  B._parseFunctions____closure.prototype = {
+    call$0: function() {
+      return J.run$1$x(this.fiber, this.result);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 70
+  };
+  B._parseFunctions___closure1.prototype = {
+    call$0: function() {
+      return J.yield$0$x(J.get$fiber$x(this.options));
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 70
+  };
+  B._parseFunctions__closure0.prototype = {
+    call$1: function($arguments) {
+      return F.unwrapValue(J.apply$2$x(type$.legacy_JSFunction._as(this.callback), this.context, J.map$1$1$ax($arguments, F.value1__wrapValue$closure(), type$.legacy_Object).toList$0(0)));
+    },
+    $signature: 3
+  };
+  B._parseFunctions__closure1.prototype = {
+    call$1: function($arguments) {
+      return this.$call$body$_parseFunctions__closure($arguments);
+    },
+    $call$body$_parseFunctions__closure: function($arguments) {
+      var $async$goto = 0,
+        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Value_2),
+        $async$returnValue, $async$self = this, t2, result, completer, t1, $async$temp1;
+      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        if ($async$errorCode === 1)
+          return P._asyncRethrow($async$result, $async$completer);
+        while (true)
+          switch ($async$goto) {
+            case 0:
+              // Function start
+              completer = new P._AsyncCompleter(new P._Future($.Zone__current, type$._Future_legacy_Object), type$._AsyncCompleter_legacy_Object);
+              t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
+              for (t2 = J.map$1$1$ax($arguments, F.value1__wrapValue$closure(), type$.legacy_Object), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+                t1.push(t2.get$current(t2));
+              t1.push(P.allowInterop(new B._parseFunctions___closure(completer)));
+              result = J.apply$2$x(type$.legacy_JSFunction._as($async$self.callback), $async$self.context, t1);
+              $async$temp1 = F;
+              $async$goto = H._asBoolS($.$get$_isUndefined().call$1(result)) ? 3 : 5;
+              break;
+            case 3:
+              // then
+              $async$goto = 6;
+              return P._asyncAwait(completer.future, $async$call$1);
+            case 6:
+              // returning from await.
+              // goto join
+              $async$goto = 4;
+              break;
+            case 5:
+              // else
+              $async$result = result;
+            case 4:
+              // join
+              $async$returnValue = $async$temp1.unwrapValue($async$result);
+              // goto return
+              $async$goto = 1;
+              break;
+            case 1:
+              // return
+              return P._asyncReturn($async$returnValue, $async$completer);
+          }
+      });
+      return P._asyncStartSync($async$call$1, $async$completer);
+    },
+    $signature: 156
+  };
+  B._parseFunctions___closure.prototype = {
+    call$1: function(result) {
+      return this.completer.complete$1(result);
+    },
+    call$0: function() {
+      return this.call$1(null);
+    },
+    "call*": "call$1",
+    $requiredArgCount: 0,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 411
+  };
+  B._parseImporter_closure.prototype = {
+    call$1: function(importer) {
+      return type$.legacy_JSFunction._as(P.allowInteropCaptureThis(new B._parseImporter__closure(this.options, importer)));
+    },
+    $signature: 412
+  };
+  B._parseImporter__closure.prototype = {
+    call$4: function(thisArg, url, previous, _) {
+      var t1 = this.options,
+        result = J.apply$2$x(this.importer, thisArg, H.setRuntimeTypeInfo([url, previous, P.allowInterop(new B._parseImporter___closure(J.get$current$x(J.get$fiber$x(t1))))], type$.JSArray_legacy_Object));
+      if (H._asBoolS($.$get$_isUndefined().call$1(result)))
+        return P.runZoned(new B._parseImporter___closure0(t1), null, type$.legacy_Object);
+      return result;
+    },
+    call$3: function(thisArg, url, previous) {
+      return this.call$4(thisArg, url, previous, null);
+    },
+    "call*": "call$4",
+    $requiredArgCount: 3,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 413
+  };
+  B._parseImporter___closure.prototype = {
+    call$1: function(result) {
+      P.scheduleMicrotask(new B._parseImporter____closure(this.fiber, result));
+    },
+    $signature: 414
+  };
+  B._parseImporter____closure.prototype = {
+    call$0: function() {
+      return J.run$1$x(this.fiber, this.result);
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 70
+  };
+  B._parseImporter___closure0.prototype = {
+    call$0: function() {
+      return J.yield$0$x(J.get$fiber$x(this.options));
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 70
+  };
+  O.NullExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitNullExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "null";
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  O.closure238.prototype = {
+    call$0: function() {
+      var $constructor = P.allowInterop(new O._closure29());
+      B.injectSuperclass(C.C_SassNull, $constructor);
+      self.Object.defineProperty(C.C_SassNull.constructor, "name", {value: "SassNull"});
+      B.forwardToString($constructor);
+      $constructor.NULL = C.C_SassNull;
+      C.C_SassNull.toString = P.allowInterop(new O._closure30());
+      return $constructor;
+    },
+    $signature: 129
+  };
+  O._closure29.prototype = {
+    call$1: function(_) {
+      throw H.wrapException("new sass.types.Null() isn't allowed. Use sass.types.Null.NULL instead.");
+    },
+    call$0: function() {
+      return this.call$1(null);
+    },
+    "call*": "call$1",
+    $requiredArgCount: 0,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 96
+  };
+  O._closure30.prototype = {
+    call$0: function() {
+      return "null";
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: 12
+  };
+  O.SassNull0.prototype = {
+    get$isTruthy: function() {
+      return false;
+    },
+    get$isBlank: function() {
+      return true;
+    },
+    get$realNull: function() {
+      return null;
+    },
+    accept$1$1: function(visitor) {
+      if (visitor._inspect)
+        visitor._buffer.write$1(0, "null");
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unaryNot$0: function() {
+      return C.SassBoolean_true;
+    }
+  };
+  T.NumberExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitNumberExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = H.S(this.value),
+        t2 = this.unit;
+      return t1 + (t2 == null ? "" : t2);
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  T._NodeSassNumber.prototype = {};
+  T.closure232.prototype = {
+    call$4: function(thisArg, value, unit, dartValue) {
+      J.set$dartValue$x(thisArg, dartValue == null ? T._parseNumber(value, unit) : dartValue);
+    },
+    call$2: function(thisArg, value) {
+      return this.call$4(thisArg, value, null, null);
+    },
+    call$3: function(thisArg, value, unit) {
+      return this.call$4(thisArg, value, unit, null);
+    },
+    "call*": "call$4",
+    $requiredArgCount: 2,
+    $defaultValues: function() {
+      return [null, null];
+    },
+    $signature: 415
+  };
+  T.closure233.prototype = {
+    call$1: function(thisArg) {
+      return J.get$dartValue$x(thisArg).value;
+    },
+    $signature: 416
+  };
+  T.closure234.prototype = {
+    call$2: function(thisArg, value) {
+      var t1 = J.getInterceptor$x(thisArg),
+        t2 = t1.get$dartValue(thisArg).get$numeratorUnits();
+      t1.set$dartValue(thisArg, T.SassNumber_SassNumber$withUnits0(value, t1.get$dartValue(thisArg).get$denominatorUnits(), t2));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 417
+  };
+  T.closure235.prototype = {
+    call$1: function(thisArg) {
+      var t1 = J.getInterceptor$x(thisArg),
+        t2 = J.join$1$ax(t1.get$dartValue(thisArg).get$numeratorUnits(), "*");
+      return t2 + (t1.get$dartValue(thisArg).get$denominatorUnits().length === 0 ? "" : "/") + C.JSArray_methods.join$1(t1.get$dartValue(thisArg).get$denominatorUnits(), "*");
+    },
+    $signature: 147
+  };
+  T.closure236.prototype = {
+    call$2: function(thisArg, unit) {
+      var t1 = J.getInterceptor$x(thisArg);
+      t1.set$dartValue(thisArg, T._parseNumber(t1.get$dartValue(thisArg).value, unit));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 419
+  };
+  T.closure237.prototype = {
+    call$1: function(thisArg) {
+      return J.toString$0$(J.get$dartValue$x(thisArg));
+    },
+    $signature: 147
+  };
+  T._parseNumber_closure.prototype = {
+    call$1: function(unit) {
+      return unit.length === 0;
+    },
+    $signature: 6
+  };
+  T._parseNumber_closure0.prototype = {
+    call$1: function(unit) {
+      return unit.length === 0;
+    },
+    $signature: 6
+  };
+  T.SassNumber0.prototype = {
+    get$unitString: function() {
+      var _this = this;
+      return _this.get$hasUnits() ? _this._number1$_unitString$2(_this.get$numeratorUnits(), _this.get$denominatorUnits()) : "";
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitNumber$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    withoutSlash$0: function() {
+      var _this = this;
+      return _this.asSlash == null ? _this : _this.withValue$1(_this.value);
+    },
+    assertNumber$1: function($name) {
+      return this;
+    },
+    assertNumber$0: function() {
+      return this.assertNumber$1(null);
+    },
+    assertInt$1: function($name) {
+      var t1 = this.value,
+        integer = T.fuzzyIsInt0(t1) ? J.round$0$n(t1) : null;
+      if (integer != null)
+        return integer;
+      throw H.wrapException(this._number1$_exception$2(this.toString$0(0) + " is not an int.", $name));
+    },
+    assertInt$0: function() {
+      return this.assertInt$1(null);
+    },
+    valueInRange$3: function(min, max, $name) {
+      var _this = this,
+        result = T.fuzzyCheckRange0(_this.value, min, max);
+      if (result != null)
+        return result;
+      throw H.wrapException(_this._number1$_exception$2("Expected " + _this.toString$0(0) + " to be within " + min + _this.get$unitString() + " and " + max + _this.get$unitString() + ".", $name));
+    },
+    assertUnit$2: function(unit, $name) {
+      if (this.hasUnit$1(unit))
+        return;
+      throw H.wrapException(this._number1$_exception$2("Expected " + this.toString$0(0) + ' to have unit "' + unit + '".', $name));
+    },
+    assertNoUnits$1: function($name) {
+      if (!this.get$hasUnits())
+        return;
+      throw H.wrapException(this._number1$_exception$2("Expected " + this.toString$0(0) + " to have no units.", $name));
+    },
+    coerceValueToMatch$1: function(other) {
+      return this._number1$_coerceOrConvertValue$6$coerceUnitless$name$other$otherName(other.get$numeratorUnits(), other.get$denominatorUnits(), true, null, other, null);
+    },
+    convertValueToMatch$3: function(other, $name, otherName) {
+      return this._number1$_coerceOrConvertValue$6$coerceUnitless$name$other$otherName(other.get$numeratorUnits(), other.get$denominatorUnits(), false, $name, other, otherName);
+    },
+    coerce$3: function(newNumerators, newDenominators, $name) {
+      return T.SassNumber_SassNumber$withUnits0(this.coerceValue$3(newNumerators, newDenominators, $name), newDenominators, newNumerators);
+    },
+    coerce$2: function(newNumerators, newDenominators) {
+      return this.coerce$3(newNumerators, newDenominators, null);
+    },
+    coerceValue$3: function(newNumerators, newDenominators, $name) {
+      return this._number1$_coerceOrConvertValue$4$coerceUnitless$name(newNumerators, newDenominators, true, $name);
+    },
+    coerceValueToUnit$2: function(unit, $name) {
+      var t1 = type$.JSArray_legacy_String;
+      return this.coerceValue$3(H.setRuntimeTypeInfo([unit], t1), H.setRuntimeTypeInfo([], t1), $name);
+    },
+    _number1$_coerceOrConvertValue$6$coerceUnitless$name$other$otherName: function(newNumerators, newDenominators, coerceUnitless, $name, other, otherName) {
+      var t1, otherHasUnits, t2, _compatibilityException, oldNumerators, oldDenominators, _i, _this = this, _box_0 = {};
+      if (C.C_ListEquality.equals$2(0, _this.get$numeratorUnits(), newNumerators) && C.C_ListEquality.equals$2(0, _this.get$denominatorUnits(), newDenominators))
+        return _this.value;
+      t1 = J.getInterceptor$asx(newNumerators);
+      otherHasUnits = t1.get$isNotEmpty(newNumerators) || newDenominators.length !== 0;
+      if (coerceUnitless)
+        t2 = !_this.get$hasUnits() || !otherHasUnits;
+      else
+        t2 = false;
+      if (t2)
+        return _this.value;
+      _compatibilityException = new T.SassNumber__coerceOrConvertValue__compatibilityException0(_this, other, otherName, otherHasUnits, $name, newNumerators, newDenominators);
+      _box_0.value = _this.value;
+      oldNumerators = J.toList$0$ax(_this.get$numeratorUnits());
+      for (t1 = t1.get$iterator(newNumerators); t1.moveNext$0();)
+        B.removeFirstWhere0(oldNumerators, new T.SassNumber__coerceOrConvertValue_closure3(_box_0, _this, t1.get$current(t1)), new T.SassNumber__coerceOrConvertValue_closure4(_compatibilityException));
+      t1 = _this.get$denominatorUnits();
+      oldDenominators = H.setRuntimeTypeInfo(t1.slice(0), H._arrayInstanceType(t1)._eval$1("JSArray<1>"));
+      for (t1 = newDenominators.length, _i = 0; _i < newDenominators.length; newDenominators.length === t1 || (0, H.throwConcurrentModificationError)(newDenominators), ++_i)
+        B.removeFirstWhere0(oldDenominators, new T.SassNumber__coerceOrConvertValue_closure5(_box_0, _this, newDenominators[_i]), new T.SassNumber__coerceOrConvertValue_closure6(_compatibilityException));
+      if (oldNumerators.length !== 0 || oldDenominators.length !== 0)
+        throw H.wrapException(_compatibilityException.call$0());
+      return _box_0.value;
+    },
+    _number1$_coerceOrConvertValue$4$coerceUnitless$name: function(newNumerators, newDenominators, coerceUnitless, $name) {
+      return this._number1$_coerceOrConvertValue$6$coerceUnitless$name$other$otherName(newNumerators, newDenominators, coerceUnitless, $name, null, null);
+    },
+    isComparableTo$1: function(other) {
+      var exception;
+      if (!this.get$hasUnits() || !other.get$hasUnits())
+        return true;
+      try {
+        this.greaterThan$1(other);
+        return true;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof E.SassScriptException0)
+          return false;
+        else
+          throw exception;
+      }
+    },
+    greaterThan$1: function(other) {
+      if (other instanceof T.SassNumber0)
+        return this._number1$_coerceUnits$2(other, T.number2__fuzzyGreaterThan$closure()) ? C.SassBoolean_true : C.SassBoolean_false;
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " > " + H.S(other) + '".'));
+    },
+    greaterThanOrEquals$1: function(other) {
+      if (other instanceof T.SassNumber0)
+        return this._number1$_coerceUnits$2(other, T.number2__fuzzyGreaterThanOrEquals$closure()) ? C.SassBoolean_true : C.SassBoolean_false;
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " >= " + H.S(other) + '".'));
+    },
+    lessThan$1: function(other) {
+      if (other instanceof T.SassNumber0)
+        return this._number1$_coerceUnits$2(other, T.number2__fuzzyLessThan$closure()) ? C.SassBoolean_true : C.SassBoolean_false;
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " < " + H.S(other) + '".'));
+    },
+    lessThanOrEquals$1: function(other) {
+      if (other instanceof T.SassNumber0)
+        return this._number1$_coerceUnits$2(other, T.number2__fuzzyLessThanOrEquals$closure()) ? C.SassBoolean_true : C.SassBoolean_false;
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " <= " + H.S(other) + '".'));
+    },
+    modulo$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber0)
+        return _this.withValue$1(_this._number1$_coerceUnits$2(other, _this.get$moduloLikeSass()));
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + _this.toString$0(0) + " % " + H.S(other) + '".'));
+    },
+    moduloLikeSass$2: function(num1, num2) {
+      var t1;
+      if (num2 > 0)
+        return C.JSNumber_methods.$mod(num1, num2);
+      if (num2 === 0)
+        return 0 / 0;
+      t1 = C.JSNumber_methods.$mod(num1, num2);
+      return t1 === 0 ? 0 : t1 + num2;
+    },
+    plus$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber0)
+        return _this.withValue$1(_this._number1$_coerceUnits$2(other, new T.SassNumber_plus_closure0()));
+      if (!(other instanceof K.SassColor0))
+        return _this.super$Value$plus0(other);
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + _this.toString$0(0) + " + " + other.toString$0(0) + '".'));
+    },
+    minus$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber0)
+        return _this.withValue$1(_this._number1$_coerceUnits$2(other, new T.SassNumber_minus_closure0()));
+      if (!(other instanceof K.SassColor0))
+        return _this.super$Value$minus0(other);
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + _this.toString$0(0) + " - " + other.toString$0(0) + '".'));
+    },
+    times$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber0) {
+        if (!other.get$hasUnits())
+          return _this.withValue$1(_this.value * other.value);
+        return _this.multiplyUnits$3(_this.value * other.value, other.get$numeratorUnits(), other.get$denominatorUnits());
+      }
+      throw H.wrapException(E.SassScriptException$0('Undefined operation "' + _this.toString$0(0) + " * " + H.S(other) + '".'));
+    },
+    dividedBy$1: function(other) {
+      var _this = this;
+      if (other instanceof T.SassNumber0) {
+        if (!other.get$hasUnits())
+          return _this.withValue$1(_this.value / other.value);
+        return _this.multiplyUnits$3(_this.value / other.value, other.get$denominatorUnits(), other.get$numeratorUnits());
+      }
+      return _this.super$Value$dividedBy0(other);
+    },
+    unaryPlus$0: function() {
+      return this;
+    },
+    _number1$_coerceUnits$1$2: function(other, operation) {
+      var t1, exception;
+      try {
+        t1 = operation.call$2(this.value, other.coerceValueToMatch$1(this));
+        return t1;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof E.SassScriptException0) {
+          this.coerceValueToMatch$1(other);
+          throw exception;
+        } else
+          throw exception;
+      }
+    },
+    _number1$_coerceUnits$2: function(other, operation) {
+      return this._number1$_coerceUnits$1$2(other, operation, type$.dynamic);
+    },
+    multiplyUnits$3: function(value, otherNumerators, otherDenominators) {
+      var newNumerators, mutableOtherDenominators, t1, t2, mutableDenominatorUnits, _this = this, _box_0 = {};
+      _box_0.value = value;
+      if (J.get$isEmpty$asx(_this.get$numeratorUnits())) {
+        if (J.get$isEmpty$asx(otherDenominators) && !_this._number1$_areAnyConvertible$2(_this.get$denominatorUnits(), otherNumerators))
+          return T.SassNumber_SassNumber$withUnits0(value, _this.get$denominatorUnits(), otherNumerators);
+        else if (_this.get$denominatorUnits().length === 0)
+          return T.SassNumber_SassNumber$withUnits0(value, otherDenominators, otherNumerators);
+      } else if (J.get$isEmpty$asx(otherNumerators))
+        if (J.get$isEmpty$asx(otherDenominators))
+          return T.SassNumber_SassNumber$withUnits0(value, otherDenominators, _this.get$numeratorUnits());
+        else if (_this.get$denominatorUnits().length === 0 && !_this._number1$_areAnyConvertible$2(_this.get$numeratorUnits(), otherDenominators))
+          return T.SassNumber_SassNumber$withUnits0(value, otherDenominators, _this.get$numeratorUnits());
+      newNumerators = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      mutableOtherDenominators = J.toList$0$ax(otherDenominators);
+      for (t1 = J.get$iterator$ax(_this.get$numeratorUnits()); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        B.removeFirstWhere0(mutableOtherDenominators, new T.SassNumber_multiplyUnits_closure3(_box_0, _this, t2), new T.SassNumber_multiplyUnits_closure4(newNumerators, t2));
+      }
+      t1 = _this.get$denominatorUnits();
+      mutableDenominatorUnits = H.setRuntimeTypeInfo(t1.slice(0), H._arrayInstanceType(t1)._eval$1("JSArray<1>"));
+      for (t1 = J.get$iterator$ax(otherNumerators); t1.moveNext$0();) {
+        t2 = t1.get$current(t1);
+        B.removeFirstWhere0(mutableDenominatorUnits, new T.SassNumber_multiplyUnits_closure5(_box_0, _this, t2), new T.SassNumber_multiplyUnits_closure6(newNumerators, t2));
+      }
+      t1 = _box_0.value;
+      C.JSArray_methods.addAll$1(mutableDenominatorUnits, mutableOtherDenominators);
+      return T.SassNumber_SassNumber$withUnits0(t1, mutableDenominatorUnits, newNumerators);
+    },
+    _number1$_areAnyConvertible$2: function(units1, units2) {
+      return J.any$1$ax(units1, new T.SassNumber__areAnyConvertible_closure0(this, units2));
+    },
+    conversionFactor$2: function(unit1, unit2) {
+      var innerMap;
+      if (unit1 == unit2)
+        return 1;
+      innerMap = C.Map_K2BWj.$index(0, unit1);
+      if (innerMap == null)
+        return null;
+      return innerMap.$index(0, unit2);
+    },
+    _number1$_unitString$2: function(numerators, denominators) {
+      var t1 = J.getInterceptor$asx(numerators);
+      if (t1.get$isEmpty(numerators)) {
+        t1 = denominators.length;
+        if (t1 === 0)
+          return "no units";
+        if (t1 === 1)
+          return J.$add$ansx(C.JSArray_methods.get$single(denominators), "^-1");
+        return "(" + C.JSArray_methods.join$1(denominators, "*") + ")^-1";
+      }
+      if (denominators.length === 0)
+        return t1.join$1(numerators, "*");
+      return t1.join$1(numerators, "*") + "/" + C.JSArray_methods.join$1(denominators, "*");
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      if (other instanceof T.SassNumber0) {
+        if (J.get$length$asx(_this.get$numeratorUnits()) !== J.get$length$asx(other.get$numeratorUnits()) || _this.get$denominatorUnits().length !== other.get$denominatorUnits().length)
+          return false;
+        if (!_this.get$hasUnits())
+          return Math.abs(_this.value - other.value) < $.$get$epsilon0();
+        if (!C.C_ListEquality.equals$2(0, _this._number1$_canonicalizeUnitList$1(_this.get$numeratorUnits()), _this._number1$_canonicalizeUnitList$1(other.get$numeratorUnits())) || !C.C_ListEquality.equals$2(0, _this._number1$_canonicalizeUnitList$1(_this.get$denominatorUnits()), _this._number1$_canonicalizeUnitList$1(other.get$denominatorUnits())))
+          return false;
+        return Math.abs(_this.value * _this._number1$_canonicalMultiplier$1(_this.get$numeratorUnits()) / _this._number1$_canonicalMultiplier$1(_this.get$denominatorUnits()) - other.value * _this._number1$_canonicalMultiplier$1(other.get$numeratorUnits()) / _this._number1$_canonicalMultiplier$1(other.get$denominatorUnits())) < $.$get$epsilon0();
+      } else
+        return false;
+    },
+    get$hashCode: function(_) {
+      var _this = this;
+      return T.fuzzyHashCode0(_this.value * _this._number1$_canonicalMultiplier$1(_this.get$numeratorUnits()) / _this._number1$_canonicalMultiplier$1(_this.get$denominatorUnits()));
+    },
+    _number1$_canonicalizeUnitList$1: function(units) {
+      var type,
+        t1 = J.getInterceptor$asx(units);
+      if (t1.get$isEmpty(units))
+        return units;
+      if (t1.get$length(units) === 1) {
+        type = $.$get$_typesByUnit0().$index(0, t1.get$first(units));
+        if (type == null)
+          t1 = units;
+        else {
+          t1 = C.Map_U8AHF.$index(0, type);
+          t1 = H.setRuntimeTypeInfo([(t1 && C.JSArray_methods).get$first(t1)], type$.JSArray_legacy_String);
+        }
+        return t1;
+      }
+      t1 = t1.map$1$1(units, new T.SassNumber__canonicalizeUnitList_closure0(), type$.legacy_String);
+      t1 = P.List_List$from(t1, true, t1.$ti._eval$1("ListIterable.E"));
+      C.JSArray_methods.sort$0(t1);
+      return t1;
+    },
+    _number1$_canonicalMultiplier$1: function(units) {
+      return J.fold$2$ax(units, 1, new T.SassNumber__canonicalMultiplier_closure0(this));
+    },
+    canonicalMultiplierForUnit$1: function(unit) {
+      var t1,
+        innerMap = C.Map_K2BWj.$index(0, unit);
+      if (innerMap == null)
+        t1 = 1;
+      else {
+        t1 = innerMap.get$values(innerMap);
+        t1 = 1 / t1.get$first(t1);
+      }
+      return t1;
+    },
+    _number1$_exception$2: function(message, $name) {
+      return new E.SassScriptException0($name == null ? message : "$" + $name + ": " + message);
+    }
+  };
+  T.SassNumber__coerceOrConvertValue__compatibilityException0.prototype = {
+    call$0: function() {
+      var t2, t3, message, t4, type, unit, _this = this,
+        t1 = _this.other;
+      if (t1 != null) {
+        t2 = _this.$this;
+        t3 = t2.toString$0(0) + " and";
+        message = new P.StringBuffer(t3);
+        t4 = _this.otherName;
+        if (t4 != null)
+          t3 = message._contents = t3 + (" $" + t4 + ":");
+        t1 = t3 + (" " + t1.toString$0(0) + " have incompatible units");
+        message._contents = t1;
+        if (!t2.get$hasUnits() || !_this.otherHasUnits)
+          message._contents = t1 + " (one has units and the other doesn't)";
+        t1 = message.toString$0(0) + ".";
+        t2 = _this.name;
+        return new E.SassScriptException0(t2 == null ? t1 : "$" + t2 + ": " + t1);
+      } else if (!_this.otherHasUnits) {
+        t1 = "Expected " + _this.$this.toString$0(0) + " to have no units.";
+        t2 = _this.name;
+        return new E.SassScriptException0(t2 == null ? t1 : "$" + t2 + ": " + t1);
+      } else {
+        t1 = _this.newNumerators;
+        t2 = J.getInterceptor$asx(t1);
+        if (t2.get$length(t1) === 1 && _this.newDenominators.length === 0) {
+          type = $.$get$_typesByUnit0().$index(0, t2.get$first(t1));
+          if (type != null) {
+            t1 = "Expected " + _this.$this.toString$0(0) + " to have ";
+            t1 = t1 + (C.JSArray_methods.contains$1(H.setRuntimeTypeInfo([97, 101, 105, 111, 117], type$.JSArray_legacy_int), C.JSString_methods._codeUnitAt$1(type, 0)) ? "an " + type : "a " + type) + " unit (";
+            t2 = C.Map_U8AHF.$index(0, type);
+            t2 = t1 + (t2 && C.JSArray_methods).join$1(t2, ", ") + ").";
+            t1 = _this.name;
+            return new E.SassScriptException0(t1 == null ? t2 : "$" + t1 + ": " + t2);
+          }
+        }
+        t3 = _this.newDenominators;
+        unit = B.pluralize0("unit", t2.get$length(t1) + t3.length, null);
+        t2 = _this.$this;
+        t3 = "Expected " + t2.toString$0(0) + " to have " + unit + " " + t2._number1$_unitString$2(t1, t3) + ".";
+        t1 = _this.name;
+        return new E.SassScriptException0(t1 == null ? t3 : "$" + t1 + ": " + t3);
+      }
+    },
+    $signature: 420
+  };
+  T.SassNumber__coerceOrConvertValue_closure3.prototype = {
+    call$1: function(oldNumerator) {
+      var t1,
+        factor = this.$this.conversionFactor$2(this.newNumerator, oldNumerator);
+      if (factor == null)
+        return false;
+      t1 = this._box_0;
+      t1.value = t1.value * factor;
+      return true;
+    },
+    $signature: 6
+  };
+  T.SassNumber__coerceOrConvertValue_closure4.prototype = {
+    call$0: function() {
+      return H.throwExpression(this._compatibilityException.call$0());
+    },
+    $signature: 0
+  };
+  T.SassNumber__coerceOrConvertValue_closure5.prototype = {
+    call$1: function(oldDenominator) {
+      var t1,
+        factor = this.$this.conversionFactor$2(this.newDenominator, oldDenominator);
+      if (factor == null)
+        return false;
+      t1 = this._box_0;
+      t1.value = t1.value / factor;
+      return true;
+    },
+    $signature: 6
+  };
+  T.SassNumber__coerceOrConvertValue_closure6.prototype = {
+    call$0: function() {
+      return H.throwExpression(this._compatibilityException.call$0());
+    },
+    $signature: 0
+  };
+  T.SassNumber_plus_closure0.prototype = {
+    call$2: function(num1, num2) {
+      return num1 + num2;
+    },
+    $signature: 50
+  };
+  T.SassNumber_minus_closure0.prototype = {
+    call$2: function(num1, num2) {
+      return num1 - num2;
+    },
+    $signature: 50
+  };
+  T.SassNumber_multiplyUnits_closure3.prototype = {
+    call$1: function(denominator) {
+      var factor = this.$this.conversionFactor$2(this.numerator, denominator);
+      if (factor == null)
+        return false;
+      this._box_0.value /= factor;
+      return true;
+    },
+    $signature: 6
+  };
+  T.SassNumber_multiplyUnits_closure4.prototype = {
+    call$0: function() {
+      this.newNumerators.push(this.numerator);
+      return null;
+    },
+    $signature: 0
+  };
+  T.SassNumber_multiplyUnits_closure5.prototype = {
+    call$1: function(denominator) {
+      var factor = this.$this.conversionFactor$2(this.numerator, denominator);
+      if (factor == null)
+        return false;
+      this._box_0.value /= factor;
+      return true;
+    },
+    $signature: 6
+  };
+  T.SassNumber_multiplyUnits_closure6.prototype = {
+    call$0: function() {
+      this.newNumerators.push(this.numerator);
+      return null;
+    },
+    $signature: 0
+  };
+  T.SassNumber__areAnyConvertible_closure0.prototype = {
+    call$1: function(unit1) {
+      if (!C.Map_K2BWj.containsKey$1(unit1))
+        return J.contains$1$asx(this.units2, unit1);
+      return J.any$1$ax(this.units2, C.Map_K2BWj.$index(0, unit1).get$containsKey());
+    },
+    $signature: 6
+  };
+  T.SassNumber__canonicalizeUnitList_closure0.prototype = {
+    call$1: function(unit) {
+      var t1,
+        type = $.$get$_typesByUnit0().$index(0, unit);
+      if (type == null)
+        t1 = unit;
+      else {
+        t1 = C.Map_U8AHF.$index(0, type);
+        t1 = (t1 && C.JSArray_methods).get$first(t1);
+      }
+      return t1;
+    },
+    $signature: 4
+  };
+  T.SassNumber__canonicalMultiplier_closure0.prototype = {
+    call$2: function(multiplier, unit) {
+      return multiplier * this.$this.canonicalMultiplierForUnit$1(unit);
+    },
+    $signature: 211
+  };
+  U.SupportsOperation0.prototype = {
+    toString$0: function(_) {
+      var _this = this;
+      return _this._operation0$_parenthesize$1(_this.left) + " " + _this.operator + " " + _this._operation0$_parenthesize$1(_this.right);
+    },
+    _operation0$_parenthesize$1: function(condition) {
+      var t1;
+      if (!(condition instanceof M.SupportsNegation0))
+        t1 = condition instanceof U.SupportsOperation0 && condition.operator === this.operator;
+      else
+        t1 = true;
+      return t1 ? "(" + condition.toString$0(0) + ")" : condition.toString$0(0);
+    },
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  M.ParentSelector0.prototype = {
+    accept$1$1: function(visitor) {
+      var t2,
+        t1 = visitor._buffer;
+      t1.writeCharCode$1(38);
+      t2 = this.suffix;
+      if (t2 != null)
+        t1.write$1(0, t2);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unify$1: function(compound) {
+      return H.throwExpression(P.UnsupportedError$("& doesn't support unification."));
+    }
+  };
+  M.ParentStatement0.prototype = {$isAstNode0: 1, $isStatement0: 1};
+  M.ParentStatement_closure0.prototype = {
+    call$1: function(child) {
+      var t1;
+      if (!(child instanceof Z.VariableDeclaration0))
+        if (!(child instanceof M.FunctionRule0))
+          if (!(child instanceof T.MixinRule0))
+            t1 = child instanceof B.ImportRule0 && C.JSArray_methods.any$1(child.imports, new M.ParentStatement__closure0());
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    $signature: 135
+  };
+  M.ParentStatement__closure0.prototype = {
+    call$1: function($import) {
+      return $import instanceof B.DynamicImport0;
+    },
+    $signature: 134
+  };
+  T.ParenthesizedExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitParenthesizedExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return J.toString$0$(this.expression);
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  G.Parser1.prototype = {
+    _parser$_parseIdentifier$0: function() {
+      return this.wrapSpanFormatException$1(new G.Parser__parseIdentifier_closure0(this));
+    },
+    whitespace$0: function() {
+      do
+        this.whitespaceWithoutComments$0();
+      while (this.scanComment$0());
+    },
+    whitespaceWithoutComments$0: function() {
+      var t3,
+        t1 = this.scanner,
+        t2 = t1.string.length;
+      while (true) {
+        if (t1._string_scanner$_position !== t2) {
+          t3 = t1.peekChar$0();
+          t3 = t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        t1.readChar$0();
+      }
+    },
+    spaces$0: function() {
+      var t3,
+        t1 = this.scanner,
+        t2 = t1.string.length;
+      while (true) {
+        if (t1._string_scanner$_position !== t2) {
+          t3 = t1.peekChar$0();
+          t3 = t3 === 32 || t3 === 9;
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        t1.readChar$0();
+      }
+    },
+    scanComment$0: function() {
+      var next,
+        t1 = this.scanner;
+      if (t1.peekChar$0() !== 47)
+        return false;
+      next = t1.peekChar$1(1);
+      if (next === 47) {
+        this.silentComment$0();
+        return true;
+      } else if (next === 42) {
+        this.loudComment$0();
+        return true;
+      } else
+        return false;
+    },
+    silentComment$0: function() {
+      var t2, t3,
+        t1 = this.scanner;
+      t1.expect$1("//");
+      t2 = t1.string.length;
+      while (true) {
+        if (t1._string_scanner$_position !== t2) {
+          t3 = t1.peekChar$0();
+          t3 = !(t3 === 10 || t3 === 13 || t3 === 12);
+        } else
+          t3 = false;
+        if (!t3)
+          break;
+        t1.readChar$0();
+      }
+    },
+    loudComment$0: function() {
+      var next,
+        t1 = this.scanner;
+      t1.expect$1("/*");
+      for (; true;) {
+        if (t1.readChar$0() !== 42)
+          continue;
+        do
+          next = t1.readChar$0();
+        while (next === 42);
+        if (next === 47)
+          break;
+      }
+    },
+    identifier$2$normalize$unit: function(normalize, unit) {
+      var t2, first, _this = this,
+        _s20_ = "Expected identifier.",
+        text = new P.StringBuffer(""),
+        t1 = _this.scanner;
+      if (t1.scanChar$1(45)) {
+        t2 = text._contents = H.Primitives_stringFromCharCode(45);
+        if (t1.scanChar$1(45)) {
+          text._contents = t2 + H.Primitives_stringFromCharCode(45);
+          _this._parser$_identifierBody$3$normalize$unit(text, normalize, unit);
+          t1 = text._contents;
+          return t1.charCodeAt(0) == 0 ? t1 : t1;
+        }
+      } else
+        t2 = "";
+      first = t1.peekChar$0();
+      if (first == null)
+        t1.error$1(0, _s20_);
+      else if (normalize && first === 95) {
+        t1.readChar$0();
+        text._contents = t2 + H.Primitives_stringFromCharCode(45);
+      } else if (first === 95 || T.isAlphabetic1(first) || first >= 128)
+        text._contents = t2 + H.Primitives_stringFromCharCode(t1.readChar$0());
+      else if (first === 92)
+        text._contents = t2 + H.S(_this.escape$1$identifierStart(true));
+      else
+        t1.error$1(0, _s20_);
+      _this._parser$_identifierBody$3$normalize$unit(text, normalize, unit);
+      t1 = text._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    identifier$0: function() {
+      return this.identifier$2$normalize$unit(false, false);
+    },
+    identifier$1$normalize: function(normalize) {
+      return this.identifier$2$normalize$unit(normalize, false);
+    },
+    identifier$1$unit: function(unit) {
+      return this.identifier$2$normalize$unit(false, unit);
+    },
+    _parser$_identifierBody$3$normalize$unit: function(text, normalize, unit) {
+      var t1, next, second, t2;
+      for (t1 = this.scanner; true;) {
+        next = t1.peekChar$0();
+        if (next == null)
+          break;
+        else if (unit && next === 45) {
+          second = t1.peekChar$1(1);
+          if (second != null)
+            if (second !== 46)
+              t2 = second >= 48 && second <= 57;
+            else
+              t2 = true;
+          else
+            t2 = false;
+          if (t2)
+            break;
+          text._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+        } else if (normalize && next === 95) {
+          t1.readChar$0();
+          text._contents += H.Primitives_stringFromCharCode(45);
+        } else {
+          if (next !== 95) {
+            if (!(next >= 97 && next <= 122))
+              t2 = next >= 65 && next <= 90;
+            else
+              t2 = true;
+            t2 = t2 || next >= 128;
+          } else
+            t2 = true;
+          if (!t2) {
+            t2 = next >= 48 && next <= 57;
+            t2 = t2 || next === 45;
+          } else
+            t2 = true;
+          if (t2)
+            text._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          else if (next === 92)
+            text._contents += H.S(this.escape$0());
+          else
+            break;
+        }
+      }
+    },
+    _parser$_identifierBody$1: function(text) {
+      return this._parser$_identifierBody$3$normalize$unit(text, false, false);
+    },
+    string$0: function() {
+      var t2, buffer, next,
+        t1 = this.scanner,
+        quote = t1.readChar$0();
+      if (quote !== 39 && quote !== 34) {
+        t2 = t1._string_scanner$_position;
+        t1.error$2$position(0, "Expected string.", t2 - 1);
+      }
+      buffer = new P.StringBuffer("");
+      for (; true;) {
+        next = t1.peekChar$0();
+        if (next === quote) {
+          t1.readChar$0();
+          break;
+        } else if (next == null || next === 10 || next === 13 || next === 12)
+          t1.error$1(0, "Expected " + H.Primitives_stringFromCharCode(quote) + ".");
+        else if (next === 92) {
+          t2 = t1.peekChar$1(1);
+          if (t2 === 10 || t2 === 13 || t2 === 12) {
+            t1.readChar$0();
+            t1.readChar$0();
+          } else
+            buffer._contents += H.Primitives_stringFromCharCode(this.escapeCharacter$0());
+        } else
+          buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+      }
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    naturalNumber$0: function() {
+      var number, t2,
+        t1 = this.scanner,
+        first = t1.readChar$0();
+      if (!T.isDigit0(first))
+        t1.error$2$position(0, "Expected digit.", t1._string_scanner$_position - 1);
+      number = first - 48;
+      while (true) {
+        t2 = t1.peekChar$0();
+        if (!(t2 != null && t2 >= 48 && t2 <= 57))
+          break;
+        number = number * 10 + (t1.readChar$0() - 48);
+      }
+      return number;
+    },
+    declarationValue$1$allowEmpty: function(allowEmpty) {
+      var t1, t2, wroteNewline, next, start, end, t3, url, _this = this,
+        buffer = new P.StringBuffer(""),
+        brackets = H.setRuntimeTypeInfo([], type$.JSArray_legacy_int);
+      $label0$1:
+        for (t1 = _this.scanner, t2 = _this.get$string(), wroteNewline = false; true;) {
+          next = t1.peekChar$0();
+          switch (next) {
+            case 92:
+              buffer._contents += H.S(_this.escape$1$identifierStart(true));
+              wroteNewline = false;
+              break;
+            case 34:
+            case 39:
+              start = t1._string_scanner$_position;
+              t2.call$0();
+              end = t1._string_scanner$_position;
+              buffer._contents += J.substring$2$s(t1.string, start, end);
+              wroteNewline = false;
+              break;
+            case 47:
+              if (t1.peekChar$1(1) === 42) {
+                t3 = _this.get$loudComment();
+                start = t1._string_scanner$_position;
+                t3.call$0();
+                end = t1._string_scanner$_position;
+                buffer._contents += J.substring$2$s(t1.string, start, end);
+              } else
+                buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 32:
+            case 9:
+              if (!wroteNewline) {
+                t3 = t1.peekChar$1(1);
+                t3 = !(t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12);
+              } else
+                t3 = true;
+              if (t3)
+                buffer._contents += H.Primitives_stringFromCharCode(32);
+              t1.readChar$0();
+              break;
+            case 10:
+            case 13:
+            case 12:
+              t3 = t1.peekChar$1(-1);
+              if (!(t3 === 10 || t3 === 13 || t3 === 12))
+                buffer._contents += "\n";
+              t1.readChar$0();
+              wroteNewline = true;
+              break;
+            case 40:
+            case 123:
+            case 91:
+              buffer._contents += H.Primitives_stringFromCharCode(next);
+              brackets.push(T.opposite0(t1.readChar$0()));
+              wroteNewline = false;
+              break;
+            case 41:
+            case 125:
+            case 93:
+              if (brackets.length === 0)
+                break $label0$1;
+              buffer._contents += H.Primitives_stringFromCharCode(next);
+              t1.expectChar$1(brackets.pop());
+              wroteNewline = false;
+              break;
+            case 59:
+              if (brackets.length === 0)
+                break $label0$1;
+              buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 117:
+            case 85:
+              url = _this.tryUrl$0();
+              if (url != null)
+                buffer._contents += url;
+              else
+                buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            default:
+              if (next == null)
+                break $label0$1;
+              if (_this.lookingAtIdentifier$0())
+                buffer._contents += _this.identifier$0();
+              else
+                buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+          }
+        }
+      if (brackets.length !== 0)
+        t1.expectChar$1(C.JSArray_methods.get$last(brackets));
+      if (!allowEmpty && buffer._contents.length === 0)
+        t1.error$1(0, "Expected token.");
+      t1 = buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    declarationValue$0: function() {
+      return this.declarationValue$1$allowEmpty(false);
+    },
+    tryUrl$0: function() {
+      var buffer, next, t2, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      if (!_this.scanIdentifier$1("url"))
+        return null;
+      if (!t1.scanChar$1(40)) {
+        t1.set$state(start);
+        return null;
+      }
+      _this.whitespace$0();
+      buffer = new P.StringBuffer("");
+      buffer._contents = "url(";
+      for (; true;) {
+        next = t1.peekChar$0();
+        if (next == null)
+          break;
+        else {
+          if (next !== 37)
+            if (next !== 38)
+              if (next !== 35)
+                t2 = next >= 42 && next <= 126 || next >= 128;
+              else
+                t2 = true;
+            else
+              t2 = true;
+          else
+            t2 = true;
+          if (t2)
+            buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          else if (next === 92)
+            buffer._contents += H.S(_this.escape$0());
+          else if (next === 32 || next === 9 || next === 10 || next === 13 || next === 12) {
+            _this.whitespace$0();
+            if (t1.peekChar$0() !== 41)
+              break;
+          } else if (next === 41) {
+            t2 = buffer._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            return t2.charCodeAt(0) == 0 ? t2 : t2;
+          } else
+            break;
+        }
+      }
+      t1.set$state(start);
+      return null;
+    },
+    variableName$0: function() {
+      this.scanner.expectChar$1(36);
+      return this.identifier$1$normalize(true);
+    },
+    escape$1$identifierStart: function(identifierStart) {
+      var value, first, i, next, t2, exception,
+        t1 = this.scanner,
+        start = t1._string_scanner$_position;
+      t1.expectChar$1(92);
+      value = 0;
+      first = t1.peekChar$0();
+      if (first == null)
+        return "";
+      else if (T.isNewline0(first))
+        t1.error$1(0, "Expected escape sequence.");
+      else if (T.isHex0(first)) {
+        for (i = 0; i < 6; ++i) {
+          next = t1.peekChar$0();
+          if (next == null || !T.isHex0(next))
+            break;
+          value *= 16;
+          value += T.asHex0(t1.readChar$0());
+        }
+        this.scanCharIf$1(T.character0__isWhitespace$closure());
+      } else
+        value = t1.readChar$0();
+      if (identifierStart) {
+        t2 = value;
+        t2 = t2 === 95 || T.isAlphabetic1(t2) || t2 >= 128;
+      } else {
+        t2 = value;
+        t2 = t2 === 95 || T.isAlphabetic1(t2) || t2 >= 128 || T.isDigit0(t2) || t2 === 45;
+      }
+      if (t2)
+        try {
+          t2 = H.Primitives_stringFromCharCode(value);
+          return t2;
+        } catch (exception) {
+          if (type$.legacy_RangeError._is(H.unwrapException(exception)))
+            t1.error$3$length$position(0, "Invalid Unicode code point.", t1._string_scanner$_position - start, start);
+          else
+            throw exception;
+        }
+      else {
+        if (!(value <= 31))
+          if (!J.$eq$(value, 127))
+            t1 = identifierStart && T.isDigit0(value);
+          else
+            t1 = true;
+        else
+          t1 = true;
+        if (t1) {
+          t1 = H.Primitives_stringFromCharCode(92);
+          if (value > 15)
+            t1 += H.Primitives_stringFromCharCode(T.hexCharFor0(C.JSNumber_methods._shrOtherPositive$1(value, 4)));
+          t1 = t1 + H.Primitives_stringFromCharCode(T.hexCharFor0(value & 15)) + H.Primitives_stringFromCharCode(32);
+          return t1.charCodeAt(0) == 0 ? t1 : t1;
+        } else
+          return P.String_String$fromCharCodes(H.setRuntimeTypeInfo([92, value], type$.JSArray_legacy_int), 0, null);
+      }
+    },
+    escape$0: function() {
+      return this.escape$1$identifierStart(false);
+    },
+    escapeCharacter$0: function() {
+      var first, value, i, next, t2,
+        t1 = this.scanner;
+      t1.expectChar$1(92);
+      first = t1.peekChar$0();
+      if (first == null)
+        return 65533;
+      else if (T.isNewline0(first))
+        t1.error$1(0, "Expected escape sequence.");
+      else if (T.isHex0(first)) {
+        for (value = 0, i = 0; i < 6; ++i) {
+          next = t1.peekChar$0();
+          if (next == null || !T.isHex0(next))
+            break;
+          value = (value << 4 >>> 0) + T.asHex0(t1.readChar$0());
+        }
+        t2 = t1.peekChar$0();
+        if (t2 === 32 || t2 === 9 || T.isNewline0(t2))
+          t1.readChar$0();
+        if (value !== 0)
+          t1 = value >= 55296 && value <= 57343 || value >= 1114111;
+        else
+          t1 = true;
+        if (t1)
+          return 65533;
+        else
+          return value;
+      } else
+        return t1.readChar$0();
+    },
+    scanCharIf$1: function(condition) {
+      var t1 = this.scanner;
+      if (!condition.call$1(t1.peekChar$0()))
+        return false;
+      t1.readChar$0();
+      return true;
+    },
+    scanIdentChar$2$caseSensitive: function(char, caseSensitive) {
+      var t3,
+        t1 = new G.Parser_scanIdentChar_matches0(caseSensitive, char),
+        t2 = this.scanner,
+        next = t2.peekChar$0();
+      if (next != null && t1.call$1(next)) {
+        t2.readChar$0();
+        return true;
+      } else if (next === 92) {
+        t3 = t2._string_scanner$_position;
+        if (t1.call$1(this.escapeCharacter$0()))
+          return true;
+        t2.set$state(new S._SpanScannerState(t2, t3));
+      }
+      return false;
+    },
+    scanIdentChar$1: function(char) {
+      return this.scanIdentChar$2$caseSensitive(char, false);
+    },
+    expectIdentChar$1: function(letter) {
+      var t1;
+      if (this.scanIdentChar$2$caseSensitive(letter, false))
+        return;
+      t1 = this.scanner;
+      t1.error$2$position(0, 'Expected "' + H.Primitives_stringFromCharCode(letter) + '".', t1._string_scanner$_position);
+    },
+    lookingAtNumber$0: function() {
+      var second, third,
+        t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first == null)
+        return false;
+      if (T.isDigit0(first))
+        return true;
+      if (first === 46) {
+        second = t1.peekChar$1(1);
+        return second != null && T.isDigit0(second);
+      } else if (first === 43 || first === 45) {
+        second = t1.peekChar$1(1);
+        if (second == null)
+          return false;
+        if (T.isDigit0(second))
+          return true;
+        if (second !== 46)
+          return false;
+        third = t1.peekChar$1(2);
+        return third != null && T.isDigit0(third);
+      } else
+        return false;
+    },
+    lookingAtIdentifier$1: function($forward) {
+      var t1, first, second;
+      if ($forward == null)
+        $forward = 0;
+      t1 = this.scanner;
+      first = t1.peekChar$1($forward);
+      if (first == null)
+        return false;
+      if (first === 95 || T.isAlphabetic1(first) || first >= 128 || first === 92)
+        return true;
+      if (first !== 45)
+        return false;
+      second = t1.peekChar$1($forward + 1);
+      if (second == null)
+        return false;
+      return second === 95 || T.isAlphabetic1(second) || second >= 128 || second === 92 || second === 45;
+    },
+    lookingAtIdentifier$0: function() {
+      return this.lookingAtIdentifier$1(null);
+    },
+    lookingAtIdentifierBody$0: function() {
+      var t1,
+        next = this.scanner.peekChar$0();
+      if (next != null)
+        t1 = next === 95 || T.isAlphabetic1(next) || next >= 128 || T.isDigit0(next) || next === 45 || next === 92;
+      else
+        t1 = false;
+      return t1;
+    },
+    scanIdentifier$2$caseSensitive: function(text, caseSensitive) {
+      var t1, start, t2, cur, _this = this;
+      if (!_this.lookingAtIdentifier$0())
+        return false;
+      t1 = _this.scanner;
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      for (t2 = new H.CodeUnits(text), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        if (_this.scanIdentChar$2$caseSensitive(cur, caseSensitive))
+          continue;
+        if (start._scanner !== t1)
+          H.throwExpression(P.ArgumentError$(string$.The_gi));
+        t2 = start.position;
+        if (t2 < 0 || t2 > t1.string.length)
+          H.throwExpression(P.ArgumentError$("Invalid position " + t2));
+        t1._string_scanner$_position = t2;
+        t1._lastMatch = null;
+        return false;
+      }
+      if (!_this.lookingAtIdentifierBody$0())
+        return true;
+      t1.set$state(start);
+      return false;
+    },
+    scanIdentifier$1: function(text) {
+      return this.scanIdentifier$2$caseSensitive(text, false);
+    },
+    expectIdentifier$2$name: function(text, $name) {
+      var t1, start, t2, cur;
+      if ($name == null)
+        $name = '"' + text + '"';
+      t1 = this.scanner;
+      start = t1._string_scanner$_position;
+      for (t2 = new H.CodeUnits(text), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+        cur = t2.__internal$_current;
+        if (this.scanIdentChar$2$caseSensitive(cur, false))
+          continue;
+        t1.error$2$position(0, "Expected " + $name + ".", start);
+      }
+      if (!this.lookingAtIdentifierBody$0())
+        return;
+      t1.error$2$position(0, "Expected " + $name, start);
+    },
+    expectIdentifier$1: function(text) {
+      return this.expectIdentifier$2$name(text, null);
+    },
+    rawText$1: function(consumer) {
+      var t1 = this.scanner,
+        start = t1._string_scanner$_position;
+      consumer.call$0();
+      return t1.substring$1(0, start);
+    },
+    error$2: function(_, message, span) {
+      return H.throwExpression(E.StringScannerException$(message, span, this.scanner.string));
+    },
+    withErrorMessage$1$2: function(message, callback) {
+      var error, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_SourceSpanFormatException._is(t1)) {
+          error = t1;
+          throw H.wrapException(G.SourceSpanFormatException$(message, error.get$span(), error.get$source()));
+        } else
+          throw exception;
+      }
+    },
+    withErrorMessage$2: function(message, callback) {
+      return this.withErrorMessage$1$2(message, callback, type$.dynamic);
+    },
+    wrapSpanFormatException$1$1: function(callback) {
+      var error, span, startPosition, t1, exception;
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (type$.legacy_SourceSpanFormatException._is(t1)) {
+          error = t1;
+          span = error.get$span();
+          if (B.startsWithIgnoreCase0(error._span_exception$_message, "expected")) {
+            t1 = span;
+            t1 = t1._end - t1._file$_start === 0;
+          } else
+            t1 = false;
+          if (t1) {
+            t1 = span;
+            startPosition = this._parser$_firstNewlineBefore$1(Y.FileLocation$_(t1.file, t1._file$_start).offset);
+            t1 = span;
+            if (!J.$eq$(startPosition, Y.FileLocation$_(t1.file, t1._file$_start).offset))
+              span = span.file.span$2(startPosition, startPosition);
+          }
+          throw H.wrapException(E.SassFormatException$0(error._span_exception$_message, span));
+        } else
+          throw exception;
+      }
+    },
+    wrapSpanFormatException$1: function(callback) {
+      return this.wrapSpanFormatException$1$1(callback, type$.dynamic);
+    },
+    _parser$_firstNewlineBefore$1: function(position) {
+      var t1, t2, lastNewline, codeUnit,
+        index = position - 1;
+      for (t1 = this.scanner.string, t2 = J.getInterceptor$s(t1), lastNewline = null; index >= 0;) {
+        codeUnit = t2.codeUnitAt$1(t1, index);
+        if (!(codeUnit === 32 || codeUnit === 9 || codeUnit === 10 || codeUnit === 13 || codeUnit === 12))
+          return lastNewline == null ? position : lastNewline;
+        if (codeUnit === 10 || codeUnit === 13 || codeUnit === 12)
+          lastNewline = index;
+        --index;
+      }
+      return position;
+    }
+  };
+  G.Parser__parseIdentifier_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        result = t1.identifier$0();
+      t1.scanner.expectDone$0();
+      return result;
+    },
+    $signature: 12
+  };
+  G.Parser_scanIdentChar_matches0.prototype = {
+    call$1: function(actual) {
+      var t1 = this.char;
+      return this.caseSensitive ? actual === t1 : T.characterEqualsIgnoreCase0(t1, actual);
+    },
+    $signature: 24
+  };
+  N.PlaceholderSelector0.prototype = {
+    get$isInvisible: function() {
+      return true;
+    },
+    accept$1$1: function(visitor) {
+      var t1 = visitor._buffer;
+      t1.writeCharCode$1(37);
+      t1.write$1(0, this.name);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    addSuffix$1: function(suffix) {
+      return new N.PlaceholderSelector0(this.name + suffix);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof N.PlaceholderSelector0 && other.name === this.name;
+    },
+    get$hashCode: function(_) {
+      return C.JSString_methods.get$hashCode(this.name);
+    }
+  };
+  L.PlainCssCallable0.prototype = {
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof L.PlainCssCallable0 && this.name == other.name;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.name);
+    },
+    $isAsyncCallable0: 1,
+    $isCallable0: 1,
+    get$name: function(receiver) {
+      return this.name;
+    }
+  };
+  F.PrefixedMapView0.prototype = {
+    get$keys: function(_) {
+      return new F._PrefixedKeys0(this);
+    },
+    get$length: function(_) {
+      var t1 = this._prefixed_map_view0$_map;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._prefixed_map_view0$_map;
+      return t1.get$isEmpty(t1);
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._prefixed_map_view0$_map;
+      return t1.get$isNotEmpty(t1);
+    },
+    $index: function(_, key) {
+      return typeof key == "string" && C.JSString_methods.startsWith$1(key, this._prefixed_map_view0$_prefix) ? this._prefixed_map_view0$_map.$index(0, J.substring$1$s(key, this._prefixed_map_view0$_prefix.length)) : null;
+    },
+    containsKey$1: function(key) {
+      return typeof key == "string" && C.JSString_methods.startsWith$1(key, this._prefixed_map_view0$_prefix) && this._prefixed_map_view0$_map.containsKey$1(J.substring$1$s(key, this._prefixed_map_view0$_prefix.length));
+    }
+  };
+  F._PrefixedKeys0.prototype = {
+    get$length: function(_) {
+      var t1 = this._prefixed_map_view0$_view._prefixed_map_view0$_map;
+      return t1.get$length(t1);
+    },
+    get$iterator: function(_) {
+      var t1 = this._prefixed_map_view0$_view._prefixed_map_view0$_map;
+      t1 = J.map$1$1$ax(t1.get$keys(t1), new F._PrefixedKeys_iterator_closure0(this), type$.legacy_String);
+      return t1.get$iterator(t1);
+    },
+    contains$1: function(_, key) {
+      return this._prefixed_map_view0$_view.containsKey$1(key);
+    }
+  };
+  F._PrefixedKeys_iterator_closure0.prototype = {
+    call$1: function(key) {
+      return this.$this._prefixed_map_view0$_view._prefixed_map_view0$_prefix + H.S(key);
+    },
+    $signature: 4
+  };
+  D.PseudoSelector0.prototype = {
+    get$minSpecificity: function() {
+      if (this._pseudo0$_minSpecificity == null)
+        this._pseudo0$_computeSpecificity$0();
+      return this._pseudo0$_minSpecificity;
+    },
+    get$maxSpecificity: function() {
+      if (this._pseudo0$_maxSpecificity == null)
+        this._pseudo0$_computeSpecificity$0();
+      return this._pseudo0$_maxSpecificity;
+    },
+    get$isInvisible: function() {
+      var t1 = this.selector;
+      if (t1 == null)
+        return false;
+      return this.name !== "not" && t1.get$isInvisible();
+    },
+    addSuffix$1: function(suffix) {
+      var _this = this;
+      if (_this.argument != null || _this.selector != null)
+        _this.super$SimpleSelector$addSuffix0(suffix);
+      return D.PseudoSelector$0(_this.name + suffix, null, !_this.isClass, null);
+    },
+    unify$1: function(compound) {
+      var result, t1, t2, addedThis, _i, simple, _this = this;
+      if (compound.length === 1 && C.JSArray_methods.get$first(compound) instanceof N.UniversalSelector0)
+        return C.JSArray_methods.get$first(compound).unify$1(H.setRuntimeTypeInfo([_this], type$.JSArray_legacy_SimpleSelector_2));
+      if (C.JSArray_methods.contains$1(compound, _this))
+        return compound;
+      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector_2);
+      for (t1 = compound.length, t2 = !_this.isClass, addedThis = false, _i = 0; _i < compound.length; compound.length === t1 || (0, H.throwConcurrentModificationError)(compound), ++_i) {
+        simple = compound[_i];
+        if (simple instanceof D.PseudoSelector0 && !simple.isClass) {
+          if (t2)
+            return null;
+          result.push(_this);
+          addedThis = true;
+        }
+        result.push(simple);
+      }
+      if (!addedThis)
+        result.push(_this);
+      return result;
+    },
+    _pseudo0$_computeSpecificity$0: function() {
+      var t1, _i, t2, complex, t3, t4, _this = this;
+      if (!_this.isClass) {
+        _this._pseudo0$_maxSpecificity = _this._pseudo0$_minSpecificity = 1;
+        return;
+      }
+      t1 = _this.selector;
+      if (t1 == null) {
+        _this._pseudo0$_minSpecificity = M.SimpleSelector0.prototype.get$minSpecificity.call(_this);
+        _this._pseudo0$_maxSpecificity = M.SimpleSelector0.prototype.get$maxSpecificity.call(_this);
+        return;
+      }
+      if (_this.name === "not") {
+        _i = _this._pseudo0$_maxSpecificity = _this._pseudo0$_minSpecificity = 0;
+        for (t1 = t1.components, t2 = t1.length; _i < t2; ++_i) {
+          complex = t1[_i];
+          t3 = _this._pseudo0$_minSpecificity;
+          if (complex._complex0$_minSpecificity == null)
+            complex._complex0$_computeSpecificity$0();
+          t4 = complex._complex0$_minSpecificity;
+          _this._pseudo0$_minSpecificity = Math.max(H.checkNum(t3), H.checkNum(t4));
+          t4 = _this._pseudo0$_maxSpecificity;
+          if (complex._complex0$_maxSpecificity == null)
+            complex._complex0$_computeSpecificity$0();
+          t3 = complex._complex0$_maxSpecificity;
+          _this._pseudo0$_maxSpecificity = Math.max(H.checkNum(t4), H.checkNum(t3));
+        }
+      } else {
+        _this._pseudo0$_minSpecificity = H._asIntS(Math.pow(M.SimpleSelector0.prototype.get$minSpecificity.call(_this), 3));
+        _i = _this._pseudo0$_maxSpecificity = 0;
+        for (t1 = t1.components, t2 = t1.length; _i < t2; ++_i) {
+          complex = t1[_i];
+          t3 = _this._pseudo0$_minSpecificity;
+          if (complex._complex0$_minSpecificity == null)
+            complex._complex0$_computeSpecificity$0();
+          t4 = complex._complex0$_minSpecificity;
+          _this._pseudo0$_minSpecificity = Math.min(H.checkNum(t3), H.checkNum(t4));
+          t4 = _this._pseudo0$_maxSpecificity;
+          if (complex._complex0$_maxSpecificity == null)
+            complex._complex0$_computeSpecificity$0();
+          t3 = complex._complex0$_maxSpecificity;
+          _this._pseudo0$_maxSpecificity = Math.max(H.checkNum(t4), H.checkNum(t3));
+        }
+      }
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitPseudoSelector$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    $eq: function(_, other) {
+      var _this = this;
+      if (other == null)
+        return false;
+      return other instanceof D.PseudoSelector0 && other.name === _this.name && other.isClass === _this.isClass && other.argument == _this.argument && J.$eq$(other.selector, _this.selector);
+    },
+    get$hashCode: function(_) {
+      var _this = this;
+      return (C.JSString_methods.get$hashCode(_this.name) ^ C.JSBool_methods.get$hashCode(!_this.isClass) ^ J.get$hashCode$(_this.argument) ^ J.get$hashCode$(_this.selector)) >>> 0;
+    }
+  };
+  U.PublicMemberMapView0.prototype = {
+    get$keys: function(_) {
+      var t1 = this._public_member_map_view$_inner;
+      return J.where$1$ax(t1.get$keys(t1), B.utils0__isPublic$closure());
+    },
+    containsKey$1: function(key) {
+      return typeof key == "string" && B.isPublic0(key) && this._public_member_map_view$_inner.containsKey$1(key);
+    },
+    $index: function(_, key) {
+      if (typeof key == "string" && B.isPublic0(key))
+        return this._public_member_map_view$_inner.$index(0, key);
+      return null;
+    }
+  };
+  D.QualifiedName0.prototype = {
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof D.QualifiedName0 && other.name === this.name && other.namespace == this.namespace;
+    },
+    get$hashCode: function(_) {
+      return C.JSString_methods.get$hashCode(this.name) ^ J.get$hashCode$(this.namespace);
+    },
+    toString$0: function(_) {
+      var t1 = this.namespace,
+        t2 = this.name;
+      return t1 == null ? t2 : t1 + "|" + t2;
+    }
+  };
+  Z.RenderContext.prototype = {};
+  L.RenderContextOptions.prototype = {};
+  R.RenderOptions.prototype = {};
+  U.RenderResult.prototype = {};
+  U.RenderResultStats.prototype = {};
+  E.ImporterResult0.prototype = {
+    get$sourceMapUrl: function() {
+      return this._result$_sourceMapUrl;
+    }
+  };
+  B.ReturnRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitReturnRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@return " + H.S(this.expression) + ";";
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  U.main_printError.prototype = {
+    call$2: function(error, stackTrace) {
+      var t1 = this._box_0;
+      if (t1.printedError)
+        $.$get$stderr().writeln$0();
+      t1.printedError = true;
+      t1 = $.$get$stderr();
+      t1.writeln$1(error);
+      if (stackTrace != null) {
+        t1.writeln$0();
+        t1.writeln$1(C.JSString_methods.trimRight$0(Y.Trace_Trace$from(stackTrace).get$terse().toString$0(0)));
+      }
+    },
+    $signature: 421
+  };
+  U.main_closure.prototype = {
+    call$0: function() {
+      var t1, exception;
+      try {
+        t1 = this.destination;
+        if (t1 != null && !this._box_0.options.get$emitErrorCss())
+          B.deleteFile(t1);
+      } catch (exception) {
+        if (!(H.unwrapException(exception) instanceof B.FileSystemException))
+          throw exception;
+      }
+    },
+    $signature: 0
+  };
+  U.SassParser0.prototype = {
+    get$currentIndentation: function() {
+      return this._sass0$_currentIndentation;
+    },
+    get$indented: function() {
+      return true;
+    },
+    styleRuleSelector$0: function() {
+      var t4,
+        t1 = this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        buffer = new Z.InterpolationBuffer0(t3, []);
+      do {
+        buffer.addInterpolation$1(this.almostAnyValue$1$omitComments(true));
+        t4 = t3._contents += H.Primitives_stringFromCharCode(10);
+      } while (C.JSString_methods.endsWith$1(C.JSString_methods.trimRight$0(t4.charCodeAt(0) == 0 ? t4 : t4), ",") && this.scanCharIf$1(T.character0__isNewline$closure()));
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    expectStatementSeparator$1: function($name) {
+      var _this = this;
+      if (!_this.atEndOfStatement$0())
+        _this._sass0$_expectNewline$0();
+      if (_this._sass0$_peekIndentation$0() <= _this._sass0$_currentIndentation)
+        return;
+      _this.scanner.error$2$position(0, "Nothing may be indented " + ($name == null ? "here" : "beneath a " + $name) + ".", _this._sass0$_nextIndentationEnd.position);
+    },
+    expectStatementSeparator$0: function() {
+      return this.expectStatementSeparator$1(null);
+    },
+    atEndOfStatement$0: function() {
+      var next = this.scanner.peekChar$0();
+      return next == null || T.isNewline0(next);
+    },
+    lookingAtChildren$0: function() {
+      return this.atEndOfStatement$0() && this._sass0$_peekIndentation$0() > this._sass0$_currentIndentation;
+    },
+    importArgument$0: function() {
+      var url, span, innerError, start, next, t2, exception, _this = this,
+        t1 = _this.scanner;
+      switch (t1.peekChar$0()) {
+        case 117:
+        case 85:
+          start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+          if (_this.scanIdentifier$1("url"))
+            if (t1.scanChar$1(40)) {
+              t1.set$state(start);
+              return _this.super$StylesheetParser$importArgument0();
+            } else
+              t1.set$state(start);
+          break;
+        case 39:
+        case 34:
+          return _this.super$StylesheetParser$importArgument0();
+      }
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      next = t1.peekChar$0();
+      while (true) {
+        if (next != null)
+          if (next !== 44)
+            if (next !== 59)
+              t2 = !(next === 10 || next === 13 || next === 12);
+            else
+              t2 = false;
+          else
+            t2 = false;
+        else
+          t2 = false;
+        if (!t2)
+          break;
+        t1.readChar$0();
+        next = t1.peekChar$0();
+      }
+      url = t1.substring$1(0, start.position);
+      span = t1.spanFrom$1(start);
+      if (_this.isPlainImportUrl$1(url))
+        return new Q.StaticImport0(X.Interpolation$0(H.setRuntimeTypeInfo([N.serializeValue(new D.SassString0(url, true), true, true)], type$.JSArray_legacy_Object), span), null, null, span);
+      else
+        try {
+          t1 = _this.parseImportUrl$1(url);
+          return new B.DynamicImport0(t1, span);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (type$.legacy_FormatException._is(t1)) {
+            innerError = t1;
+            _this.error$2(0, "Invalid URL: " + H.S(J.get$message$x(innerError)), span);
+          } else
+            throw exception;
+        }
+    },
+    scanElse$1: function(ifIndentation) {
+      var t1, t2, startIndentation, startNextIndentation, startNextIndentationEnd, _this = this;
+      if (_this._sass0$_peekIndentation$0() != ifIndentation)
+        return false;
+      t1 = _this.scanner;
+      t2 = t1._string_scanner$_position;
+      startIndentation = _this._sass0$_currentIndentation;
+      startNextIndentation = _this._sass0$_nextIndentation;
+      startNextIndentationEnd = _this._sass0$_nextIndentationEnd;
+      _this._sass0$_readIndentation$0();
+      if (t1.scanChar$1(64) && _this.scanIdentifier$1("else"))
+        return true;
+      t1.set$state(new S._SpanScannerState(t1, t2));
+      _this._sass0$_currentIndentation = startIndentation;
+      _this._sass0$_nextIndentation = startNextIndentation;
+      _this._sass0$_nextIndentationEnd = startNextIndentationEnd;
+      return false;
+    },
+    children$1: function(_, child) {
+      var children = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Statement_2);
+      this._sass0$_whileIndentedLower$1(new U.SassParser_children_closure0(this, children, child));
+      return children;
+    },
+    statements$1: function(statement) {
+      var statements, t2, child,
+        t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first === 9 || first === 32)
+        t1.error$3$length$position(0, string$.Indent, t1._string_scanner$_position, 0);
+      statements = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Statement_2);
+      for (t2 = t1.string.length; t1._string_scanner$_position !== t2;) {
+        child = this._sass0$_child$1(statement);
+        if (child != null)
+          statements.push(child);
+        this._sass0$_readIndentation$0();
+      }
+      return statements;
+    },
+    _sass0$_child$1: function(child) {
+      var _this = this,
+        t1 = _this.scanner;
+      switch (t1.peekChar$0()) {
+        case 13:
+        case 10:
+        case 12:
+          return null;
+        case 36:
+          return _this.variableDeclarationWithoutNamespace$0();
+        case 47:
+          switch (t1.peekChar$1(1)) {
+            case 47:
+              return _this._sass0$_silentComment$0();
+            case 42:
+              return _this._sass0$_loudComment$0();
+            default:
+              return child.call$0();
+          }
+        default:
+          return child.call$0();
+      }
+    },
+    _sass0$_silentComment$0: function() {
+      var buffer, parentIndentation, t3, commentPrefix, i, t4, i0, t5, t6, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expect$1("//");
+      buffer = new P.StringBuffer("");
+      parentIndentation = _this._sass0$_currentIndentation;
+      t3 = t1.string;
+      $label0$0:
+        do {
+          commentPrefix = t1.scanChar$1(47) ? "///" : "//";
+          for (i = commentPrefix.length; true;) {
+            t4 = buffer._contents += commentPrefix;
+            for (i0 = i; i0 < _this._sass0$_currentIndentation - parentIndentation; ++i0) {
+              t4 += H.Primitives_stringFromCharCode(32);
+              buffer._contents = t4;
+            }
+            t5 = t3.length;
+            while (true) {
+              if (t1._string_scanner$_position !== t5) {
+                t6 = t1.peekChar$0();
+                t6 = !(t6 === 10 || t6 === 13 || t6 === 12);
+              } else
+                t6 = false;
+              if (!t6)
+                break;
+              t4 += H.Primitives_stringFromCharCode(t1.readChar$0());
+              buffer._contents = t4;
+            }
+            buffer._contents = t4 + "\n";
+            if (_this._sass0$_peekIndentation$0() < parentIndentation)
+              break $label0$0;
+            if (_this._sass0$_peekIndentation$0() === parentIndentation) {
+              if (t1.peekChar$1(1 + parentIndentation) === 47 && t1.peekChar$1(2 + parentIndentation) === 47)
+                _this._sass0$_readIndentation$0();
+              break;
+            }
+            _this._sass0$_readIndentation$0();
+          }
+        } while (t1.scan$1("//"));
+      t3 = buffer._contents;
+      return _this.lastSilentComment = new B.SilentComment0(t3.charCodeAt(0) == 0 ? t3 : t3, t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _sass0$_loudComment$0: function() {
+      var t3, t4, buffer, parentIndentation, t5, first, beginningOfComment, t6, end, i, t7, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expect$1("/*");
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer0(t3, t4);
+      t3._contents = "/*";
+      parentIndentation = _this._sass0$_currentIndentation;
+      for (t5 = t1.string, first = true; true; first = false) {
+        if (first) {
+          beginningOfComment = t1._string_scanner$_position;
+          _this.spaces$0();
+          t6 = t1.peekChar$0();
+          if (t6 === 10 || t6 === 13 || t6 === 12) {
+            _this._sass0$_readIndentation$0();
+            t3._contents += H.Primitives_stringFromCharCode(32);
+          } else {
+            end = t1._string_scanner$_position;
+            t3._contents += J.substring$2$s(t5, beginningOfComment, end);
+          }
+        } else {
+          t6 = t3._contents += "\n";
+          t3._contents = t6 + " * ";
+        }
+        for (i = 3; i < _this._sass0$_currentIndentation - parentIndentation; ++i)
+          t3._contents += H.Primitives_stringFromCharCode(32);
+        $label0$1:
+          for (t6 = t5.length; t1._string_scanner$_position !== t6;)
+            switch (t1.peekChar$0()) {
+              case 10:
+              case 13:
+              case 12:
+                break $label0$1;
+              case 35:
+                if (t1.peekChar$1(1) === 123) {
+                  t7 = _this.singleInterpolation$0();
+                  buffer._interpolation_buffer0$_flushText$0();
+                  t4.push(t7);
+                } else
+                  t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+                break;
+              default:
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+                break;
+            }
+        if (_this._sass0$_peekIndentation$0() <= parentIndentation)
+          break;
+        for (; _this._sass0$_lookingAtDoubleNewline$0();) {
+          _this._sass0$_expectNewline$0();
+          t6 = t3._contents += "\n";
+          t3._contents = t6 + " *";
+        }
+        _this._sass0$_readIndentation$0();
+      }
+      t4 = t3._contents;
+      if (!C.JSString_methods.endsWith$1(C.JSString_methods.trimRight$0(t4.charCodeAt(0) == 0 ? t4 : t4), "*/"))
+        t3._contents += " */";
+      return new L.LoudComment0(buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2))));
+    },
+    whitespaceWithoutComments$0: function() {
+      var t1, t2, next;
+      for (t1 = this.scanner, t2 = t1.string.length; t1._string_scanner$_position !== t2;) {
+        next = t1.peekChar$0();
+        if (next !== 9 && next !== 32)
+          break;
+        t1.readChar$0();
+      }
+    },
+    loudComment$0: function() {
+      var next,
+        t1 = this.scanner;
+      t1.expect$1("/*");
+      for (; true;) {
+        next = t1.readChar$0();
+        if (next === 10 || next === 13 || next === 12)
+          t1.error$1(0, "expected */.");
+        if (next !== 42)
+          continue;
+        do
+          next = t1.readChar$0();
+        while (next === 42);
+        if (next === 47)
+          break;
+      }
+    },
+    _sass0$_expectNewline$0: function() {
+      var t1 = this.scanner;
+      switch (t1.peekChar$0()) {
+        case 59:
+          t1.error$1(0, string$.semico);
+          break;
+        case 13:
+          t1.readChar$0();
+          if (t1.peekChar$0() === 10)
+            t1.readChar$0();
+          return;
+        case 10:
+        case 12:
+          t1.readChar$0();
+          return;
+        default:
+          t1.error$1(0, "expected newline.");
+      }
+    },
+    _sass0$_lookingAtDoubleNewline$0: function() {
+      var nextChar,
+        t1 = this.scanner;
+      switch (t1.peekChar$0()) {
+        case 13:
+          nextChar = t1.peekChar$1(1);
+          if (nextChar === 10)
+            return T.isNewline0(t1.peekChar$1(2));
+          return nextChar === 13 || nextChar === 12;
+        case 10:
+        case 12:
+          return T.isNewline0(t1.peekChar$1(1));
+        default:
+          return false;
+      }
+    },
+    _sass0$_whileIndentedLower$1: function(body) {
+      var t1, t2, childIndentation, indentation, t3, t4, t5, _this = this,
+        parentIndentation = _this._sass0$_currentIndentation;
+      for (t1 = _this.scanner, t2 = t1._sourceFile, childIndentation = null; _this._sass0$_peekIndentation$0() > parentIndentation;) {
+        indentation = _this._sass0$_readIndentation$0();
+        if (childIndentation == null)
+          childIndentation = indentation;
+        if (childIndentation != indentation) {
+          t3 = "Inconsistent indentation, expected " + H.S(childIndentation) + " spaces.";
+          t4 = t1._string_scanner$_position;
+          t5 = t2.getColumn$1(t4);
+          t1.error$3$length$position(0, t3, t2.getColumn$1(t1._string_scanner$_position), t4 - t5);
+        }
+        body.call$0();
+      }
+    },
+    _sass0$_readIndentation$0: function() {
+      var _this = this;
+      if (_this._sass0$_nextIndentation == null)
+        _this._sass0$_peekIndentation$0();
+      _this._sass0$_currentIndentation = _this._sass0$_nextIndentation;
+      _this.scanner.set$state(_this._sass0$_nextIndentationEnd);
+      _this._sass0$_nextIndentationEnd = _this._sass0$_nextIndentation = null;
+      return _this._sass0$_currentIndentation;
+    },
+    _sass0$_peekIndentation$0: function() {
+      var t2, t3, start, containsTab, containsSpace, next, t4, _this = this,
+        t1 = _this._sass0$_nextIndentation;
+      if (t1 != null)
+        return t1;
+      t1 = _this.scanner;
+      t2 = t1._string_scanner$_position;
+      t3 = t1.string.length;
+      if (t2 === t3) {
+        _this._sass0$_nextIndentation = 0;
+        _this._sass0$_nextIndentationEnd = new S._SpanScannerState(t1, t2);
+        return 0;
+      }
+      start = new S._SpanScannerState(t1, t2);
+      if (!_this.scanCharIf$1(T.character0__isNewline$closure()))
+        t1.error$2$position(0, "Expected newline.", t1._string_scanner$_position);
+      do {
+        _this._sass0$_nextIndentation = 0;
+        for (containsTab = false, containsSpace = false; true;) {
+          next = t1.peekChar$0();
+          if (next === 32)
+            containsSpace = true;
+          else {
+            if (next !== 9)
+              break;
+            containsTab = true;
+          }
+          _this._sass0$_nextIndentation = _this._sass0$_nextIndentation + 1;
+          t1.readChar$0();
+        }
+        t2 = t1._string_scanner$_position;
+        if (t2 === t3) {
+          _this._sass0$_nextIndentation = 0;
+          _this._sass0$_nextIndentationEnd = new S._SpanScannerState(t1, t2);
+          t1.set$state(start);
+          return 0;
+        }
+      } while (_this.scanCharIf$1(T.character0__isNewline$closure()));
+      if (containsTab) {
+        if (containsSpace) {
+          t2 = t1._string_scanner$_position;
+          t3 = t1._sourceFile;
+          t4 = t3.getColumn$1(t2);
+          t1.error$3$length$position(0, "Tabs and spaces may not be mixed.", t3.getColumn$1(t1._string_scanner$_position), t2 - t4);
+        } else if (_this._sass0$_spaces === true) {
+          t2 = t1._string_scanner$_position;
+          t3 = t1._sourceFile;
+          t4 = t3.getColumn$1(t2);
+          t1.error$3$length$position(0, "Expected spaces, was tabs.", t3.getColumn$1(t1._string_scanner$_position), t2 - t4);
+        }
+      } else if (containsSpace && _this._sass0$_spaces === false) {
+        t2 = t1._string_scanner$_position;
+        t3 = t1._sourceFile;
+        t4 = t3.getColumn$1(t2);
+        t1.error$3$length$position(0, "Expected tabs, was spaces.", t3.getColumn$1(t1._string_scanner$_position), t2 - t4);
+      }
+      if (_this._sass0$_nextIndentation > 0)
+        if (_this._sass0$_spaces == null)
+          _this._sass0$_spaces = containsSpace;
+      _this._sass0$_nextIndentationEnd = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.set$state(start);
+      return _this._sass0$_nextIndentation;
+    }
+  };
+  U.SassParser_children_closure0.prototype = {
+    call$0: function() {
+      this.children.push(this.$this._sass0$_child$1(this.child));
+    },
+    $signature: 0
+  };
+  R._Exports.prototype = {};
+  R._wrapMain_closure.prototype = {
+    call$1: function(_) {
+      return R._translateReturnValue(this.main.call$0());
+    },
+    $signature: 206
+  };
+  R._wrapMain_closure0.prototype = {
+    call$1: function(args) {
+      return R._translateReturnValue(this.main.call$1(P.List_List$from(type$.legacy_List_legacy_Object._as(args), true, type$.legacy_String)));
+    },
+    $signature: 206
+  };
+  L.ScssParser0.prototype = {
+    get$indented: function() {
+      return false;
+    },
+    get$currentIndentation: function() {
+      return null;
+    },
+    styleRuleSelector$0: function() {
+      return this.almostAnyValue$0();
+    },
+    expectStatementSeparator$1: function($name) {
+      var t1, next;
+      this.whitespaceWithoutComments$0();
+      t1 = this.scanner;
+      if (t1._string_scanner$_position === t1.string.length)
+        return;
+      next = t1.peekChar$0();
+      if (next === 59 || next === 125)
+        return;
+      t1.expectChar$1(59);
+    },
+    expectStatementSeparator$0: function() {
+      return this.expectStatementSeparator$1(null);
+    },
+    atEndOfStatement$0: function() {
+      var next = this.scanner.peekChar$0();
+      return next == null || next === 59 || next === 125 || next === 123;
+    },
+    lookingAtChildren$0: function() {
+      return this.scanner.peekChar$0() === 123;
+    },
+    scanElse$1: function(_) {
+      var t3, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      _this.whitespace$0();
+      t3 = t1._string_scanner$_position;
+      if (t1.scanChar$1(64)) {
+        if (_this.scanIdentifier$2$caseSensitive("else", true))
+          return true;
+        if (_this.scanIdentifier$2$caseSensitive("elseif", true)) {
+          _this.logger.warn$3$deprecation$span(0, string$.x40elsei, true, t1.spanFrom$1(new S._SpanScannerState(t1, t3)));
+          t1.set$position(t1._string_scanner$_position - 2);
+          return true;
+        }
+      }
+      t1.set$state(new S._SpanScannerState(t1, t2));
+      return false;
+    },
+    children$1: function(_, child) {
+      var children, _this = this,
+        t1 = _this.scanner;
+      t1.expectChar$1(123);
+      _this.whitespaceWithoutComments$0();
+      children = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Statement_2);
+      for (; true;)
+        switch (t1.peekChar$0()) {
+          case 36:
+            children.push(_this.variableDeclarationWithoutNamespace$0());
+            break;
+          case 47:
+            switch (t1.peekChar$1(1)) {
+              case 47:
+                children.push(_this._scss0$_silentComment$0());
+                _this.whitespaceWithoutComments$0();
+                break;
+              case 42:
+                children.push(_this._scss0$_loudComment$0());
+                _this.whitespaceWithoutComments$0();
+                break;
+              default:
+                children.push(child.call$0());
+                break;
+            }
+            break;
+          case 59:
+            t1.readChar$0();
+            _this.whitespaceWithoutComments$0();
+            break;
+          case 125:
+            t1.expectChar$1(125);
+            return children;
+          default:
+            children.push(child.call$0());
+            break;
+        }
+    },
+    statements$1: function(statement) {
+      var t1, t2, child, _this = this,
+        statements = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Statement_2);
+      _this.whitespaceWithoutComments$0();
+      for (t1 = _this.scanner, t2 = t1.string.length; t1._string_scanner$_position !== t2;)
+        switch (t1.peekChar$0()) {
+          case 36:
+            statements.push(_this.variableDeclarationWithoutNamespace$0());
+            break;
+          case 47:
+            switch (t1.peekChar$1(1)) {
+              case 47:
+                statements.push(_this._scss0$_silentComment$0());
+                _this.whitespaceWithoutComments$0();
+                break;
+              case 42:
+                statements.push(_this._scss0$_loudComment$0());
+                _this.whitespaceWithoutComments$0();
+                break;
+              default:
+                child = statement.call$0();
+                if (child != null)
+                  statements.push(child);
+                break;
+            }
+            break;
+          case 59:
+            t1.readChar$0();
+            _this.whitespaceWithoutComments$0();
+            break;
+          default:
+            child = statement.call$0();
+            if (child != null)
+              statements.push(child);
+            break;
+        }
+      return statements;
+    },
+    _scss0$_silentComment$0: function() {
+      var t2, t3, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expect$1("//");
+      t2 = t1.string.length;
+      do {
+        while (true) {
+          if (t1._string_scanner$_position !== t2) {
+            t3 = t1.readChar$0();
+            t3 = !(t3 === 10 || t3 === 13 || t3 === 12);
+          } else
+            t3 = false;
+          if (!t3)
+            break;
+        }
+        if (t1._string_scanner$_position === t2)
+          break;
+        _this.whitespaceWithoutComments$0();
+      } while (t1.scan$1("//"));
+      if (_this.get$plainCss())
+        _this.error$2(0, string$.Silent, t1.spanFrom$1(start));
+      return _this.lastSilentComment = new B.SilentComment0(t1.substring$1(0, start.position), t1.spanFrom$1(start));
+    },
+    _scss0$_loudComment$0: function() {
+      var t3, t4, buffer, t5, endPosition,
+        t1 = this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expect$1("/*");
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer0(t3, t4);
+      t3._contents = "/*";
+      for (; true;)
+        switch (t1.peekChar$0()) {
+          case 35:
+            if (t1.peekChar$1(1) === 123) {
+              t5 = this.singleInterpolation$0();
+              buffer._interpolation_buffer0$_flushText$0();
+              t4.push(t5);
+            } else
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            break;
+          case 42:
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            if (t1.peekChar$0() !== 47)
+              break;
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            endPosition = t1._string_scanner$_position;
+            t3 = t1._sourceFile;
+            t4 = new S._SpanScannerState(t1, t2).position;
+            t1 = new Y._FileSpan(t3, t4, endPosition);
+            t1._FileSpan$3(t3, t4, endPosition);
+            return new L.LoudComment0(buffer.interpolation$1(t1));
+          case 13:
+            t1.readChar$0();
+            if (t1.peekChar$0() !== 10)
+              t3._contents += H.Primitives_stringFromCharCode(10);
+            break;
+          case 12:
+            t1.readChar$0();
+            t3._contents += H.Primitives_stringFromCharCode(10);
+            break;
+          default:
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            break;
+        }
+    }
+  };
+  T.Selector0.prototype = {
+    get$isInvisible: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      var visitor = N._SerializeVisitor$(null, true, null, true, false, null, true);
+      this.accept$1(visitor);
+      return visitor._buffer.toString$0(0);
+    }
+  };
+  T.SelectorExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitSelectorExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "&";
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  T.closure128.prototype = {
+    call$1: function($arguments) {
+      var t1 = {},
+        selectors = J.$index$asx($arguments, 0).get$asList();
+      if (selectors.length === 0)
+        throw H.wrapException(E.SassScriptException$0(string$.x24selec));
+      t1.first = true;
+      return new H.MappedListIterable(selectors, new T._closure16(t1), H._arrayInstanceType(selectors)._eval$1("MappedListIterable<1,SelectorList0*>")).reduce$1(0, new T._closure17()).get$asSassList();
+    },
+    $signature: 27
+  };
+  T._closure16.prototype = {
+    call$1: function(selector) {
+      var t1 = this._box_0,
+        result = selector.assertSelector$1$allowParent(!t1.first);
+      t1.first = false;
+      return result;
+    },
+    $signature: 204
+  };
+  T._closure17.prototype = {
+    call$2: function($parent, child) {
+      return child.resolveParentSelectors$1($parent);
+    },
+    $signature: 203
+  };
+  T.closure127.prototype = {
+    call$1: function($arguments) {
+      var selectors = J.$index$asx($arguments, 0).get$asList();
+      if (selectors.length === 0)
+        throw H.wrapException(E.SassScriptException$0(string$.x24selec));
+      return new H.MappedListIterable(selectors, new T._closure14(), H._arrayInstanceType(selectors)._eval$1("MappedListIterable<1,SelectorList0*>")).reduce$1(0, new T._closure15()).get$asSassList();
+    },
+    $signature: 27
+  };
+  T._closure14.prototype = {
+    call$1: function(selector) {
+      return selector.assertSelector$0();
+    },
+    $signature: 204
+  };
+  T._closure15.prototype = {
+    call$2: function($parent, child) {
+      var t1 = child.components;
+      return D.SelectorList$0(new H.MappedListIterable(t1, new T.__closure0($parent), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,ComplexSelector0*>"))).resolveParentSelectors$1($parent);
+    },
+    $signature: 203
+  };
+  T.__closure0.prototype = {
+    call$1: function(complex) {
+      var newCompound, t2, cur,
+        t1 = complex.components,
+        compound = C.JSArray_methods.get$first(t1);
+      if (compound instanceof X.CompoundSelector0) {
+        newCompound = T._prependParent0(compound);
+        if (newCompound == null)
+          throw H.wrapException(E.SassScriptException$0("Can't append " + complex.toString$0(0) + " to " + H.S(this.parent) + "."));
+        t2 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent_2);
+        t2.push(newCompound);
+        for (t1 = H.SubListIterable$(t1, 1, null, H._arrayInstanceType(t1)._precomputed1), t1 = new H.ListIterator(t1, t1.get$length(t1)); t1.moveNext$0();) {
+          cur = t1.__internal$_current;
+          t2.push(cur);
+        }
+        return S.ComplexSelector$0(t2, false);
+      } else
+        throw H.wrapException(E.SassScriptException$0("Can't append " + complex.toString$0(0) + " to " + H.S(this.parent) + "."));
+    },
+    $signature: 99
+  };
+  T.closure126.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        selector = t1.$index($arguments, 0).assertSelector$1$name("selector"),
+        target = t1.$index($arguments, 1).assertSelector$1$name("extendee");
+      return F.Extender__extendOrReplace0(selector, t1.$index($arguments, 2).assertSelector$1$name("extender"), target, C.ExtendMode_allTargets0).get$asSassList();
+    },
+    $signature: 27
+  };
+  T.closure125.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        selector = t1.$index($arguments, 0).assertSelector$1$name("selector"),
+        target = t1.$index($arguments, 1).assertSelector$1$name("original");
+      return F.Extender__extendOrReplace0(selector, t1.$index($arguments, 2).assertSelector$1$name("replacement"), target, C.ExtendMode_replace0).get$asSassList();
+    },
+    $signature: 27
+  };
+  T.closure124.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        result = t1.$index($arguments, 0).assertSelector$1$name("selector1").unify$1(t1.$index($arguments, 1).assertSelector$1$name("selector2"));
+      return result == null ? C.C_SassNull : result.get$asSassList();
+    },
+    $signature: 3
+  };
+  T.closure131.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.getInterceptor$asx($arguments),
+        selector1 = t1.$index($arguments, 0).assertSelector$1$name("super"),
+        selector2 = t1.$index($arguments, 1).assertSelector$1$name("sub");
+      return Y.listIsSuperselector0(selector1.components, selector2.components) ? C.SassBoolean_true : C.SassBoolean_false;
+    },
+    $signature: 20
+  };
+  T.closure130.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).assertCompoundSelector$1$name("selector").components;
+      return D.SassList$0(new H.MappedListIterable(t1, new T._closure18(), H._arrayInstanceType(t1)._eval$1("MappedListIterable<1,Value0*>")), C.ListSeparator_comma0, false);
+    },
+    $signature: 27
+  };
+  T._closure18.prototype = {
+    call$1: function(simple) {
+      return new D.SassString0(J.toString$0$(simple), false);
+    },
+    $signature: 425
+  };
+  T.closure129.prototype = {
+    call$1: function($arguments) {
+      return J.$index$asx($arguments, 0).assertSelector$1$name("selector").get$asSassList();
+    },
+    $signature: 27
+  };
+  T.SelectorParser0.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new T.SelectorParser_parse_closure0(this));
+    },
+    parseCompoundSelector$0: function() {
+      return this.wrapSpanFormatException$1(new T.SelectorParser_parseCompoundSelector_closure0(this));
+    },
+    _selector$_selectorList$0: function() {
+      var t3, t4, lineBreak, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._sourceFile,
+        previousLine = t2.getLine$1(t1._string_scanner$_position),
+        components = H.setRuntimeTypeInfo([_this._selector$_complexSelector$0()], type$.JSArray_legacy_ComplexSelector_2);
+      _this.whitespace$0();
+      for (t3 = t1.string; t1.scanChar$1(44);) {
+        _this.whitespace$0();
+        if (t1.peekChar$0() === 44)
+          continue;
+        t4 = t1._string_scanner$_position;
+        if (t4 === t3.length)
+          break;
+        lineBreak = t2.getLine$1(t4) != previousLine;
+        if (lineBreak)
+          previousLine = t2.getLine$1(t1._string_scanner$_position);
+        components.push(_this._selector$_complexSelector$1$lineBreak(lineBreak));
+      }
+      return D.SelectorList$0(components);
+    },
+    _selector$_complexSelector$1$lineBreak: function(lineBreak) {
+      var t1, next, _this = this,
+        _s58_ = string$.x22x26__ma,
+        components = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ComplexSelectorComponent_2);
+      $label0$1:
+        for (t1 = _this.scanner; true;) {
+          _this.whitespace$0();
+          next = t1.peekChar$0();
+          switch (next) {
+            case 43:
+              t1.readChar$0();
+              components.push(C.Combinator_uzg0);
+              break;
+            case 62:
+              t1.readChar$0();
+              components.push(C.Combinator_sgq0);
+              break;
+            case 126:
+              t1.readChar$0();
+              components.push(C.Combinator_CzM0);
+              break;
+            case 91:
+            case 46:
+            case 35:
+            case 37:
+            case 58:
+            case 38:
+            case 42:
+            case 124:
+              components.push(_this._selector$_compoundSelector$0());
+              if (t1.peekChar$0() === 38)
+                t1.error$1(0, _s58_);
+              break;
+            default:
+              if (next == null || !_this.lookingAtIdentifier$0())
+                break $label0$1;
+              components.push(_this._selector$_compoundSelector$0());
+              if (t1.peekChar$0() === 38)
+                t1.error$1(0, _s58_);
+              break;
+          }
+        }
+      if (components.length === 0)
+        t1.error$1(0, "expected selector.");
+      return S.ComplexSelector$0(components, lineBreak);
+    },
+    _selector$_complexSelector$0: function() {
+      return this._selector$_complexSelector$1$lineBreak(false);
+    },
+    _selector$_compoundSelector$0: function() {
+      var t2,
+        components = H.setRuntimeTypeInfo([this._selector$_simpleSelector$0()], type$.JSArray_legacy_SimpleSelector_2),
+        t1 = this.scanner;
+      while (true) {
+        t2 = t1.peekChar$0();
+        if (!(t2 === 42 || t2 === 91 || t2 === 46 || t2 === 35 || t2 === 37 || t2 === 58))
+          break;
+        components.push(this._selector$_simpleSelector$1$allowParent(false));
+      }
+      return X.CompoundSelector$0(components);
+    },
+    _selector$_simpleSelector$1$allowParent: function(allowParent) {
+      var $name, text, t2, suffix, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      if (allowParent == null)
+        allowParent = _this._selector$_allowParent;
+      switch (t1.peekChar$0()) {
+        case 91:
+          return _this._selector$_attributeSelector$0();
+        case 46:
+          t1.expectChar$1(46);
+          return new X.ClassSelector0(_this.identifier$0());
+        case 35:
+          t1.expectChar$1(35);
+          return new N.IDSelector0(_this.identifier$0());
+        case 37:
+          t1.expectChar$1(37);
+          $name = _this.identifier$0();
+          if (!_this._selector$_allowPlaceholder)
+            _this.error$2(0, string$.Placeh, t1.spanFrom$1(start));
+          return new N.PlaceholderSelector0($name);
+        case 58:
+          return _this._selector$_pseudoSelector$0();
+        case 38:
+          t1.expectChar$1(38);
+          if (_this.lookingAtIdentifierBody$0()) {
+            text = new P.StringBuffer("");
+            _this._parser$_identifierBody$1(text);
+            if (text._contents.length === 0)
+              t1.error$1(0, "Expected identifier body.");
+            t2 = text._contents;
+            suffix = t2.charCodeAt(0) == 0 ? t2 : t2;
+          } else
+            suffix = null;
+          if (!allowParent)
+            _this.error$2(0, "Parent selectors aren't allowed here.", t1.spanFrom$1(start));
+          return new M.ParentSelector0(suffix);
+        default:
+          return _this._selector$_typeOrUniversalSelector$0();
+      }
+    },
+    _selector$_simpleSelector$0: function() {
+      return this._selector$_simpleSelector$1$allowParent(null);
+    },
+    _selector$_attributeSelector$0: function() {
+      var $name, operator, next, value, modifier, _this = this, _null = null,
+        t1 = _this.scanner;
+      t1.expectChar$1(91);
+      _this.whitespace$0();
+      $name = _this._selector$_attributeName$0();
+      _this.whitespace$0();
+      if (t1.scanChar$1(93))
+        return new N.AttributeSelector0($name, _null, _null, _null);
+      operator = _this._selector$_attributeOperator$0();
+      _this.whitespace$0();
+      next = t1.peekChar$0();
+      value = next === 39 || next === 34 ? _this.string$0() : _this.identifier$0();
+      _this.whitespace$0();
+      modifier = T.isAlphabetic1(t1.peekChar$0()) ? H.Primitives_stringFromCharCode(t1.readChar$0()) : _null;
+      t1.expectChar$1(93);
+      return new N.AttributeSelector0($name, operator, value, modifier);
+    },
+    _selector$_attributeName$0: function() {
+      var nameOrNamespace, _this = this,
+        t1 = _this.scanner;
+      if (t1.scanChar$1(42)) {
+        t1.expectChar$1(124);
+        return new D.QualifiedName0(_this.identifier$0(), "*");
+      }
+      nameOrNamespace = _this.identifier$0();
+      if (t1.peekChar$0() !== 124 || t1.peekChar$1(1) === 61)
+        return new D.QualifiedName0(nameOrNamespace, null);
+      t1.readChar$0();
+      return new D.QualifiedName0(_this.identifier$0(), nameOrNamespace);
+    },
+    _selector$_attributeOperator$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position;
+      switch (t1.readChar$0()) {
+        case 61:
+          return C.AttributeOperator_sEs0;
+        case 126:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_fz10;
+        case 124:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_AuK0;
+        case 94:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_4L50;
+        case 36:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_mOX0;
+        case 42:
+          t1.expectChar$1(61);
+          return C.AttributeOperator_gqZ0;
+        default:
+          t1.error$2$position(0, 'Expected "]".', t2);
+      }
+    },
+    _selector$_pseudoSelector$0: function() {
+      var element, $name, unvendored, selector, argument, t2, _this = this, _null = null,
+        t1 = _this.scanner;
+      t1.expectChar$1(58);
+      element = t1.scanChar$1(58);
+      $name = _this.identifier$0();
+      if (!t1.scanChar$1(40))
+        return D.PseudoSelector$0($name, _null, element, _null);
+      _this.whitespace$0();
+      unvendored = B.unvendor0($name);
+      if (element)
+        if ($._selectorPseudoElements0.contains$1(0, unvendored)) {
+          selector = _this._selector$_selectorList$0();
+          argument = _null;
+        } else {
+          argument = _this.declarationValue$1$allowEmpty(true);
+          selector = _null;
+        }
+      else if ($._selectorPseudoClasses0.contains$1(0, unvendored)) {
+        selector = _this._selector$_selectorList$0();
+        argument = _null;
+      } else if (unvendored === "nth-child" || unvendored === "nth-last-child") {
+        argument = _this._selector$_aNPlusB$0();
+        _this.whitespace$0();
+        t2 = t1.peekChar$1(-1);
+        if ((t2 === 32 || t2 === 9 || T.isNewline0(t2)) && t1.peekChar$0() !== 41) {
+          _this.expectIdentifier$1("of");
+          argument += " of";
+          _this.whitespace$0();
+          selector = _this._selector$_selectorList$0();
+        } else
+          selector = _null;
+      } else {
+        argument = C.JSString_methods.trimRight$0(_this.declarationValue$1$allowEmpty(true));
+        selector = _null;
+      }
+      t1.expectChar$1(41);
+      return D.PseudoSelector$0($name, argument, element, selector);
+    },
+    _selector$_aNPlusB$0: function() {
+      var t2, first, t3, next, last, _this = this,
+        t1 = _this.scanner;
+      switch (t1.peekChar$0()) {
+        case 101:
+        case 69:
+          _this.expectIdentifier$1("even");
+          return "even";
+        case 111:
+        case 79:
+          _this.expectIdentifier$1("odd");
+          return "odd";
+        case 43:
+        case 45:
+          t2 = H.Primitives_stringFromCharCode(t1.readChar$0());
+          break;
+        default:
+          t2 = "";
+      }
+      first = t1.peekChar$0();
+      if (first != null && T.isDigit0(first)) {
+        while (true) {
+          t3 = t1.peekChar$0();
+          if (!(t3 != null && t3 >= 48 && t3 <= 57))
+            break;
+          t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+        }
+        _this.whitespace$0();
+        if (!_this.scanIdentChar$1(110))
+          return t2.charCodeAt(0) == 0 ? t2 : t2;
+      } else
+        _this.expectIdentChar$1(110);
+      t2 += H.Primitives_stringFromCharCode(110);
+      _this.whitespace$0();
+      next = t1.peekChar$0();
+      if (next !== 43 && next !== 45)
+        return t2.charCodeAt(0) == 0 ? t2 : t2;
+      t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+      _this.whitespace$0();
+      last = t1.peekChar$0();
+      if (last == null || !T.isDigit0(last))
+        t1.error$1(0, "Expected a number.");
+      while (true) {
+        t3 = t1.peekChar$0();
+        if (!(t3 != null && t3 >= 48 && t3 <= 57))
+          break;
+        t2 += H.Primitives_stringFromCharCode(t1.readChar$0());
+      }
+      return t2.charCodeAt(0) == 0 ? t2 : t2;
+    },
+    _selector$_typeOrUniversalSelector$0: function() {
+      var nameOrNamespace, _this = this,
+        t1 = _this.scanner,
+        first = t1.peekChar$0();
+      if (first === 42) {
+        t1.readChar$0();
+        if (!t1.scanChar$1(124))
+          return new N.UniversalSelector0(null);
+        if (t1.scanChar$1(42))
+          return new N.UniversalSelector0("*");
+        else
+          return new F.TypeSelector0(new D.QualifiedName0(_this.identifier$0(), "*"));
+      } else if (first === 124) {
+        t1.readChar$0();
+        if (t1.scanChar$1(42))
+          return new N.UniversalSelector0("");
+        else
+          return new F.TypeSelector0(new D.QualifiedName0(_this.identifier$0(), ""));
+      }
+      nameOrNamespace = _this.identifier$0();
+      if (!t1.scanChar$1(124))
+        return new F.TypeSelector0(new D.QualifiedName0(nameOrNamespace, null));
+      else if (t1.scanChar$1(42))
+        return new N.UniversalSelector0(nameOrNamespace);
+      else
+        return new F.TypeSelector0(new D.QualifiedName0(_this.identifier$0(), nameOrNamespace));
+    }
+  };
+  T.SelectorParser_parse_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        selector = t1._selector$_selectorList$0();
+      t1 = t1.scanner;
+      if (t1._string_scanner$_position !== t1.string.length)
+        t1.error$1(0, "expected selector.");
+      return selector;
+    },
+    $signature: 44
+  };
+  T.SelectorParser_parseCompoundSelector_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        compound = t1._selector$_compoundSelector$0();
+      t1 = t1.scanner;
+      if (t1._string_scanner$_position !== t1.string.length)
+        t1.error$1(0, "expected selector.");
+      return compound;
+    },
+    $signature: 426
+  };
+  N.serialize_closure0.prototype = {
+    call$1: function(codeUnit) {
+      return codeUnit > 127;
+    },
+    $signature: 24
+  };
+  N._SerializeVisitor.prototype = {
+    visitCssStylesheet$1: function(node) {
+      var t1, t2, t3, t4, t5, previous, i, child, _this = this;
+      for (t1 = _this._serialize0$_style !== C.OutputStyle_compressed0, t2 = type$.legacy_CssComment_2, t3 = type$.legacy_CssParentNode_2, t4 = _this._buffer, t5 = _this._lineFeed.text, previous = null, i = 0; i < J.get$length$asx(node.get$children(node)); ++i) {
+        child = J.$index$asx(node.get$children(node), i);
+        if (_this._serialize0$_isInvisible$1(child))
+          continue;
+        if (previous != null) {
+          if (t3._is(previous) ? previous.get$isChildless() : !t2._is(previous))
+            t4.writeCharCode$1(59);
+          if (t1)
+            t4.write$1(0, t5);
+          if (previous.get$isGroupEnd())
+            if (t1)
+              t4.write$1(0, t5);
+        }
+        child.accept$1(_this);
+        previous = child;
+      }
+      if (previous != null)
+        t1 = (t3._is(previous) ? previous.get$isChildless() : !t2._is(previous)) && t1;
+      else
+        t1 = false;
+      if (t1)
+        t4.writeCharCode$1(59);
+    },
+    visitCssComment$1: function(node) {
+      this._buffer.forSpan$2(node.span, new N._SerializeVisitor_visitCssComment_closure0(this, node));
+    },
+    visitCssAtRule$1: function(node) {
+      var t1, _this = this;
+      _this._serialize0$_writeIndentation$0();
+      t1 = _this._buffer;
+      t1.forSpan$2(node.span, new N._SerializeVisitor_visitCssAtRule_closure0(_this, node));
+      if (!node.isChildless) {
+        if (_this._serialize0$_style !== C.OutputStyle_compressed0)
+          t1.writeCharCode$1(32);
+        _this._serialize0$_visitChildren$1(node.children);
+      }
+    },
+    visitCssMediaRule$1: function(node) {
+      var t1, _this = this;
+      _this._serialize0$_writeIndentation$0();
+      t1 = _this._buffer;
+      t1.forSpan$2(node.span, new N._SerializeVisitor_visitCssMediaRule_closure0(_this, node));
+      if (_this._serialize0$_style !== C.OutputStyle_compressed0)
+        t1.writeCharCode$1(32);
+      _this._serialize0$_visitChildren$1(node.children);
+    },
+    visitCssImport$1: function(node) {
+      this._serialize0$_writeIndentation$0();
+      this._buffer.forSpan$2(node.span, new N._SerializeVisitor_visitCssImport_closure0(this, node));
+    },
+    _serialize0$_writeImportUrl$1: function(url) {
+      var urlContents, maybeQuote, _this = this;
+      if (_this._serialize0$_style !== C.OutputStyle_compressed0 || J._codeUnitAt$1$s(url, 0) !== 117) {
+        _this._buffer.write$1(0, url);
+        return;
+      }
+      urlContents = J.substring$2$s(url, 4, url.length - 1);
+      maybeQuote = C.JSString_methods._codeUnitAt$1(urlContents, 0);
+      if (maybeQuote === 39 || maybeQuote === 34)
+        _this._buffer.write$1(0, urlContents);
+      else
+        _this._serialize0$_visitQuotedString$1(urlContents);
+    },
+    visitCssKeyframeBlock$1: function(node) {
+      var t1, _this = this;
+      _this._serialize0$_writeIndentation$0();
+      t1 = _this._buffer;
+      t1.forSpan$2(node.selector.span, new N._SerializeVisitor_visitCssKeyframeBlock_closure0(_this, node));
+      if (_this._serialize0$_style !== C.OutputStyle_compressed0)
+        t1.writeCharCode$1(32);
+      _this._serialize0$_visitChildren$1(node.children);
+    },
+    _serialize0$_visitMediaQuery$1: function(query) {
+      var t2, t3, _this = this,
+        t1 = query.modifier;
+      if (t1 != null) {
+        t2 = _this._buffer;
+        t2.write$1(0, t1);
+        t2.writeCharCode$1(32);
+      }
+      t1 = query.type;
+      if (t1 != null) {
+        t2 = _this._buffer;
+        t2.write$1(0, t1);
+        if (query.features.length !== 0)
+          t2.write$1(0, " and ");
+      }
+      t1 = query.features;
+      t2 = _this._serialize0$_style === C.OutputStyle_compressed0 ? "and " : " and ";
+      t3 = _this._buffer;
+      _this._serialize0$_writeBetween$3(t1, t2, t3.get$write(t3));
+    },
+    visitCssStyleRule$1: function(node) {
+      var t1, _this = this;
+      _this._serialize0$_writeIndentation$0();
+      t1 = _this._buffer;
+      t1.forSpan$2(node.selector.span, new N._SerializeVisitor_visitCssStyleRule_closure0(_this, node));
+      if (_this._serialize0$_style !== C.OutputStyle_compressed0)
+        t1.writeCharCode$1(32);
+      _this._serialize0$_visitChildren$1(node.children);
+    },
+    visitCssSupportsRule$1: function(node) {
+      var t1, _this = this;
+      _this._serialize0$_writeIndentation$0();
+      t1 = _this._buffer;
+      t1.forSpan$2(node.span, new N._SerializeVisitor_visitCssSupportsRule_closure0(_this, node));
+      if (_this._serialize0$_style !== C.OutputStyle_compressed0)
+        t1.writeCharCode$1(32);
+      _this._serialize0$_visitChildren$1(node.children);
+    },
+    visitCssDeclaration$1: function(node) {
+      var error, error0, t1, t2, exception, _this = this;
+      _this._serialize0$_writeIndentation$0();
+      t1 = node.name;
+      _this._serialize0$_write$1(t1);
+      t2 = _this._buffer;
+      t2.writeCharCode$1(58);
+      if (J.startsWith$1$s(t1.get$value(t1), "--") && node.parsedAsCustomProperty)
+        t2.forSpan$2(node.value.span, new N._SerializeVisitor_visitCssDeclaration_closure1(_this, node));
+      else {
+        if (_this._serialize0$_style !== C.OutputStyle_compressed0)
+          t2.writeCharCode$1(32);
+        try {
+          t2.forSpan$2(node.valueSpanForMap, new N._SerializeVisitor_visitCssDeclaration_closure2(_this, node));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (t1 instanceof E.MultiSpanSassScriptException0) {
+            error = t1;
+            throw H.wrapException(E.MultiSpanSassException$0(error.message, node.value.span, error.primaryLabel, error.secondarySpans));
+          } else if (t1 instanceof E.SassScriptException0) {
+            error0 = t1;
+            throw H.wrapException(E.SassException$0(error0.message, node.value.span));
+          } else
+            throw exception;
+        }
+      }
+    },
+    _serialize0$_writeFoldedValue$1: function(node) {
+      var t1, t2, next, t3,
+        scanner = X.StringScanner$(type$.legacy_SassString_2._as(node.value.value).text, null, null);
+      for (t1 = scanner.string.length, t2 = this._buffer; scanner._string_scanner$_position !== t1;) {
+        next = scanner.readChar$0();
+        if (next !== 10) {
+          t2.writeCharCode$1(next);
+          continue;
+        }
+        t2.writeCharCode$1(32);
+        while (true) {
+          t3 = scanner.peekChar$0();
+          if (!(t3 === 32 || t3 === 9 || t3 === 10 || t3 === 13 || t3 === 12))
+            break;
+          scanner.readChar$0();
+        }
+      }
+    },
+    _serialize0$_writeReindentedValue$1: function(node) {
+      var _this = this,
+        t1 = node.value,
+        value = type$.legacy_SassString_2._as(t1.value).text,
+        minimumIndentation = _this._serialize0$_minimumIndentation$1(value);
+      if (minimumIndentation == null) {
+        _this._buffer.write$1(0, value);
+        return;
+      } else if (minimumIndentation === -1) {
+        t1 = _this._buffer;
+        t1.write$1(0, B.trimAsciiRight0(value, true));
+        t1.writeCharCode$1(32);
+        return;
+      }
+      if (t1.span != null) {
+        t1 = node.name.get$span();
+        t1 = Y.FileLocation$_(t1.file, t1._file$_start);
+        minimumIndentation = Math.min(minimumIndentation, t1.file.getColumn$1(t1.offset));
+      }
+      _this._serialize0$_writeWithIndent$2(value, minimumIndentation);
+    },
+    _serialize0$_minimumIndentation$1: function(text) {
+      var character, t2, min, next, min0,
+        scanner = Z.LineScanner$(text),
+        t1 = scanner.string.length;
+      while (true) {
+        if (scanner._string_scanner$_position !== t1) {
+          character = scanner.super$StringScanner$readChar();
+          scanner._adjustLineAndColumn$1(character);
+          t2 = character !== 10;
+        } else
+          t2 = false;
+        if (!t2)
+          break;
+      }
+      if (scanner._string_scanner$_position === t1)
+        return scanner.peekChar$1(-1) === 10 ? -1 : null;
+      for (min = null; scanner._string_scanner$_position !== t1;) {
+        for (; scanner._string_scanner$_position !== t1;) {
+          next = scanner.peekChar$0();
+          if (next !== 32 && next !== 9)
+            break;
+          scanner._adjustLineAndColumn$1(scanner.super$StringScanner$readChar());
+        }
+        if (scanner._string_scanner$_position === t1 || scanner.scanChar$1(10))
+          continue;
+        min0 = scanner._line_scanner$_column;
+        min = min == null ? min0 : Math.min(min, min0);
+        while (true) {
+          if (scanner._string_scanner$_position !== t1) {
+            character = scanner.super$StringScanner$readChar();
+            scanner._adjustLineAndColumn$1(character);
+            t2 = character !== 10;
+          } else
+            t2 = false;
+          if (!t2)
+            break;
+        }
+      }
+      return min == null ? -1 : min;
+    },
+    _serialize0$_writeWithIndent$2: function(text, minimumIndentation) {
+      var t1, t2, t3, character, t4, lineStart, newlines, end,
+        scanner = Z.LineScanner$(text);
+      for (t1 = scanner.string, t2 = t1.length, t3 = this._buffer; scanner._string_scanner$_position !== t2;) {
+        character = scanner.super$StringScanner$readChar();
+        scanner._adjustLineAndColumn$1(character);
+        if (character === 10)
+          break;
+        t3.writeCharCode$1(character);
+      }
+      for (t4 = J.getInterceptor$s(t1); true;) {
+        lineStart = scanner._string_scanner$_position;
+        for (newlines = 1; true;) {
+          if (scanner._string_scanner$_position === t2) {
+            t3.writeCharCode$1(32);
+            return;
+          }
+          character = scanner.super$StringScanner$readChar();
+          scanner._adjustLineAndColumn$1(character);
+          if (character === 32 || character === 9)
+            continue;
+          if (character !== 10)
+            break;
+          lineStart = scanner._string_scanner$_position;
+          ++newlines;
+        }
+        this._serialize0$_writeTimes$2(10, newlines);
+        this._serialize0$_writeIndentation$0();
+        end = scanner._string_scanner$_position;
+        t3.write$1(0, t4.substring$2(t1, lineStart + minimumIndentation, end));
+        for (; true;) {
+          if (scanner._string_scanner$_position === t2)
+            return;
+          character = scanner.super$StringScanner$readChar();
+          scanner._adjustLineAndColumn$1(character);
+          if (character === 10)
+            break;
+          t3.writeCharCode$1(character);
+        }
+      }
+    },
+    visitColor$1: function(value) {
+      var $name, hexLength, t2, t3, _this = this,
+        t1 = _this._serialize0$_style === C.OutputStyle_compressed0;
+      if (t1 && Math.abs(value.alpha - 1) < $.$get$epsilon0()) {
+        $name = $.$get$namesByColor0().$index(0, value);
+        hexLength = _this._serialize0$_canUseShortHex$1(value) ? 4 : 7;
+        if ($name != null && $name.length <= hexLength)
+          _this._buffer.write$1(0, $name);
+        else {
+          t1 = _this._buffer;
+          if (_this._serialize0$_canUseShortHex$1(value)) {
+            t1.writeCharCode$1(35);
+            t1.writeCharCode$1(T.hexCharFor0(value.get$red() & 15));
+            t1.writeCharCode$1(T.hexCharFor0(value.get$green() & 15));
+            t1.writeCharCode$1(T.hexCharFor0(value.get$blue() & 15));
+          } else {
+            t1.writeCharCode$1(35);
+            _this._serialize0$_writeHexComponent$1(value.get$red());
+            _this._serialize0$_writeHexComponent$1(value.get$green());
+            _this._serialize0$_writeHexComponent$1(value.get$blue());
+          }
+        }
+        return;
+      }
+      if (value.get$original() != null)
+        _this._buffer.write$1(0, value.get$original());
+      else {
+        t2 = $.$get$namesByColor0();
+        if (t2.containsKey$1(value) && !(Math.abs(value.alpha - 0) < $.$get$epsilon0()))
+          _this._buffer.write$1(0, t2.$index(0, value));
+        else {
+          t2 = value.alpha;
+          t3 = _this._buffer;
+          if (Math.abs(t2 - 1) < $.$get$epsilon0()) {
+            t3.writeCharCode$1(35);
+            _this._serialize0$_writeHexComponent$1(value.get$red());
+            _this._serialize0$_writeHexComponent$1(value.get$green());
+            _this._serialize0$_writeHexComponent$1(value.get$blue());
+          } else {
+            t3.write$1(0, "rgba(" + H.S(value.get$red()));
+            t3.write$1(0, t1 ? "," : ", ");
+            t3.write$1(0, value.get$green());
+            t3.write$1(0, t1 ? "," : ", ");
+            t3.write$1(0, value.get$blue());
+            t3.write$1(0, t1 ? "," : ", ");
+            _this._serialize0$_writeNumber$1(t2);
+            t3.writeCharCode$1(41);
+          }
+        }
+      }
+    },
+    _serialize0$_canUseShortHex$1: function(color) {
+      var t1 = color.get$red();
+      if ((t1 & 15) === C.JSInt_methods._shrOtherPositive$1(t1, 4)) {
+        t1 = color.get$green();
+        if ((t1 & 15) === C.JSInt_methods._shrOtherPositive$1(t1, 4)) {
+          t1 = color.get$blue();
+          t1 = (t1 & 15) === C.JSInt_methods._shrOtherPositive$1(t1, 4);
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    _serialize0$_writeHexComponent$1: function(color) {
+      var t1 = this._buffer;
+      t1.writeCharCode$1(T.hexCharFor0(C.JSInt_methods._shrOtherPositive$1(color, 4)));
+      t1.writeCharCode$1(T.hexCharFor0(color & 15));
+    },
+    visitList$1: function(value) {
+      var t2, singleton, t3, t4, _this = this,
+        t1 = value.hasBrackets;
+      if (t1)
+        _this._buffer.writeCharCode$1(91);
+      else if (value._list1$_contents.length === 0) {
+        if (!_this._inspect)
+          throw H.wrapException(E.SassScriptException$0("() isn't a valid CSS value."));
+        _this._buffer.write$1(0, "()");
+        return;
+      }
+      t2 = _this._inspect;
+      singleton = t2 && value._list1$_contents.length === 1 && value.separator === C.ListSeparator_comma0;
+      if (singleton && !t1)
+        _this._buffer.writeCharCode$1(40);
+      t3 = value._list1$_contents;
+      t3 = t2 ? t3 : new H.WhereIterable(t3, new N._SerializeVisitor_visitList_closure2(), H._arrayInstanceType(t3)._eval$1("WhereIterable<1>"));
+      if (value.separator === C.ListSeparator_space0)
+        t4 = " ";
+      else
+        t4 = _this._serialize0$_style === C.OutputStyle_compressed0 ? "," : ", ";
+      _this._serialize0$_writeBetween$3(t3, t4, t2 ? new N._SerializeVisitor_visitList_closure3(_this, value) : new N._SerializeVisitor_visitList_closure4(_this));
+      if (singleton) {
+        t2 = _this._buffer;
+        t2.writeCharCode$1(44);
+        if (!t1)
+          t2.writeCharCode$1(41);
+      }
+      if (t1)
+        _this._buffer.writeCharCode$1(93);
+    },
+    _serialize0$_elementNeedsParens$2: function(separator, value) {
+      var t1;
+      if (value instanceof D.SassList0) {
+        if (value._list1$_contents.length < 2)
+          return false;
+        if (value.hasBrackets)
+          return false;
+        t1 = value.separator;
+        return separator === C.ListSeparator_comma0 ? t1 === C.ListSeparator_comma0 : t1 !== C.ListSeparator_undecided0;
+      }
+      return false;
+    },
+    visitMap$1: function(map) {
+      var t1, t2, _this = this;
+      if (!_this._inspect)
+        throw H.wrapException(E.SassScriptException$0(map.toString$0(0) + " isn't a valid CSS value."));
+      t1 = _this._buffer;
+      t1.writeCharCode$1(40);
+      t2 = map.contents;
+      _this._serialize0$_writeBetween$3(t2.get$keys(t2), ", ", new N._SerializeVisitor_visitMap_closure0(_this, map));
+      t1.writeCharCode$1(41);
+    },
+    _serialize0$_writeMapElement$1: function(value) {
+      var needsParens = value instanceof D.SassList0 && value.separator === C.ListSeparator_comma0 && !value.hasBrackets;
+      if (needsParens)
+        this._buffer.writeCharCode$1(40);
+      value.accept$1(this);
+      if (needsParens)
+        this._buffer.writeCharCode$1(41);
+    },
+    visitNumber$1: function(value) {
+      var _this = this,
+        t1 = value.asSlash;
+      if (t1 != null) {
+        _this.visitNumber$1(t1.item1);
+        _this._buffer.writeCharCode$1(47);
+        _this.visitNumber$1(t1.item2);
+        return;
+      }
+      _this._serialize0$_writeNumber$1(value.value);
+      if (!_this._inspect) {
+        if (J.get$length$asx(value.get$numeratorUnits()) > 1 || value.get$denominatorUnits().length !== 0)
+          throw H.wrapException(E.SassScriptException$0(value.toString$0(0) + " isn't a valid CSS value."));
+        if (J.get$isNotEmpty$asx(value.get$numeratorUnits()))
+          _this._buffer.write$1(0, J.get$first$ax(value.get$numeratorUnits()));
+      } else
+        _this._buffer.write$1(0, value.get$unitString());
+    },
+    _serialize0$_writeNumber$1: function(number) {
+      var t1, text, text0, _this = this,
+        integer = T.fuzzyIsInt0(number) ? J.round$0$n(number) : null;
+      if (integer != null) {
+        t1 = integer >= 1e21 ? _this._serialize0$_removeExponent$1(C.JSInt_methods.toString$0(integer)) : C.JSInt_methods.toString$0(integer);
+        _this._buffer.write$1(0, t1);
+        return;
+      }
+      text = number >= 1e21 ? _this._serialize0$_removeExponent$1(C.JSNumber_methods.toString$0(number)) : C.JSNumber_methods.toString$0(number);
+      text0 = _this._serialize0$_style === C.OutputStyle_compressed0 && C.JSString_methods._codeUnitAt$1(text, 0) === 48 ? C.JSString_methods.substring$1(text, 1) : text;
+      if (text.length < 12) {
+        _this._buffer.write$1(0, text0);
+        return;
+      }
+      _this._serialize0$_writeDecimal$1(text0);
+    },
+    _serialize0$_removeExponent$1: function(text) {
+      var buffer, exponent, t2, additionalZeroes, negative,
+        t1 = text.length,
+        i = 0;
+      while (true) {
+        if (!(i < t1)) {
+          buffer = null;
+          exponent = null;
+          break;
+        }
+        c$0: {
+          if (C.JSString_methods._codeUnitAt$1(text, i) !== 101)
+            break c$0;
+          buffer = new P.StringBuffer("");
+          t2 = H.Primitives_stringFromCharCode(C.JSString_methods._codeUnitAt$1(text, 0));
+          buffer._contents = t2;
+          if (i > 2)
+            buffer._contents = t2 + C.JSString_methods.substring$2(text, 2, i);
+          exponent = P.int_parse(C.JSString_methods.substring$2(text, i + 1, t1), null);
+          break;
+        }
+        ++i;
+      }
+      if (buffer == null)
+        return text;
+      if (exponent > 0) {
+        t1 = buffer._contents;
+        additionalZeroes = exponent - (t1.length - 1);
+        for (i = 0; i < additionalZeroes; ++i)
+          t1 = buffer._contents += H.Primitives_stringFromCharCode(48);
+        return t1.charCodeAt(0) == 0 ? t1 : t1;
+      } else {
+        negative = C.JSString_methods._codeUnitAt$1(text, 0) === 45;
+        t1 = (negative ? H.Primitives_stringFromCharCode(45) : "") + "0.";
+        for (i = -1; i > exponent; --i)
+          t1 += H.Primitives_stringFromCharCode(48);
+        if (negative) {
+          t2 = buffer._contents;
+          t2 = C.JSString_methods.substring$1(t2.charCodeAt(0) == 0 ? t2 : t2, 1);
+        } else
+          t2 = buffer;
+        t2 = t1 + H.S(t2);
+        return t2.charCodeAt(0) == 0 ? t2 : t2;
+      }
+    },
+    _serialize0$_writeDecimal$1: function(text) {
+      var t1, t2, textIndex, codeUnit, digits, t3, digitsIndex, digitsIndex0, textIndex0, newDigit, i;
+      for (t1 = text.length, t2 = this._buffer, textIndex = 0; textIndex < t1; ++textIndex) {
+        codeUnit = C.JSString_methods._codeUnitAt$1(text, textIndex);
+        if (codeUnit === 46) {
+          if (textIndex === t1 - 2 && C.JSString_methods.codeUnitAt$1(text, t1 - 1) === 48)
+            return;
+          t2.writeCharCode$1(codeUnit);
+          ++textIndex;
+          break;
+        }
+        t2.writeCharCode$1(codeUnit);
+      }
+      if (textIndex === t1)
+        return;
+      digits = new Uint8Array(10);
+      t3 = digits.length;
+      digitsIndex = 0;
+      while (true) {
+        if (!(textIndex < t1 && digitsIndex < t3))
+          break;
+        digitsIndex0 = digitsIndex + 1;
+        textIndex0 = textIndex + 1;
+        digits[digitsIndex] = C.JSString_methods._codeUnitAt$1(text, textIndex) - 48;
+        digitsIndex = digitsIndex0;
+        textIndex = textIndex0;
+      }
+      if (textIndex !== t1 && C.JSString_methods._codeUnitAt$1(text, textIndex) - 48 >= 5)
+        for (; digitsIndex >= 0; digitsIndex = digitsIndex0) {
+          digitsIndex0 = digitsIndex - 1;
+          newDigit = digits[digitsIndex0] + 1;
+          digits[digitsIndex0] = newDigit;
+          if (newDigit !== 10)
+            break;
+        }
+      while (true) {
+        if (!(digitsIndex > 0 && digits[digitsIndex - 1] === 0))
+          break;
+        --digitsIndex;
+      }
+      for (i = 0; i < digitsIndex; ++i)
+        t2.writeCharCode$1(48 + digits[i]);
+    },
+    _serialize0$_visitQuotedString$2$forceDoubleQuote: function(string, forceDoubleQuote) {
+      var t1, includesSingleQuote, includesDoubleQuote, i, char, t2, next, quote, _this = this,
+        buffer = forceDoubleQuote ? _this._buffer : new P.StringBuffer("");
+      if (forceDoubleQuote)
+        buffer.writeCharCode$1(34);
+      for (t1 = string.length, includesSingleQuote = false, includesDoubleQuote = false, i = 0; i < t1; ++i) {
+        char = C.JSString_methods._codeUnitAt$1(string, i);
+        switch (char) {
+          case 39:
+            if (forceDoubleQuote)
+              buffer.writeCharCode$1(39);
+            else {
+              if (includesDoubleQuote) {
+                _this._serialize0$_visitQuotedString$2$forceDoubleQuote(string, true);
+                return;
+              } else
+                buffer.writeCharCode$1(39);
+              includesSingleQuote = true;
+            }
+            break;
+          case 34:
+            if (forceDoubleQuote) {
+              buffer.writeCharCode$1(92);
+              buffer.writeCharCode$1(34);
+            } else {
+              if (includesSingleQuote) {
+                _this._serialize0$_visitQuotedString$2$forceDoubleQuote(string, true);
+                return;
+              } else
+                buffer.writeCharCode$1(34);
+              includesDoubleQuote = true;
+            }
+            break;
+          case 0:
+          case 1:
+          case 2:
+          case 3:
+          case 4:
+          case 5:
+          case 6:
+          case 7:
+          case 8:
+          case 10:
+          case 11:
+          case 12:
+          case 13:
+          case 14:
+          case 15:
+          case 16:
+          case 17:
+          case 18:
+          case 19:
+          case 20:
+          case 21:
+          case 22:
+          case 23:
+          case 24:
+          case 25:
+          case 26:
+          case 27:
+          case 28:
+          case 29:
+          case 30:
+          case 31:
+            buffer.writeCharCode$1(92);
+            if (char > 15) {
+              t2 = char >>> 4;
+              buffer.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+            }
+            t2 = char & 15;
+            buffer.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
+            t2 = i + 1;
+            if (t1 === t2)
+              break;
+            next = C.JSString_methods._codeUnitAt$1(string, t2);
+            if (T.isHex0(next) || next === 32 || next === 9)
+              buffer.writeCharCode$1(32);
+            break;
+          case 92:
+            buffer.writeCharCode$1(92);
+            buffer.writeCharCode$1(92);
+            break;
+          default:
+            buffer.writeCharCode$1(char);
+            break;
+        }
+      }
+      if (forceDoubleQuote)
+        buffer.writeCharCode$1(34);
+      else {
+        quote = includesDoubleQuote ? 39 : 34;
+        t1 = _this._buffer;
+        t1.writeCharCode$1(quote);
+        t1.write$1(0, buffer);
+        t1.writeCharCode$1(quote);
+      }
+    },
+    _serialize0$_visitQuotedString$1: function(string) {
+      return this._serialize0$_visitQuotedString$2$forceDoubleQuote(string, false);
+    },
+    _serialize0$_visitUnquotedString$1: function(string) {
+      var t1, t2, afterNewline, i, char;
+      for (t1 = string.length, t2 = this._buffer, afterNewline = false, i = 0; i < t1; ++i) {
+        char = C.JSString_methods._codeUnitAt$1(string, i);
+        switch (char) {
+          case 10:
+            t2.writeCharCode$1(32);
+            afterNewline = true;
+            break;
+          case 32:
+            if (!afterNewline)
+              t2.writeCharCode$1(32);
+            break;
+          default:
+            t2.writeCharCode$1(char);
+            afterNewline = false;
+            break;
+        }
+      }
+    },
+    visitComplexSelector$1: function(complex) {
+      var t1, t2, t3, t4, lastComponent, _i, component, t5;
+      for (t1 = complex.components, t2 = t1.length, t3 = this._buffer, t4 = this._serialize0$_style === C.OutputStyle_compressed0, lastComponent = null, _i = 0; _i < t2; ++_i, lastComponent = component) {
+        component = t1[_i];
+        if (lastComponent != null)
+          if (!(t4 && lastComponent instanceof S.Combinator0))
+            t5 = !(t4 && component instanceof S.Combinator0);
+          else
+            t5 = false;
+        else
+          t5 = false;
+        if (t5)
+          t3.write$1(0, " ");
+        if (component instanceof X.CompoundSelector0)
+          this.visitCompoundSelector$1(component);
+        else
+          t3.write$1(0, component);
+      }
+    },
+    visitCompoundSelector$1: function(compound) {
+      var t2, t3, _i,
+        t1 = this._buffer,
+        start = t1.get$length(t1);
+      for (t2 = compound.components, t3 = t2.length, _i = 0; _i < t3; ++_i)
+        t2[_i].accept$1(this);
+      if (t1.get$length(t1) === start)
+        t1.writeCharCode$1(42);
+    },
+    visitSelectorList$1: function(list) {
+      var complexes, t1, t2, t3, t4, first, t5, _this = this;
+      if (_this._inspect)
+        complexes = list.components;
+      else {
+        t1 = list.components;
+        complexes = new H.WhereIterable(t1, new N._SerializeVisitor_visitSelectorList_closure0(), H._arrayInstanceType(t1)._eval$1("WhereIterable<1>"));
+      }
+      for (t1 = J.get$iterator$ax(complexes), t2 = _this._serialize0$_style !== C.OutputStyle_compressed0, t3 = _this._buffer, t4 = _this._lineFeed.text, first = true; t1.moveNext$0();) {
+        t5 = t1.get$current(t1);
+        if (first)
+          first = false;
+        else {
+          t3.writeCharCode$1(44);
+          if (t5.lineBreak) {
+            if (t2)
+              t3.write$1(0, t4);
+          } else if (t2)
+            t3.writeCharCode$1(32);
+        }
+        _this.visitComplexSelector$1(t5);
+      }
+    },
+    visitPseudoSelector$1: function(pseudo) {
+      var t4, t5, t6,
+        t1 = pseudo.selector,
+        t2 = t1 == null,
+        t3 = !t2;
+      if (t3 && pseudo.name === "not" && t1.get$isInvisible())
+        return;
+      t4 = this._buffer;
+      t4.writeCharCode$1(58);
+      if (!pseudo.isSyntacticClass)
+        t4.writeCharCode$1(58);
+      t4.write$1(0, pseudo.name);
+      t5 = pseudo.argument;
+      t6 = t5 == null;
+      if (t6 && t2)
+        return;
+      t4.writeCharCode$1(40);
+      if (!t6) {
+        t4.write$1(0, t5);
+        if (t3)
+          t4.writeCharCode$1(32);
+      }
+      if (t3)
+        this.visitSelectorList$1(t1);
+      t4.writeCharCode$1(41);
+    },
+    _serialize0$_write$1: function(value) {
+      return this._buffer.forSpan$2(value.get$span(), new N._SerializeVisitor__write_closure0(this, value));
+    },
+    _serialize0$_visitChildren$1: function(children) {
+      var _this = this, t1 = {},
+        t2 = _this._buffer;
+      t2.writeCharCode$1(123);
+      if (children.every$1(children, _this.get$_serialize0$_isInvisible())) {
+        t2.writeCharCode$1(125);
+        return;
+      }
+      _this._serialize0$_writeLineFeed$0();
+      t1.previous = null;
+      ++_this._serialize0$_indentation;
+      new N._SerializeVisitor__visitChildren_closure0(t1, _this, children).call$0();
+      --_this._serialize0$_indentation;
+      t1 = t1.previous;
+      if ((type$.legacy_CssParentNode_2._is(t1) ? t1.get$isChildless() : !type$.legacy_CssComment_2._is(t1)) && _this._serialize0$_style !== C.OutputStyle_compressed0)
+        t2.writeCharCode$1(59);
+      _this._serialize0$_writeLineFeed$0();
+      _this._serialize0$_writeIndentation$0();
+      t2.writeCharCode$1(125);
+    },
+    _serialize0$_writeLineFeed$0: function() {
+      if (this._serialize0$_style !== C.OutputStyle_compressed0)
+        this._buffer.write$1(0, this._lineFeed.text);
+    },
+    _serialize0$_writeIndentation$0: function() {
+      var _this = this;
+      if (_this._serialize0$_style === C.OutputStyle_compressed0)
+        return;
+      _this._serialize0$_writeTimes$2(_this._serialize0$_indentCharacter, _this._serialize0$_indentation * _this._serialize0$_indentWidth);
+    },
+    _serialize0$_writeTimes$2: function(char, times) {
+      var t1, i;
+      for (t1 = this._buffer, i = 0; i < times; ++i)
+        t1.writeCharCode$1(char);
+    },
+    _serialize0$_writeBetween$1$3: function(iterable, text, callback) {
+      var t1, t2, first, value;
+      for (t1 = J.get$iterator$ax(iterable), t2 = this._buffer, first = true; t1.moveNext$0();) {
+        value = t1.get$current(t1);
+        if (first)
+          first = false;
+        else
+          t2.write$1(0, text);
+        callback.call$1(value);
+      }
+    },
+    _serialize0$_writeBetween$3: function(iterable, text, callback) {
+      return this._serialize0$_writeBetween$1$3(iterable, text, callback, type$.dynamic);
+    },
+    _serialize0$_isInvisible$1: function(node) {
+      if (this._inspect)
+        return false;
+      if (this._serialize0$_style === C.OutputStyle_compressed0 && type$.legacy_CssComment_2._is(node) && J._codeUnitAt$1$s(node.text, 2) !== 33)
+        return true;
+      if (type$.legacy_CssParentNode_2._is(node)) {
+        if (type$.legacy_CssAtRule_2._is(node))
+          return false;
+        if (type$.legacy_CssStyleRule_2._is(node) && node.selector.value.get$isInvisible())
+          return true;
+        return J.every$1$ax(node.get$children(node), this.get$_serialize0$_isInvisible());
+      } else
+        return false;
+    }
+  };
+  N._SerializeVisitor_visitCssComment_closure0.prototype = {
+    call$0: function() {
+      var t2, t3, minimumIndentation,
+        t1 = this.$this;
+      if (t1._serialize0$_style === C.OutputStyle_compressed0 && J._codeUnitAt$1$s(this.node.text, 2) !== 33)
+        return;
+      t2 = this.node;
+      t3 = t2.text;
+      minimumIndentation = t1._serialize0$_minimumIndentation$1(t3);
+      if (minimumIndentation == null) {
+        t1._serialize0$_writeIndentation$0();
+        t1._buffer.write$1(0, t3);
+        return;
+      }
+      t2 = t2.span;
+      if (t2 != null) {
+        t2 = Y.FileLocation$_(t2.file, t2._file$_start);
+        minimumIndentation = Math.min(minimumIndentation, t2.file.getColumn$1(t2.offset));
+      }
+      t1._serialize0$_writeIndentation$0();
+      t1._serialize0$_writeWithIndent$2(t3, minimumIndentation);
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssAtRule_closure0.prototype = {
+    call$0: function() {
+      var t3,
+        t1 = this.$this,
+        t2 = t1._buffer;
+      t2.writeCharCode$1(64);
+      t3 = this.node;
+      t1._serialize0$_write$1(t3.name);
+      t3 = t3.value;
+      if (t3 != null) {
+        t2.writeCharCode$1(32);
+        t1._serialize0$_write$1(t3);
+      }
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssMediaRule_closure0.prototype = {
+    call$0: function() {
+      var t3, t4,
+        t1 = this.$this,
+        t2 = t1._buffer;
+      t2.write$1(0, "@media");
+      t3 = t1._serialize0$_style === C.OutputStyle_compressed0;
+      if (t3) {
+        t4 = C.JSArray_methods.get$first(this.node.queries);
+        t4 = !(t4.modifier == null && t4.type == null);
+      } else
+        t4 = true;
+      if (t4)
+        t2.writeCharCode$1(32);
+      t2 = t3 ? "," : ", ";
+      t1._serialize0$_writeBetween$3(this.node.queries, t2, t1.get$_serialize0$_visitMediaQuery());
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssImport_closure0.prototype = {
+    call$0: function() {
+      var t3, t4, t5, t6,
+        t1 = this.$this,
+        t2 = t1._buffer;
+      t2.write$1(0, "@import");
+      t3 = t1._serialize0$_style === C.OutputStyle_compressed0;
+      t4 = !t3;
+      if (t4)
+        t2.writeCharCode$1(32);
+      t5 = this.node;
+      t2.forSpan$2(t5.url.get$span(), new N._SerializeVisitor_visitCssImport__closure0(t1, t5));
+      t6 = t5.supports;
+      if (t6 != null) {
+        if (t4)
+          t2.writeCharCode$1(32);
+        t1._serialize0$_write$1(t6);
+      }
+      t5 = t5.media;
+      if (t5 != null) {
+        if (t4)
+          t2.writeCharCode$1(32);
+        t2 = t3 ? "," : ", ";
+        t1._serialize0$_writeBetween$3(t5, t2, t1.get$_serialize0$_visitMediaQuery());
+      }
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssImport__closure0.prototype = {
+    call$0: function() {
+      var t1 = this.node.url;
+      return this.$this._serialize0$_writeImportUrl$1(t1.get$value(t1));
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor_visitCssKeyframeBlock_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._serialize0$_style === C.OutputStyle_compressed0 ? "," : ", ",
+        t3 = t1._buffer;
+      return t1._serialize0$_writeBetween$3(this.node.selector.value, t2, t3.get$write(t3));
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor_visitCssStyleRule_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.node.selector.value;
+      t1.toString;
+      return this.$this.visitSelectorList$1(t1);
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor_visitCssSupportsRule_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = t1._buffer;
+      t2.write$1(0, "@supports");
+      if (!(t1._serialize0$_style === C.OutputStyle_compressed0 && J.codeUnitAt$1$s(this.node.condition.value, 0) === 40))
+        t2.writeCharCode$1(32);
+      t1._serialize0$_write$1(this.node.condition);
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssDeclaration_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.$this,
+        t2 = this.node;
+      if (t1._serialize0$_style === C.OutputStyle_compressed0)
+        t1._serialize0$_writeFoldedValue$1(t2);
+      else
+        t1._serialize0$_writeReindentedValue$1(t2);
+    },
+    $signature: 0
+  };
+  N._SerializeVisitor_visitCssDeclaration_closure2.prototype = {
+    call$0: function() {
+      return this.node.value.value.accept$1(this.$this);
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor_visitList_closure2.prototype = {
+    call$1: function(element) {
+      return !element.get$isBlank();
+    },
+    $signature: 55
+  };
+  N._SerializeVisitor_visitList_closure3.prototype = {
+    call$1: function(element) {
+      var t1 = this.$this,
+        needsParens = t1._serialize0$_elementNeedsParens$2(this.value.separator, element);
+      if (needsParens)
+        t1._buffer.writeCharCode$1(40);
+      element.accept$1(t1);
+      if (needsParens)
+        t1._buffer.writeCharCode$1(41);
+    },
+    $signature: 87
+  };
+  N._SerializeVisitor_visitList_closure4.prototype = {
+    call$1: function(element) {
+      element.accept$1(this.$this);
+    },
+    $signature: 87
+  };
+  N._SerializeVisitor_visitMap_closure0.prototype = {
+    call$1: function(key) {
+      var t1 = this.$this;
+      t1._serialize0$_writeMapElement$1(key);
+      t1._buffer.write$1(0, ": ");
+      t1._serialize0$_writeMapElement$1(this.map.contents.$index(0, key));
+    },
+    $signature: 87
+  };
+  N._SerializeVisitor_visitSelectorList_closure0.prototype = {
+    call$1: function(complex) {
+      return !complex.get$isInvisible();
+    },
+    $signature: 14
+  };
+  N._SerializeVisitor__write_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.value;
+      return this.$this._buffer.write$1(0, t1.get$value(t1));
+    },
+    $signature: 1
+  };
+  N._SerializeVisitor__visitChildren_closure0.prototype = {
+    call$0: function() {
+      var t1, t2, t3, t4, t5, t6, t7, t8, i, child, t9;
+      for (t1 = this.children._collection$_source, t2 = J.getInterceptor$asx(t1), t3 = this._box_0, t4 = this.$this, t5 = type$.legacy_CssComment_2, t6 = type$.legacy_CssParentNode_2, t7 = t4._buffer, t8 = t4._lineFeed.text, i = 0; i < t2.get$length(t1); ++i) {
+        child = t2.elementAt$1(t1, i);
+        if (t4._serialize0$_isInvisible$1(child))
+          continue;
+        t9 = t3.previous;
+        if (t9 != null) {
+          if (t6._is(t9) ? t9.get$isChildless() : !t5._is(t9))
+            t7.writeCharCode$1(59);
+          t9 = t4._serialize0$_style !== C.OutputStyle_compressed0;
+          if (t9)
+            t7.write$1(0, t8);
+          if (t3.previous.get$isGroupEnd())
+            if (t9)
+              t7.write$1(0, t8);
+        }
+        t3.previous = child;
+        child.accept$1(t4);
+      }
+    },
+    $signature: 0
+  };
+  N.OutputStyle0.prototype = {
+    toString$0: function(_) {
+      return this._name;
+    }
+  };
+  N.LineFeed0.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  N.SerializeResult0.prototype = {};
+  B.ShadowedModuleView0.prototype = {
+    get$url: function() {
+      return this._shadowed_view0$_inner.get$url();
+    },
+    get$upstream: function() {
+      return this._shadowed_view0$_inner.get$upstream();
+    },
+    get$extender: function() {
+      return this._shadowed_view0$_inner.get$extender();
+    },
+    get$css: function(_) {
+      var t1 = this._shadowed_view0$_inner;
+      return t1.get$css(t1);
+    },
+    get$transitivelyContainsCss: function() {
+      return this._shadowed_view0$_inner.get$transitivelyContainsCss();
+    },
+    get$transitivelyContainsExtensions: function() {
+      return this._shadowed_view0$_inner.get$transitivelyContainsExtensions();
+    },
+    setVariable$3: function($name, value, nodeWithSpan) {
+      if (!this.variables.containsKey$1($name))
+        throw H.wrapException(E.SassScriptException$0("Undefined variable."));
+      else
+        return this._shadowed_view0$_inner.setVariable$3($name, value, nodeWithSpan);
+    },
+    variableIdentity$1: function($name) {
+      return this._shadowed_view0$_inner.variableIdentity$1($name);
+    },
+    $eq: function(_, other) {
+      var t1, t2, _this = this;
+      if (other == null)
+        return false;
+      if (other instanceof B.ShadowedModuleView0)
+        if (_this._shadowed_view0$_inner.$eq(0, other._shadowed_view0$_inner)) {
+          t1 = _this.variables;
+          t1 = t1.get$keys(t1);
+          t2 = other.variables;
+          if (C.C_IterableEquality.equals$2(0, t1, t2.get$keys(t2))) {
+            t1 = _this.functions;
+            t1 = t1.get$keys(t1);
+            t2 = other.functions;
+            if (C.C_IterableEquality.equals$2(0, t1, t2.get$keys(t2))) {
+              t1 = _this.mixins;
+              t1 = t1.get$keys(t1);
+              t2 = other.mixins;
+              t2 = C.C_IterableEquality.equals$2(0, t1, t2.get$keys(t2));
+              t1 = t2;
+            } else
+              t1 = false;
+          } else
+            t1 = false;
+        } else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this._shadowed_view0$_inner;
+      return t1.get$hashCode(t1);
+    },
+    cloneCss$0: function() {
+      var _this = this;
+      return new B.ShadowedModuleView0(_this._shadowed_view0$_inner.cloneCss$0(), _this.variables, _this.variableNodes, _this.functions, _this.mixins, _this.$ti._eval$1("ShadowedModuleView0<1*>"));
+    },
+    toString$0: function(_) {
+      return "shadowed " + this._shadowed_view0$_inner.toString$0(0);
+    },
+    $isModule0: 1,
+    get$variables: function() {
+      return this.variables;
+    },
+    get$variableNodes: function() {
+      return this.variableNodes;
+    },
+    get$functions: function(receiver) {
+      return this.functions;
+    },
+    get$mixins: function() {
+      return this.mixins;
+    }
+  };
+  B.SilentComment0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitSilentComment$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return this.text;
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  M.SimpleSelector0.prototype = {
+    get$minSpecificity: function() {
+      return 1000;
+    },
+    get$maxSpecificity: function() {
+      return this.get$minSpecificity();
+    },
+    addSuffix$1: function(suffix) {
+      return H.throwExpression(E.SassScriptException$0('Invalid parent selector "' + this.toString$0(0) + '"'));
+    },
+    unify$1: function(compound) {
+      var result, t1, addedThis, _i, simple, _this = this;
+      if (compound.length === 1 && C.JSArray_methods.get$first(compound) instanceof N.UniversalSelector0)
+        return C.JSArray_methods.get$first(compound).unify$1(H.setRuntimeTypeInfo([_this], type$.JSArray_legacy_SimpleSelector_2));
+      if (C.JSArray_methods.contains$1(compound, _this))
+        return compound;
+      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector_2);
+      for (t1 = compound.length, addedThis = false, _i = 0; _i < compound.length; compound.length === t1 || (0, H.throwConcurrentModificationError)(compound), ++_i) {
+        simple = compound[_i];
+        if (!addedThis && simple instanceof D.PseudoSelector0) {
+          result.push(_this);
+          addedThis = true;
+        }
+        result.push(simple);
+      }
+      if (!addedThis)
+        result.push(_this);
+      return result;
+    }
+  };
+  L.SingleUnitSassNumber0.prototype = {
+    get$numeratorUnits: function() {
+      return new P.UnmodifiableListView(H.setRuntimeTypeInfo([this._single_unit$_unit], type$.JSArray_legacy_String), type$.UnmodifiableListView_legacy_String);
+    },
+    get$denominatorUnits: function() {
+      return C.List_empty;
+    },
+    get$hasUnits: function() {
+      return true;
+    },
+    withValue$1: function(value) {
+      return new L.SingleUnitSassNumber0(this._single_unit$_unit, value, null);
+    },
+    withSlash$2: function(numerator, denominator) {
+      return new L.SingleUnitSassNumber0(this._single_unit$_unit, this.value, new S.Tuple2(numerator, denominator, type$.Tuple2_of_legacy_SassNumber_and_legacy_SassNumber_2));
+    },
+    hasUnit$1: function(unit) {
+      return unit === this._single_unit$_unit;
+    },
+    compatibleWithUnit$1: function(unit) {
+      return this.conversionFactor$2(this._single_unit$_unit, unit) != null;
+    },
+    coerceValueToMatch$1: function(other) {
+      return this.convertValueToMatch$3(other, null, null);
+    },
+    convertValueToMatch$3: function(other, $name, otherName) {
+      var t1 = other instanceof L.SingleUnitSassNumber0 ? this._single_unit$_coerceValueToUnit$1(other._single_unit$_unit) : null;
+      return t1 == null ? this.super$SassNumber$convertValueToMatch0(other, $name, otherName) : t1;
+    },
+    coerce$2: function(newNumerators, newDenominators) {
+      var t1 = J.getInterceptor$asx(newNumerators);
+      t1 = t1.get$length(newNumerators) === 1 && newDenominators.length === 0 ? this._single_unit$_coerceToUnit$1(t1.$index(newNumerators, 0)) : null;
+      return t1 == null ? this.super$SassNumber$coerce0(newNumerators, newDenominators, null) : t1;
+    },
+    coerceValue$3: function(newNumerators, newDenominators, $name) {
+      var t1 = J.getInterceptor$asx(newNumerators);
+      t1 = t1.get$length(newNumerators) === 1 && newDenominators.length === 0 ? this._single_unit$_coerceValueToUnit$1(t1.$index(newNumerators, 0)) : null;
+      return t1 == null ? this.super$SassNumber$coerceValue0(newNumerators, newDenominators, $name) : t1;
+    },
+    coerceValueToUnit$2: function(unit, $name) {
+      var t1 = this._single_unit$_coerceValueToUnit$1(unit);
+      return t1 == null ? this.super$SassNumber$coerceValueToUnit0(unit, $name) : t1;
+    },
+    _single_unit$_coerceToUnit$1: function(unit) {
+      var factor, _this = this,
+        t1 = _this._single_unit$_unit;
+      if (t1 == unit)
+        return _this;
+      factor = _this.conversionFactor$2(unit, t1);
+      return factor == null ? null : new L.SingleUnitSassNumber0(unit, _this.value * factor, null);
+    },
+    _single_unit$_coerceValueToUnit$1: function(unit) {
+      var factor = this.conversionFactor$2(unit, this._single_unit$_unit);
+      return factor == null ? null : this.value * factor;
+    },
+    multiplyUnits$3: function(value, otherNumerators, otherDenominators) {
+      var mutableOtherDenominators, t1 = {};
+      t1.value = value;
+      t1.newNumerators = otherNumerators;
+      mutableOtherDenominators = J.toList$0$ax(otherDenominators);
+      B.removeFirstWhere0(mutableOtherDenominators, new L.SingleUnitSassNumber_multiplyUnits_closure1(t1, this), new L.SingleUnitSassNumber_multiplyUnits_closure2(t1, this));
+      return T.SassNumber_SassNumber$withUnits0(t1.value, mutableOtherDenominators, t1.newNumerators);
+    },
+    unaryMinus$0: function() {
+      return new L.SingleUnitSassNumber0(this._single_unit$_unit, -this.value, null);
+    },
+    $eq: function(_, other) {
+      var factor;
+      if (other == null)
+        return false;
+      if (other instanceof L.SingleUnitSassNumber0) {
+        factor = this.conversionFactor$2(other._single_unit$_unit, this._single_unit$_unit);
+        return factor != null && Math.abs(this.value * factor - other.value) < $.$get$epsilon0();
+      } else
+        return false;
+    },
+    get$hashCode: function(_) {
+      return T.fuzzyHashCode0(this.value * this.canonicalMultiplierForUnit$1(this._single_unit$_unit));
+    }
+  };
+  L.SingleUnitSassNumber_multiplyUnits_closure1.prototype = {
+    call$1: function(denominator) {
+      var t1 = this.$this,
+        factor = t1.conversionFactor$2(denominator, t1._single_unit$_unit);
+      if (factor == null)
+        return false;
+      this._box_0.value *= factor;
+      return true;
+    },
+    $signature: 6
+  };
+  L.SingleUnitSassNumber_multiplyUnits_closure2.prototype = {
+    call$0: function() {
+      var t2, t3,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      t1.push(this.$this._single_unit$_unit);
+      for (t2 = this._box_0, t3 = J.get$iterator$ax(t2.newNumerators); t3.moveNext$0();)
+        t1.push(t3.get$current(t3));
+      t2.newNumerators = t1;
+      return null;
+    },
+    $signature: 0
+  };
+  D.SourceMapBuffer.prototype = {
+    get$sourceFiles: function() {
+      var t2, t3,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_SourceFile);
+      for (t2 = this._source_map_buffer$_sourceFiles, t2 = t2.get$entries(t2), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t1.$indexSet(0, J.toString$0$(t3.key), t3.value);
+      }
+      return new P.UnmodifiableMapView(t1, type$.UnmodifiableMapView_of_legacy_String_and_legacy_SourceFile);
+    },
+    get$_targetLocation: function() {
+      var t1 = this._source_map_buffer$_buffer._contents,
+        t2 = this._line;
+      return V.SourceLocation$(t1.length, this._column, t2, null);
+    },
+    get$length: function(_) {
+      return this._source_map_buffer$_buffer._contents.length;
+    },
+    forSpan$1$2: function(span, callback) {
+      var t1, _this = this,
+        wasInSpan = _this._inSpan;
+      _this._inSpan = true;
+      _this._source_map_buffer$_addEntry$2(Y.FileLocation$_(span.file, span._file$_start), _this.get$_targetLocation());
+      try {
+        t1 = callback.call$0();
+        return t1;
+      } finally {
+        _this._inSpan = wasInSpan;
+      }
+    },
+    forSpan$2: function(span, callback) {
+      return this.forSpan$1$2(span, callback, type$.dynamic);
+    },
+    _source_map_buffer$_addEntry$2: function(source, target) {
+      var entry, t2,
+        t1 = this._entries;
+      if (t1.length !== 0) {
+        entry = C.JSArray_methods.get$last(t1);
+        t2 = entry.source;
+        if (t2.file.getLine$1(t2.offset) == source.file.getLine$1(source.offset) && entry.target.line === target.line)
+          return;
+        if (entry.target.offset === target.offset)
+          return;
+      }
+      this._source_map_buffer$_sourceFiles.putIfAbsent$2(source.file.url, new D.SourceMapBuffer__addEntry_closure0(source));
+      t1.push(new L.Entry(source, target, null));
+    },
+    write$1: function(_, object) {
+      var t1, i,
+        string = J.toString$0$(object);
+      this._source_map_buffer$_buffer._contents += H.S(string);
+      for (t1 = string.length, i = 0; i < t1; ++i)
+        if (C.JSString_methods._codeUnitAt$1(string, i) === 10)
+          this._writeLine$0();
+        else
+          ++this._column;
+    },
+    writeCharCode$1: function(charCode) {
+      this._source_map_buffer$_buffer._contents += H.Primitives_stringFromCharCode(charCode);
+      if (charCode === 10)
+        this._writeLine$0();
+      else
+        ++this._column;
+    },
+    _writeLine$0: function() {
+      var _this = this,
+        t1 = _this._entries;
+      if (C.JSArray_methods.get$last(t1).target.line === _this._line && C.JSArray_methods.get$last(t1).target.column === _this._column)
+        t1.pop();
+      ++_this._line;
+      _this._column = 0;
+      if (_this._inSpan)
+        t1.push(new L.Entry(C.JSArray_methods.get$last(t1).source, _this.get$_targetLocation(), null));
+    },
+    toString$0: function(_) {
+      var t1 = this._source_map_buffer$_buffer._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    buildSourceMap$1$prefix: function(prefix) {
+      var i, t2, prefixColumn, _box_0 = {},
+        t1 = prefix.length;
+      if (t1 === 0)
+        return T.SingleMapping_SingleMapping$fromEntries(this._entries);
+      _box_0.prefixColumn = _box_0.prefixLines = 0;
+      for (i = 0, t2 = 0; i < t1; ++i)
+        if (C.JSString_methods._codeUnitAt$1(prefix, i) === 10) {
+          ++_box_0.prefixLines;
+          _box_0.prefixColumn = 0;
+          t2 = 0;
+        } else {
+          prefixColumn = t2 + 1;
+          _box_0.prefixColumn = prefixColumn;
+          t2 = prefixColumn;
+        }
+      t2 = this._entries;
+      return T.SingleMapping_SingleMapping$fromEntries(new H.MappedListIterable(t2, new D.SourceMapBuffer_buildSourceMap_closure0(_box_0, t1), H._arrayInstanceType(t2)._eval$1("MappedListIterable<1,Entry*>")));
+    },
+    $isStringBuffer: 1
+  };
+  D.SourceMapBuffer__addEntry_closure0.prototype = {
+    call$0: function() {
+      return this.source.file;
+    },
+    $signature: 124
+  };
+  D.SourceMapBuffer_buildSourceMap_closure0.prototype = {
+    call$1: function(entry) {
+      var t1 = entry.source,
+        t2 = entry.target,
+        t3 = t2.line,
+        t4 = this._box_0,
+        t5 = t4.prefixLines;
+      t4 = t3 === 0 ? t4.prefixColumn : 0;
+      return new L.Entry(t1, V.SourceLocation$(t2.offset + this.prefixLength, t2.column + t4, t3 + t5, null), entry.identifierName);
+    },
+    $signature: 207
+  };
+  Q.StaticImport0.prototype = {
+    toString$0: function(_) {
+      var t1 = this.url.toString$0(0),
+        t2 = this.supports;
+      if (t2 != null)
+        t1 += " supports(" + t2.toString$0(0) + ")";
+      t2 = this.media;
+      if (t2 != null)
+        t1 += " " + t2.toString$0(0);
+      t1 += H.Primitives_stringFromCharCode(59);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isImport0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  S.StderrLogger0.prototype = {
+    warn$4$deprecation$span$trace: function(_, message, deprecation, span, trace) {
+      var t1;
+      if (deprecation)
+        J.write$1$x($.$get$stderr0()._node1$_stderr, "DEPRECATION ");
+      J.write$1$x($.$get$stderr0()._node1$_stderr, "WARNING");
+      if (span == null) {
+        t1 = $.$get$stderr0();
+        t1.writeln$1(": " + H.S(message));
+      } else if (trace != null) {
+        t1 = $.$get$stderr0();
+        t1.writeln$1(": " + H.S(message) + "\n\n" + span.highlight$1$color(false));
+      } else {
+        t1 = $.$get$stderr0();
+        t1.writeln$1(" on " + span.message$2$color(0, C.JSString_methods.$add("\n", message), false));
+      }
+      if (trace != null)
+        t1.writeln$1(B.indent0(C.JSString_methods.trimRight$0(trace.toString$0(0)), 4));
+      t1.writeln$0();
+    },
+    warn$2$span: function($receiver, message, span) {
+      return this.warn$4$deprecation$span$trace($receiver, message, false, span, null);
+    },
+    warn$2$deprecation: function($receiver, message, deprecation) {
+      return this.warn$4$deprecation$span$trace($receiver, message, deprecation, null, null);
+    },
+    warn$3$deprecation$span: function($receiver, message, deprecation, span) {
+      return this.warn$4$deprecation$span$trace($receiver, message, deprecation, span, null);
+    },
+    warn$2$trace: function($receiver, message, trace) {
+      return this.warn$4$deprecation$span$trace($receiver, message, false, null, trace);
+    },
+    debug$2: function(_, message, span) {
+      var url, t3, t4,
+        t1 = span.file,
+        t2 = span._file$_start;
+      if (Y.FileLocation$_(t1, t2).file.url == null)
+        url = "-";
+      else {
+        t3 = Y.FileLocation$_(t1, t2);
+        url = $.$get$context().prettyUri$1(t3.file.url);
+      }
+      t3 = $.$get$stderr0();
+      t4 = H.S(url) + ":";
+      t2 = Y.FileLocation$_(t1, t2);
+      t2 = t4 + (t2.file.getLine$1(t2.offset) + 1) + " ";
+      t4 = t3._node1$_stderr;
+      J.write$1$x(t4, t2);
+      J.write$1$x(t4, "DEBUG");
+      t3.writeln$1(": " + H.S(message));
+    }
+  };
+  D.StringExpression0.prototype = {
+    get$span: function() {
+      return this.text.span;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitStringExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    asInterpolation$1$static: function($static) {
+      var quote, t1, t2, buffer, t3, t4, t5, t6, _i, value, t7, t8, i, codeUnit, next, t9, _this = this;
+      if (!_this.hasQuotes)
+        return _this.text;
+      quote = _this._string0$_bestQuote$0();
+      t1 = new P.StringBuffer("");
+      t2 = [];
+      buffer = new Z.InterpolationBuffer0(t1, t2);
+      t1._contents += H.Primitives_stringFromCharCode(quote);
+      for (t3 = _this.text, t4 = t3.contents, t5 = t4.length, t6 = type$.legacy_Expression_2, _i = 0; _i < t5; ++_i) {
+        value = t4[_i];
+        if (t6._is(value)) {
+          buffer._interpolation_buffer0$_flushText$0();
+          t2.push(value);
+        } else if (typeof value == "string")
+          for (t7 = value.length, t8 = t7 - 1, i = 0; i < t7; ++i) {
+            codeUnit = C.JSString_methods._codeUnitAt$1(value, i);
+            if (codeUnit === 10 || codeUnit === 13 || codeUnit === 12) {
+              t1._contents += H.Primitives_stringFromCharCode(92);
+              t1._contents += H.Primitives_stringFromCharCode(97);
+              if (i !== t8) {
+                next = C.JSString_methods._codeUnitAt$1(value, i + 1);
+                if (next === 32 || next === 9 || next === 10 || next === 13 || next === 12 || T.isHex0(next))
+                  t1._contents += H.Primitives_stringFromCharCode(32);
+              }
+            } else {
+              if (codeUnit !== quote)
+                if (codeUnit !== 92)
+                  t9 = $static && codeUnit === 35 && i < t8 && C.JSString_methods._codeUnitAt$1(value, i + 1) === 123;
+                else
+                  t9 = true;
+              else
+                t9 = true;
+              if (t9)
+                t1._contents += H.Primitives_stringFromCharCode(92);
+              t1._contents += H.Primitives_stringFromCharCode(codeUnit);
+            }
+          }
+      }
+      t1._contents += H.Primitives_stringFromCharCode(quote);
+      return buffer.interpolation$1(t3.span);
+    },
+    asInterpolation$0: function() {
+      return this.asInterpolation$1$static(false);
+    },
+    _string0$_bestQuote$0: function() {
+      var t1, t2, containsDoubleQuote, _i, value, t3, i, codeUnit;
+      for (t1 = this.text.contents, t2 = t1.length, containsDoubleQuote = false, _i = 0; _i < t2; ++_i) {
+        value = t1[_i];
+        if (typeof value == "string")
+          for (t3 = value.length, i = 0; i < t3; ++i) {
+            codeUnit = C.JSString_methods._codeUnitAt$1(value, i);
+            if (codeUnit === 39)
+              return 34;
+            if (codeUnit === 34)
+              containsDoubleQuote = true;
+          }
+      }
+      return containsDoubleQuote ? 39 : 34;
+    },
+    toString$0: function(_) {
+      return this.asInterpolation$0().toString$0(0);
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1
+  };
+  D.closure123.prototype = {
+    call$1: function($arguments) {
+      var string = J.$index$asx($arguments, 0).assertString$1("string");
+      if (!string.hasQuotes)
+        return string;
+      return new D.SassString0(string.text, false);
+    },
+    $signature: 17
+  };
+  D.closure122.prototype = {
+    call$1: function($arguments) {
+      var string = J.$index$asx($arguments, 0).assertString$1("string");
+      if (string.hasQuotes)
+        return string;
+      return new D.SassString0(string.text, true);
+    },
+    $signature: 17
+  };
+  D.closure118.prototype = {
+    call$1: function($arguments) {
+      var t1 = J.$index$asx($arguments, 0).assertString$1("string").get$sassLength();
+      return new N.UnitlessSassNumber0(t1, null);
+    },
+    $signature: 10
+  };
+  D.closure117.prototype = {
+    call$1: function($arguments) {
+      var indexInt, codeUnitIndex, _s5_ = "index",
+        t1 = J.getInterceptor$asx($arguments),
+        string = t1.$index($arguments, 0).assertString$1("string"),
+        insert = t1.$index($arguments, 1).assertString$1("insert"),
+        index = t1.$index($arguments, 2).assertNumber$1(_s5_);
+      index.assertNoUnits$1(_s5_);
+      indexInt = index.assertInt$1(_s5_);
+      if (indexInt < 0)
+        indexInt = string.get$sassLength() + indexInt + 2;
+      t1 = string.text;
+      codeUnitIndex = B.codepointIndexToCodeUnitIndex0(t1, D._codepointForIndex0(indexInt, string.get$sassLength(), false));
+      return new D.SassString0(J.replaceRange$3$asx(t1, codeUnitIndex, codeUnitIndex, insert.text), string.hasQuotes);
+    },
+    $signature: 17
+  };
+  D.closure116.prototype = {
+    call$1: function($arguments) {
+      var codepointIndex,
+        t1 = J.getInterceptor$asx($arguments),
+        t2 = t1.$index($arguments, 0).assertString$1("string").text,
+        codeUnitIndex = J.indexOf$1$asx(t2, t1.$index($arguments, 1).assertString$1("substring").text);
+      if (codeUnitIndex === -1)
+        return C.C_SassNull;
+      codepointIndex = B.codeUnitIndexToCodepointIndex0(t2, codeUnitIndex);
+      return new N.UnitlessSassNumber0(codepointIndex + 1, null);
+    },
+    $signature: 3
+  };
+  D.closure115.prototype = {
+    call$1: function($arguments) {
+      var lengthInCodepoints, endInt, startCodepoint, endCodepoint,
+        t1 = J.getInterceptor$asx($arguments),
+        string = t1.$index($arguments, 0).assertString$1("string"),
+        start = t1.$index($arguments, 1).assertNumber$1("start-at"),
+        end = t1.$index($arguments, 2).assertNumber$1("end-at");
+      start.assertNoUnits$1("start");
+      end.assertNoUnits$1("end");
+      lengthInCodepoints = string.get$sassLength();
+      endInt = end.assertInt$0();
+      if (endInt === 0)
+        return string.hasQuotes ? $.$get$_emptyQuoted0() : $.$get$_emptyUnquoted0();
+      startCodepoint = D._codepointForIndex0(start.assertInt$0(), lengthInCodepoints, false);
+      endCodepoint = D._codepointForIndex0(endInt, lengthInCodepoints, true);
+      if (endCodepoint === lengthInCodepoints)
+        --endCodepoint;
+      if (endCodepoint < startCodepoint)
+        return string.hasQuotes ? $.$get$_emptyQuoted0() : $.$get$_emptyUnquoted0();
+      t1 = string.text;
+      return new D.SassString0(J.substring$2$s(t1, B.codepointIndexToCodeUnitIndex0(t1, startCodepoint), B.codepointIndexToCodeUnitIndex0(t1, endCodepoint + 1)), string.hasQuotes);
+    },
+    $signature: 17
+  };
+  D.closure121.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, t3, i, t4, t5,
+        string = J.$index$asx($arguments, 0).assertString$1("string");
+      for (t1 = string.text, t2 = t1.length, t3 = J.getInterceptor$s(t1), i = 0, t4 = ""; i < t2; ++i) {
+        t5 = t3._codeUnitAt$1(t1, i);
+        t4 += H.Primitives_stringFromCharCode(t5 >= 97 && t5 <= 122 ? t5 & 4294967263 : t5);
+      }
+      return new D.SassString0(t4.charCodeAt(0) == 0 ? t4 : t4, string.hasQuotes);
+    },
+    $signature: 17
+  };
+  D.closure120.prototype = {
+    call$1: function($arguments) {
+      var t1, t2, t3, i, t4, t5,
+        string = J.$index$asx($arguments, 0).assertString$1("string");
+      for (t1 = string.text, t2 = t1.length, t3 = J.getInterceptor$s(t1), i = 0, t4 = ""; i < t2; ++i) {
+        t5 = t3._codeUnitAt$1(t1, i);
+        t4 += H.Primitives_stringFromCharCode(t5 >= 65 && t5 <= 90 ? t5 | 32 : t5);
+      }
+      return new D.SassString0(t4.charCodeAt(0) == 0 ? t4 : t4, string.hasQuotes);
+    },
+    $signature: 17
+  };
+  D.closure119.prototype = {
+    call$1: function($arguments) {
+      var t1 = $.$get$_previousUniqueId0() + ($.$get$_random1().nextInt$1(36) + 1);
+      $._previousUniqueId0 = t1;
+      if (t1 > Math.pow(36, 6))
+        $._previousUniqueId0 = C.JSInt_methods.$mod($.$get$_previousUniqueId0(), H._asIntS(Math.pow(36, 6)));
+      return new D.SassString0("u" + C.JSString_methods.padLeft$2(J.toRadixString$1$n($.$get$_previousUniqueId0(), 36), 6, "0"), false);
+    },
+    $signature: 17
+  };
+  D._NodeSassString.prototype = {};
+  D.closure228.prototype = {
+    call$3: function(thisArg, value, dartValue) {
+      J.set$dartValue$x(thisArg, dartValue == null ? new D.SassString0(value, false) : dartValue);
+    },
+    call$2: function(thisArg, value) {
+      return this.call$3(thisArg, value, null);
+    },
+    "call*": "call$3",
+    $requiredArgCount: 2,
+    $defaultValues: function() {
+      return [null];
+    },
+    $signature: 429
+  };
+  D.closure229.prototype = {
+    call$1: function(thisArg) {
+      return J.get$dartValue$x(thisArg).text;
+    },
+    $signature: 189
+  };
+  D.closure230.prototype = {
+    call$2: function(thisArg, value) {
+      J.set$dartValue$x(thisArg, new D.SassString0(value, false));
+    },
+    "call*": "call$2",
+    $requiredArgCount: 2,
+    $signature: 431
+  };
+  D.closure231.prototype = {
+    call$1: function(thisArg) {
+      return J.toString$0$(J.get$dartValue$x(thisArg));
+    },
+    $signature: 189
+  };
+  D.SassString0.prototype = {
+    get$sassLength: function() {
+      var t1 = this._string$_sassLength;
+      if (t1 == null) {
+        t1 = this.text;
+        t1.toString;
+        t1 = new P.Runes(t1);
+        t1 = this._string$_sassLength = t1.get$length(t1);
+      }
+      return t1;
+    },
+    get$isSpecialNumber: function() {
+      var t1, t2;
+      if (this.hasQuotes)
+        return false;
+      t1 = this.text;
+      if (t1.length < 6)
+        return false;
+      t2 = J.getInterceptor$s(t1)._codeUnitAt$1(t1, 0) | 32;
+      if (t2 === 99) {
+        t2 = C.JSString_methods._codeUnitAt$1(t1, 1) | 32;
+        if (t2 === 108) {
+          if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 97)
+            return false;
+          if ((C.JSString_methods._codeUnitAt$1(t1, 3) | 32) !== 109)
+            return false;
+          if ((C.JSString_methods._codeUnitAt$1(t1, 4) | 32) !== 112)
+            return false;
+          return C.JSString_methods._codeUnitAt$1(t1, 5) === 40;
+        } else if (t2 === 97) {
+          if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 108)
+            return false;
+          if ((C.JSString_methods._codeUnitAt$1(t1, 3) | 32) !== 99)
+            return false;
+          return C.JSString_methods._codeUnitAt$1(t1, 4) === 40;
+        } else
+          return false;
+      } else if (t2 === 118) {
+        if ((C.JSString_methods._codeUnitAt$1(t1, 1) | 32) !== 97)
+          return false;
+        if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 114)
+          return false;
+        return C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+      } else if (t2 === 101) {
+        if ((C.JSString_methods._codeUnitAt$1(t1, 1) | 32) !== 110)
+          return false;
+        if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 118)
+          return false;
+        return C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+      } else if (t2 === 109) {
+        t2 = C.JSString_methods._codeUnitAt$1(t1, 1) | 32;
+        if (t2 === 97) {
+          if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 120)
+            return false;
+          return C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+        } else if (t2 === 105) {
+          if ((C.JSString_methods._codeUnitAt$1(t1, 2) | 32) !== 110)
+            return false;
+          return C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+        } else
+          return false;
+      } else
+        return false;
+    },
+    get$isVar: function() {
+      if (this.hasQuotes)
+        return false;
+      var t1 = this.text;
+      if (t1.length < 8)
+        return false;
+      return (J.getInterceptor$s(t1)._codeUnitAt$1(t1, 0) | 32) === 118 && (C.JSString_methods._codeUnitAt$1(t1, 1) | 32) === 97 && (C.JSString_methods._codeUnitAt$1(t1, 2) | 32) === 114 && C.JSString_methods._codeUnitAt$1(t1, 3) === 40;
+    },
+    get$isBlank: function() {
+      return !this.hasQuotes && this.text.length === 0;
+    },
+    accept$1$1: function(visitor) {
+      var t1 = visitor._serialize0$_quote && this.hasQuotes,
+        t2 = this.text;
+      if (t1)
+        visitor._serialize0$_visitQuotedString$1(t2);
+      else
+        visitor._serialize0$_visitUnquotedString$1(t2);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    assertString$1: function($name) {
+      return this;
+    },
+    plus$1: function(other) {
+      var t1 = this.text,
+        t2 = this.hasQuotes;
+      if (other instanceof D.SassString0)
+        return new D.SassString0(J.$add$ansx(t1, other.text), t2);
+      else {
+        other.toString;
+        return new D.SassString0(J.$add$ansx(t1, N.serializeValue(other, false, true)), t2);
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof D.SassString0 && this.text == other.text;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.text);
+    }
+  };
+  X.ModifiableCssStyleRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssStyleRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return X.ModifiableCssStyleRule$0(this.selector, this.span, this.originalSelector);
+    },
+    $isCssStyleRule0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.StyleRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitStyleRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return this.selector.toString$0(0) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.CssStylesheet0.prototype = {
+    get$isGroupEnd: function() {
+      return false;
+    },
+    get$isChildless: function() {
+      return false;
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitCssStylesheet$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    get$children: function(receiver) {
+      return this.children;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.ModifiableCssStylesheet0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssStylesheet$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return V.ModifiableCssStylesheet$0(this.span);
+    },
+    $isCssStylesheet0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  V.StylesheetParser0.prototype = {
+    parse$0: function() {
+      return this.wrapSpanFormatException$1(new V.StylesheetParser_parse_closure0(this));
+    },
+    parseArgumentDeclaration$0: function() {
+      return this._stylesheet0$_parseSingleProduction$1$1(new V.StylesheetParser_parseArgumentDeclaration_closure0(this), type$.legacy_ArgumentDeclaration_2);
+    },
+    _stylesheet0$_parseSingleProduction$1$1: function(production, $T) {
+      return this.wrapSpanFormatException$1(new V.StylesheetParser__parseSingleProduction_closure0(this, production, $T));
+    },
+    parseSignature$0: function() {
+      return this.wrapSpanFormatException$1(new V.StylesheetParser_parseSignature_closure(this));
+    },
+    _stylesheet0$_statement$1$root: function(root) {
+      var t2, _this = this,
+        t1 = _this.scanner;
+      switch (t1.peekChar$0()) {
+        case 64:
+          return _this.atRule$2$root(new V.StylesheetParser__statement_closure0(_this), root);
+        case 43:
+          if (!_this.get$indented() || !_this.lookingAtIdentifier$1(1))
+            return _this._stylesheet0$_styleRule$0();
+          _this._stylesheet0$_isUseAllowed = false;
+          t2 = t1._string_scanner$_position;
+          t1.readChar$0();
+          return _this._stylesheet0$_includeRule$1(new S._SpanScannerState(t1, t2));
+        case 61:
+          if (!_this.get$indented())
+            return _this._stylesheet0$_styleRule$0();
+          _this._stylesheet0$_isUseAllowed = false;
+          t2 = t1._string_scanner$_position;
+          t1.readChar$0();
+          _this.whitespace$0();
+          return _this._stylesheet0$_mixinRule$1(new S._SpanScannerState(t1, t2));
+        case 125:
+          t1.error$2$length(0, 'unmatched "}".', 1);
+          break;
+        default:
+          return _this._stylesheet0$_inStyleRule || _this._stylesheet0$_inUnknownAtRule || _this._stylesheet0$_inMixin || _this._stylesheet0$_inContentBlock ? _this._stylesheet0$_declarationOrStyleRule$0() : _this._stylesheet0$_variableDeclarationOrStyleRule$0();
+      }
+    },
+    _stylesheet0$_statement$0: function() {
+      return this._stylesheet0$_statement$1$root(false);
+    },
+    variableDeclarationWithoutNamespace$2: function(namespace, start) {
+      var precedingComment, t1, $name, t2, value, flagStart, guarded, global, flag, endPosition, t3, t4, t5, declaration, _this = this, _box_0 = {};
+      _box_0.start = start;
+      precedingComment = _this.lastSilentComment;
+      _this.lastSilentComment = null;
+      if (start == null) {
+        t1 = _this.scanner;
+        _box_0.start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      }
+      $name = _this.variableName$0();
+      t1 = namespace != null;
+      if (t1)
+        _this._stylesheet0$_assertPublic$2($name, new V.StylesheetParser_variableDeclarationWithoutNamespace_closure1(_box_0, _this));
+      if (_this.get$plainCss())
+        _this.error$2(0, string$.Sass_v, _this.scanner.spanFrom$1(_box_0.start));
+      _this.whitespace$0();
+      t2 = _this.scanner;
+      t2.expectChar$1(58);
+      _this.whitespace$0();
+      value = _this.expression$0();
+      flagStart = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      for (guarded = false, global = false; t2.scanChar$1(33);) {
+        flag = _this.identifier$0();
+        if (flag === "default")
+          guarded = true;
+        else if (flag === "global") {
+          if (t1) {
+            endPosition = t2._string_scanner$_position;
+            t3 = t2._sourceFile;
+            t4 = flagStart.position;
+            t5 = new Y._FileSpan(t3, t4, endPosition);
+            t5._FileSpan$3(t3, t4, endPosition);
+            _this.error$2(0, string$.x21globa, t5);
+          }
+          global = true;
+        } else {
+          endPosition = t2._string_scanner$_position;
+          t3 = t2._sourceFile;
+          t4 = flagStart.position;
+          t5 = new Y._FileSpan(t3, t4, endPosition);
+          t5._FileSpan$3(t3, t4, endPosition);
+          _this.error$2(0, "Invalid flag name.", t5);
+        }
+        _this.whitespace$0();
+        flagStart = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      }
+      _this.expectStatementSeparator$1("variable declaration");
+      declaration = Z.VariableDeclaration$0($name, value, t2.spanFrom$1(_box_0.start), precedingComment, global, guarded, namespace);
+      if (global)
+        _this._stylesheet0$_globalVariables.putIfAbsent$2($name, new V.StylesheetParser_variableDeclarationWithoutNamespace_closure2(declaration));
+      return declaration;
+    },
+    variableDeclarationWithoutNamespace$0: function() {
+      return this.variableDeclarationWithoutNamespace$2(null, null);
+    },
+    _stylesheet0$_variableDeclarationOrStyleRule$0: function() {
+      var t1, t2, variableOrInterpolation, t3, _this = this;
+      if (_this.get$plainCss())
+        return _this._stylesheet0$_styleRule$0();
+      if (_this.get$indented() && _this.scanner.scanChar$1(92))
+        return _this._stylesheet0$_styleRule$0();
+      if (!_this.lookingAtIdentifier$0())
+        return _this._stylesheet0$_styleRule$0();
+      t1 = _this.scanner;
+      t2 = t1._string_scanner$_position;
+      variableOrInterpolation = _this._stylesheet0$_variableDeclarationOrInterpolation$0();
+      if (variableOrInterpolation instanceof Z.VariableDeclaration0)
+        return variableOrInterpolation;
+      else {
+        t3 = new Z.InterpolationBuffer0(new P.StringBuffer(""), []);
+        t3.addInterpolation$1(type$.legacy_Interpolation_2._as(variableOrInterpolation));
+        return _this._stylesheet0$_styleRule$2(t3, new S._SpanScannerState(t1, t2));
+      }
+    },
+    _stylesheet0$_declarationOrStyleRule$0: function() {
+      var t1, t2, declarationOrBuffer, _this = this;
+      if (_this.get$plainCss() && _this._stylesheet0$_inStyleRule && !_this._stylesheet0$_inUnknownAtRule)
+        return _this._stylesheet0$_propertyOrVariableDeclaration$0();
+      if (_this.get$indented() && _this.scanner.scanChar$1(92))
+        return _this._stylesheet0$_styleRule$0();
+      t1 = _this.scanner;
+      t2 = t1._string_scanner$_position;
+      declarationOrBuffer = _this._stylesheet0$_declarationOrBuffer$0();
+      return type$.legacy_Statement_2._is(declarationOrBuffer) ? declarationOrBuffer : _this._stylesheet0$_styleRule$2(type$.legacy_InterpolationBuffer_2._as(declarationOrBuffer), new S._SpanScannerState(t1, t2));
+    },
+    _stylesheet0$_declarationOrBuffer$0: function() {
+      var midBuffer, couldBeSelector, beforeDeclaration, additional, t3, startsWithPunctuation, variableOrInterpolation, t4, $name, postColonWhitespace, t5, value, exception, _this = this, t1 = {},
+        t2 = _this.scanner,
+        start = new S._SpanScannerState(t2, t2._string_scanner$_position),
+        nameBuffer = new Z.InterpolationBuffer0(new P.StringBuffer(""), []),
+        first = t2.peekChar$0();
+      if (first !== 58)
+        if (first !== 42)
+          if (first !== 46)
+            t3 = first === 35 && t2.peekChar$1(1) !== 123;
+          else
+            t3 = true;
+        else
+          t3 = true;
+      else
+        t3 = true;
+      if (t3) {
+        t3 = t2.readChar$0();
+        nameBuffer._interpolation_buffer0$_text._contents += H.Primitives_stringFromCharCode(t3);
+        t3 = _this.rawText$1(_this.get$whitespace());
+        nameBuffer._interpolation_buffer0$_text._contents += t3;
+        startsWithPunctuation = true;
+      } else
+        startsWithPunctuation = false;
+      if (!_this._stylesheet0$_lookingAtInterpolatedIdentifier$0())
+        return nameBuffer;
+      variableOrInterpolation = startsWithPunctuation ? _this.interpolatedIdentifier$0() : _this._stylesheet0$_variableDeclarationOrInterpolation$0();
+      if (variableOrInterpolation instanceof Z.VariableDeclaration0)
+        return variableOrInterpolation;
+      else
+        nameBuffer.addInterpolation$1(type$.legacy_Interpolation_2._as(variableOrInterpolation));
+      _this._stylesheet0$_isUseAllowed = false;
+      if (t2.matches$1("/*")) {
+        t3 = _this.rawText$1(_this.get$loudComment());
+        nameBuffer._interpolation_buffer0$_text._contents += t3;
+      }
+      midBuffer = new P.StringBuffer("");
+      t3 = _this.get$whitespace();
+      midBuffer._contents += _this.rawText$1(t3);
+      t4 = t2._string_scanner$_position;
+      if (!t2.scanChar$1(58)) {
+        if (midBuffer._contents.length !== 0)
+          nameBuffer._interpolation_buffer0$_text._contents += H.Primitives_stringFromCharCode(32);
+        return nameBuffer;
+      }
+      midBuffer._contents += H.Primitives_stringFromCharCode(58);
+      $name = nameBuffer.interpolation$1(t2.spanFrom$2(start, new S._SpanScannerState(t2, t4)));
+      if (C.JSString_methods.startsWith$1($name.get$initialPlain(), "--")) {
+        t1 = _this._stylesheet0$_interpolatedDeclarationValue$0();
+        _this.expectStatementSeparator$1("custom property");
+        return L.Declaration$0($name, t2.spanFrom$1(start), null, new D.StringExpression0(t1, false));
+      }
+      if (t2.scanChar$1(58)) {
+        t1 = nameBuffer;
+        t2 = t1._interpolation_buffer0$_text;
+        t2._contents += H.S(midBuffer);
+        t2._contents += H.Primitives_stringFromCharCode(58);
+        return t1;
+      } else if (_this.get$indented() && _this._stylesheet0$_lookingAtInterpolatedIdentifier$0()) {
+        t1 = nameBuffer;
+        t1._interpolation_buffer0$_text._contents += H.S(midBuffer);
+        return t1;
+      }
+      postColonWhitespace = _this.rawText$1(t3);
+      if (_this.lookingAtChildren$0())
+        return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_declarationChild(), start, new V.StylesheetParser__declarationOrBuffer_closure1($name));
+      midBuffer._contents += postColonWhitespace;
+      couldBeSelector = postColonWhitespace.length === 0 && _this._stylesheet0$_lookingAtInterpolatedIdentifier$0();
+      beforeDeclaration = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      t1.value = null;
+      try {
+        if (_this.lookingAtChildren$0()) {
+          t3 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
+          t4 = Y.FileLocation$_(t2._sourceFile, t2._string_scanner$_position);
+          t5 = t4.offset;
+          value = new D.StringExpression0(X.Interpolation$0(t3, Y._FileSpan$(t4.file, t5, t5)), true);
+        } else
+          value = _this.expression$0();
+        t3 = t1.value = value;
+        if (_this.lookingAtChildren$0()) {
+          if (couldBeSelector)
+            _this.expectStatementSeparator$0();
+        } else if (!_this.atEndOfStatement$0())
+          _this.expectStatementSeparator$0();
+      } catch (exception) {
+        if (type$.legacy_FormatException._is(H.unwrapException(exception))) {
+          if (!couldBeSelector)
+            throw exception;
+          t2.set$state(beforeDeclaration);
+          additional = _this.almostAnyValue$0();
+          if (!_this.get$indented() && t2.peekChar$0() === 59)
+            throw exception;
+          nameBuffer._interpolation_buffer0$_text._contents += H.S(midBuffer);
+          nameBuffer.addInterpolation$1(additional);
+          return nameBuffer;
+        } else
+          throw exception;
+      }
+      if (_this.lookingAtChildren$0())
+        return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_declarationChild(), start, new V.StylesheetParser__declarationOrBuffer_closure2(t1, $name));
+      else {
+        _this.expectStatementSeparator$0();
+        return L.Declaration$0($name, t2.spanFrom$1(start), null, t3);
+      }
+    },
+    _stylesheet0$_variableDeclarationOrInterpolation$0: function() {
+      var t1, start, identifier, t2, buffer, _this = this;
+      if (!_this.lookingAtIdentifier$0())
+        return _this.interpolatedIdentifier$0();
+      t1 = _this.scanner;
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      identifier = _this.identifier$0();
+      if (t1.matches$1(".$")) {
+        t1.readChar$0();
+        return _this.variableDeclarationWithoutNamespace$2(identifier, start);
+      } else {
+        t2 = new P.StringBuffer("");
+        buffer = new Z.InterpolationBuffer0(t2, []);
+        t2._contents = identifier;
+        if (_this._stylesheet0$_lookingAtInterpolatedIdentifierBody$0())
+          buffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+        return buffer.interpolation$1(t1.spanFrom$1(start));
+      }
+    },
+    _stylesheet0$_styleRule$2: function(buffer, start) {
+      var t2, interpolation, t3, wasInStyleRule, _this = this, t1 = {};
+      t1.start = start;
+      _this._stylesheet0$_isUseAllowed = false;
+      if (start == null) {
+        t2 = _this.scanner;
+        t2 = t1.start = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      } else
+        t2 = start;
+      interpolation = t1.interpolation = _this.styleRuleSelector$0();
+      if (buffer != null) {
+        buffer.addInterpolation$1(interpolation);
+        t3 = t1.interpolation = buffer.interpolation$1(_this.scanner.spanFrom$1(t2));
+      } else
+        t3 = interpolation;
+      if (t3.contents.length === 0)
+        _this.scanner.error$1(0, 'expected "}".');
+      wasInStyleRule = _this._stylesheet0$_inStyleRule;
+      _this._stylesheet0$_inStyleRule = true;
+      return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_statement(), t2, new V.StylesheetParser__styleRule_closure0(t1, _this, wasInStyleRule));
+    },
+    _stylesheet0$_styleRule$0: function() {
+      return this._stylesheet0$_styleRule$2(null, null);
+    },
+    _stylesheet0$_propertyOrVariableDeclaration$1$parseCustomProperties: function(parseCustomProperties) {
+      var first, t3, nameBuffer, variableOrInterpolation, $name, value, _this = this,
+        _s48_ = string$.Nested,
+        t1 = {},
+        t2 = _this.scanner,
+        start = new S._SpanScannerState(t2, t2._string_scanner$_position);
+      t1.name = null;
+      first = t2.peekChar$0();
+      if (first !== 58)
+        if (first !== 42)
+          if (first !== 46)
+            t3 = first === 35 && t2.peekChar$1(1) !== 123;
+          else
+            t3 = true;
+        else
+          t3 = true;
+      else
+        t3 = true;
+      if (t3) {
+        t3 = new P.StringBuffer("");
+        nameBuffer = new Z.InterpolationBuffer0(t3, []);
+        t3._contents += H.Primitives_stringFromCharCode(t2.readChar$0());
+        t3._contents += _this.rawText$1(_this.get$whitespace());
+        nameBuffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+        t3 = t1.name = nameBuffer.interpolation$1(t2.spanFrom$1(start));
+      } else if (!_this.get$plainCss()) {
+        variableOrInterpolation = _this._stylesheet0$_variableDeclarationOrInterpolation$0();
+        if (variableOrInterpolation instanceof Z.VariableDeclaration0)
+          return variableOrInterpolation;
+        else {
+          type$.legacy_Interpolation_2._as(variableOrInterpolation);
+          t1.name = variableOrInterpolation;
+        }
+        t3 = variableOrInterpolation;
+      } else {
+        $name = _this.interpolatedIdentifier$0();
+        t1.name = $name;
+        t3 = $name;
+      }
+      _this.whitespace$0();
+      t2.expectChar$1(58);
+      if (parseCustomProperties && C.JSString_methods.startsWith$1(t3.get$initialPlain(), "--")) {
+        t1 = _this._stylesheet0$_interpolatedDeclarationValue$0();
+        _this.expectStatementSeparator$1("custom property");
+        return L.Declaration$0(t3, t2.spanFrom$1(start), null, new D.StringExpression0(t1, false));
+      }
+      _this.whitespace$0();
+      if (_this.lookingAtChildren$0()) {
+        if (_this.get$plainCss())
+          t2.error$1(0, _s48_);
+        return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_declarationChild(), start, new V.StylesheetParser__propertyOrVariableDeclaration_closure1(t1));
+      }
+      value = _this.expression$0();
+      if (_this.lookingAtChildren$0()) {
+        if (_this.get$plainCss())
+          t2.error$1(0, _s48_);
+        return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_declarationChild(), start, new V.StylesheetParser__propertyOrVariableDeclaration_closure2(t1, value));
+      } else {
+        _this.expectStatementSeparator$0();
+        return L.Declaration$0(t3, t2.spanFrom$1(start), null, value);
+      }
+    },
+    _stylesheet0$_propertyOrVariableDeclaration$0: function() {
+      return this._stylesheet0$_propertyOrVariableDeclaration$1$parseCustomProperties(true);
+    },
+    _stylesheet0$_declarationChild$0: function() {
+      if (this.scanner.peekChar$0() === 64)
+        return this._stylesheet0$_declarationAtRule$0();
+      return this._stylesheet0$_propertyOrVariableDeclaration$1$parseCustomProperties(false);
+    },
+    atRule$2$root: function(child, root) {
+      var $name, wasUseAllowed, value, optional, url, namespace, configuration, span, _this = this,
+        _s9_ = "@use rule",
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expectChar$2$name(64, "@-rule");
+      $name = _this.interpolatedIdentifier$0();
+      _this.whitespace$0();
+      wasUseAllowed = _this._stylesheet0$_isUseAllowed;
+      _this._stylesheet0$_isUseAllowed = false;
+      switch ($name.get$asPlain()) {
+        case "at-root":
+          return _this._stylesheet0$_atRootRule$1(start);
+        case "charset":
+          _this._stylesheet0$_isUseAllowed = wasUseAllowed;
+          if (!root)
+            _this._stylesheet0$_disallowedAtRule$1(start);
+          _this.string$0();
+          return null;
+        case "content":
+          return _this._stylesheet0$_contentRule$1(start);
+        case "debug":
+          return _this._stylesheet0$_debugRule$1(start);
+        case "each":
+          return _this._stylesheet0$_eachRule$2(start, child);
+        case "else":
+          return _this._stylesheet0$_disallowedAtRule$1(start);
+        case "error":
+          return _this._stylesheet0$_errorRule$1(start);
+        case "extend":
+          if (!_this._stylesheet0$_inStyleRule && !_this._stylesheet0$_inMixin && !_this._stylesheet0$_inContentBlock)
+            _this.error$2(0, string$.x40exten, t1.spanFrom$1(start));
+          value = _this.almostAnyValue$0();
+          optional = t1.scanChar$1(33);
+          if (optional)
+            _this.expectIdentifier$1("optional");
+          _this.expectStatementSeparator$1("@extend rule");
+          return new X.ExtendRule0(value, optional, t1.spanFrom$1(start));
+        case "for":
+          return _this._stylesheet0$_forRule$2(start, child);
+        case "forward":
+          _this._stylesheet0$_isUseAllowed = wasUseAllowed;
+          if (!root)
+            _this._stylesheet0$_disallowedAtRule$1(start);
+          return _this._stylesheet0$_forwardRule$1(start);
+        case "function":
+          return _this._stylesheet0$_functionRule$1(start);
+        case "if":
+          return _this._stylesheet0$_ifRule$2(start, child);
+        case "import":
+          return _this._stylesheet0$_importRule$1(start);
+        case "include":
+          return _this._stylesheet0$_includeRule$1(start);
+        case "media":
+          return _this.mediaRule$1(start);
+        case "mixin":
+          return _this._stylesheet0$_mixinRule$1(start);
+        case "-moz-document":
+          return _this.mozDocumentRule$2(start, $name);
+        case "return":
+          return _this._stylesheet0$_disallowedAtRule$1(start);
+        case "supports":
+          return _this.supportsRule$1(start);
+        case "use":
+          _this._stylesheet0$_isUseAllowed = wasUseAllowed;
+          if (!root)
+            _this._stylesheet0$_disallowedAtRule$1(start);
+          url = _this._stylesheet0$_urlString$0();
+          _this.whitespace$0();
+          namespace = _this._stylesheet0$_useNamespace$2(url, start);
+          _this.whitespace$0();
+          configuration = _this._stylesheet0$_configuration$0();
+          _this.expectStatementSeparator$1(_s9_);
+          span = t1.spanFrom$1(start);
+          if (!_this._stylesheet0$_isUseAllowed)
+            _this.error$2(0, string$.x40use_r, span);
+          _this.expectStatementSeparator$1(_s9_);
+          t1 = new T.UseRule0(url, namespace, configuration == null ? C.List_empty18 : P.List_List$unmodifiable(configuration, type$.legacy_ConfiguredVariable_2), span);
+          t1.UseRule$4$configuration0(url, namespace, span, configuration);
+          return t1;
+        case "warn":
+          return _this._stylesheet0$_warnRule$1(start);
+        case "while":
+          return _this._stylesheet0$_whileRule$2(start, child);
+        default:
+          return _this.unknownAtRule$2(start, $name);
+      }
+    },
+    _stylesheet0$_declarationAtRule$0: function() {
+      var _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      switch (_this._stylesheet0$_plainAtRuleName$0()) {
+        case "content":
+          return _this._stylesheet0$_contentRule$1(start);
+        case "debug":
+          return _this._stylesheet0$_debugRule$1(start);
+        case "each":
+          return _this._stylesheet0$_eachRule$2(start, _this.get$_stylesheet0$_declarationChild());
+        case "else":
+          return _this._stylesheet0$_disallowedAtRule$1(start);
+        case "error":
+          return _this._stylesheet0$_errorRule$1(start);
+        case "for":
+          return _this._stylesheet0$_forRule$2(start, _this.get$_stylesheet0$_declarationAtRule());
+        case "if":
+          return _this._stylesheet0$_ifRule$2(start, _this.get$_stylesheet0$_declarationChild());
+        case "include":
+          return _this._stylesheet0$_includeRule$1(start);
+        case "warn":
+          return _this._stylesheet0$_warnRule$1(start);
+        case "while":
+          return _this._stylesheet0$_whileRule$2(start, _this.get$_stylesheet0$_declarationChild());
+        default:
+          return _this._stylesheet0$_disallowedAtRule$1(start);
+      }
+    },
+    _stylesheet0$_functionChild$0: function() {
+      var state, variableDeclarationError, statement, t2, namespace, exception, t3, start, value, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() !== 64) {
+        t2 = t1._string_scanner$_position;
+        state = new S._SpanScannerState(t1, t2);
+        try {
+          namespace = _this.identifier$0();
+          t1.expectChar$1(46);
+          t2 = _this.variableDeclarationWithoutNamespace$2(namespace, new S._SpanScannerState(t1, t2));
+          return t2;
+        } catch (exception) {
+          t2 = H.unwrapException(exception);
+          t3 = type$.legacy_SourceSpanFormatException;
+          if (t3._is(t2)) {
+            variableDeclarationError = t2;
+            t1.set$state(state);
+            statement = null;
+            try {
+              statement = _this._stylesheet0$_declarationOrStyleRule$0();
+            } catch (exception) {
+              if (t3._is(H.unwrapException(exception)))
+                throw H.wrapException(variableDeclarationError);
+              else
+                throw exception;
+            }
+            _this.error$2(0, "@function rules may not contain " + (statement instanceof X.StyleRule0 ? "style rules" : "declarations") + ".", statement.get$span());
+          } else
+            throw exception;
+        }
+      }
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      switch (_this._stylesheet0$_plainAtRuleName$0()) {
+        case "debug":
+          return _this._stylesheet0$_debugRule$1(start);
+        case "each":
+          return _this._stylesheet0$_eachRule$2(start, _this.get$_stylesheet0$_functionChild());
+        case "else":
+          return _this._stylesheet0$_disallowedAtRule$1(start);
+        case "error":
+          return _this._stylesheet0$_errorRule$1(start);
+        case "for":
+          return _this._stylesheet0$_forRule$2(start, _this.get$_stylesheet0$_functionChild());
+        case "if":
+          return _this._stylesheet0$_ifRule$2(start, _this.get$_stylesheet0$_functionChild());
+        case "return":
+          value = _this.expression$0();
+          _this.expectStatementSeparator$1("@return rule");
+          return new B.ReturnRule0(value, t1.spanFrom$1(start));
+        case "warn":
+          return _this._stylesheet0$_warnRule$1(start);
+        case "while":
+          return _this._stylesheet0$_whileRule$2(start, _this.get$_stylesheet0$_functionChild());
+        default:
+          return _this._stylesheet0$_disallowedAtRule$1(start);
+      }
+    },
+    _stylesheet0$_plainAtRuleName$0: function() {
+      this.scanner.expectChar$2$name(64, "@-rule");
+      var $name = this.identifier$0();
+      this.whitespace$0();
+      return $name;
+    },
+    _stylesheet0$_atRootRule$1: function(start) {
+      var query, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() === 40) {
+        query = _this._stylesheet0$_atRootQuery$0();
+        _this.whitespace$0();
+        return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_statement(), start, new V.StylesheetParser__atRootRule_closure1(query));
+      } else if (_this.lookingAtChildren$0())
+        return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_statement(), start, new V.StylesheetParser__atRootRule_closure2());
+      else
+        return V.AtRootRule$0(H.setRuntimeTypeInfo([_this._stylesheet0$_styleRule$0()], type$.JSArray_legacy_Statement_2), t1.spanFrom$1(start), null);
+    },
+    _stylesheet0$_atRootQuery$0: function() {
+      var interpolation, t2, t3, t4, buffer, t5, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() === 35) {
+        interpolation = _this.singleInterpolation$0();
+        return X.Interpolation$0(H.setRuntimeTypeInfo([interpolation], type$.JSArray_legacy_Object), interpolation.get$span());
+      }
+      t2 = t1._string_scanner$_position;
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer0(t3, t4);
+      t1.expectChar$1(40);
+      t3._contents += H.Primitives_stringFromCharCode(40);
+      _this.whitespace$0();
+      t5 = _this.expression$0();
+      buffer._interpolation_buffer0$_flushText$0();
+      t4.push(t5);
+      if (t1.scanChar$1(58)) {
+        _this.whitespace$0();
+        t3._contents += H.Primitives_stringFromCharCode(58);
+        t3._contents += H.Primitives_stringFromCharCode(32);
+        t5 = _this.expression$0();
+        buffer._interpolation_buffer0$_flushText$0();
+        t4.push(t5);
+      }
+      t1.expectChar$1(41);
+      _this.whitespace$0();
+      t3._contents += H.Primitives_stringFromCharCode(41);
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _stylesheet0$_contentRule$1: function(start) {
+      var t1, $arguments, t2, t3, _this = this;
+      if (!_this._stylesheet0$_inMixin)
+        _this.error$2(0, string$.x40conte, _this.scanner.spanFrom$1(start));
+      _this.whitespace$0();
+      t1 = _this.scanner;
+      if (t1.peekChar$0() === 40)
+        $arguments = _this._stylesheet0$_argumentInvocation$1$mixin(true);
+      else {
+        t2 = Y.FileLocation$_(t1._sourceFile, t1._string_scanner$_position);
+        t3 = t2.offset;
+        $arguments = X.ArgumentInvocation$empty0(Y._FileSpan$(t2.file, t3, t3));
+      }
+      _this._stylesheet0$_mixinHasContent = true;
+      _this.expectStatementSeparator$1("@content rule");
+      return new Q.ContentRule0(t1.spanFrom$1(start), $arguments);
+    },
+    _stylesheet0$_debugRule$1: function(start) {
+      var value = this.expression$0();
+      this.expectStatementSeparator$1("@debug rule");
+      return new Q.DebugRule0(value, this.scanner.spanFrom$1(start));
+    },
+    _stylesheet0$_eachRule$2: function(start, child) {
+      var variables, t1, _this = this,
+        wasInControlDirective = _this._stylesheet0$_inControlDirective;
+      _this._stylesheet0$_inControlDirective = true;
+      variables = H.setRuntimeTypeInfo([_this.variableName$0()], type$.JSArray_legacy_String);
+      _this.whitespace$0();
+      for (t1 = _this.scanner; t1.scanChar$1(44);) {
+        _this.whitespace$0();
+        t1.expectChar$1(36);
+        variables.push(_this.identifier$1$normalize(true));
+        _this.whitespace$0();
+      }
+      _this.expectIdentifier$1("in");
+      _this.whitespace$0();
+      return _this._stylesheet0$_withChildren$3(child, start, new V.StylesheetParser__eachRule_closure0(_this, wasInControlDirective, variables, _this.expression$0()));
+    },
+    _stylesheet0$_errorRule$1: function(start) {
+      var value = this.expression$0();
+      this.expectStatementSeparator$1("@error rule");
+      return new D.ErrorRule0(value, this.scanner.spanFrom$1(start));
+    },
+    _stylesheet0$_functionRule$1: function(start) {
+      var $name, $arguments, _this = this,
+        precedingComment = _this.lastSilentComment;
+      _this.lastSilentComment = null;
+      $name = _this.identifier$1$normalize(true);
+      _this.whitespace$0();
+      $arguments = _this._stylesheet0$_argumentDeclaration$0();
+      if (_this._stylesheet0$_inMixin || _this._stylesheet0$_inContentBlock)
+        _this.error$2(0, string$.Mixinscf, _this.scanner.spanFrom$1(start));
+      else if (_this._stylesheet0$_inControlDirective)
+        _this.error$2(0, string$.Functi, _this.scanner.spanFrom$1(start));
+      switch (B.unvendor0($name)) {
+        case "calc":
+        case "element":
+        case "expression":
+        case "url":
+        case "and":
+        case "or":
+        case "not":
+        case "clamp":
+          _this.error$2(0, "Invalid function name.", _this.scanner.spanFrom$1(start));
+          break;
+      }
+      _this.whitespace$0();
+      return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_functionChild(), start, new V.StylesheetParser__functionRule_closure0($name, $arguments, precedingComment));
+    },
+    _stylesheet0$_forRule$2: function(start, child) {
+      var variable, from, _this = this, t1 = {},
+        wasInControlDirective = _this._stylesheet0$_inControlDirective;
+      _this._stylesheet0$_inControlDirective = true;
+      variable = _this.variableName$0();
+      _this.whitespace$0();
+      _this.expectIdentifier$1("from");
+      _this.whitespace$0();
+      t1.exclusive = null;
+      from = _this.expression$1$until(new V.StylesheetParser__forRule_closure1(t1, _this));
+      if (t1.exclusive == null)
+        _this.scanner.error$1(0, 'Expected "to" or "through".');
+      _this.whitespace$0();
+      return _this._stylesheet0$_withChildren$3(child, start, new V.StylesheetParser__forRule_closure2(t1, _this, wasInControlDirective, variable, from, _this.expression$0()));
+    },
+    _stylesheet0$_forwardRule$1: function(start) {
+      var prefix, members, shownMixinsAndFunctions, shownVariables, hiddenVariables, hiddenMixinsAndFunctions, configuration, span, t1, t2, t3, t4, _this = this, _null = null,
+        url = _this._stylesheet0$_urlString$0();
+      _this.whitespace$0();
+      if (_this.scanIdentifier$1("as")) {
+        _this.whitespace$0();
+        prefix = _this.identifier$1$normalize(true);
+        _this.scanner.expectChar$1(42);
+        _this.whitespace$0();
+      } else
+        prefix = _null;
+      if (_this.scanIdentifier$1("show")) {
+        members = _this._stylesheet0$_memberList$0();
+        shownMixinsAndFunctions = members.item1;
+        shownVariables = members.item2;
+        hiddenVariables = _null;
+        hiddenMixinsAndFunctions = hiddenVariables;
+      } else {
+        if (_this.scanIdentifier$1("hide")) {
+          members = _this._stylesheet0$_memberList$0();
+          hiddenMixinsAndFunctions = members.item1;
+          hiddenVariables = members.item2;
+        } else {
+          hiddenVariables = _null;
+          hiddenMixinsAndFunctions = hiddenVariables;
+        }
+        shownVariables = _null;
+        shownMixinsAndFunctions = shownVariables;
+      }
+      configuration = _this._stylesheet0$_configuration$1$allowGuarded(true);
+      _this.expectStatementSeparator$1("@forward rule");
+      span = _this.scanner.spanFrom$1(start);
+      if (!_this._stylesheet0$_isUseAllowed)
+        _this.error$2(0, string$.x40forwa, span);
+      if (shownMixinsAndFunctions != null) {
+        t1 = type$.legacy_String;
+        t2 = P.LinkedHashSet_LinkedHashSet$of(shownMixinsAndFunctions, t1);
+        t3 = type$.UnmodifiableSetView_legacy_String;
+        t1 = P.LinkedHashSet_LinkedHashSet$of(shownVariables, t1);
+        t4 = configuration == null ? C.List_empty18 : P.List_List$unmodifiable(configuration, type$.legacy_ConfiguredVariable_2);
+        return new L.ForwardRule0(url, new L.UnmodifiableSetView(t2, t3), new L.UnmodifiableSetView(t1, t3), _null, _null, prefix, t4, span);
+      } else if (hiddenMixinsAndFunctions != null) {
+        t1 = type$.legacy_String;
+        t2 = P.LinkedHashSet_LinkedHashSet$of(hiddenMixinsAndFunctions, t1);
+        t3 = type$.UnmodifiableSetView_legacy_String;
+        t1 = P.LinkedHashSet_LinkedHashSet$of(hiddenVariables, t1);
+        t4 = configuration == null ? C.List_empty18 : P.List_List$unmodifiable(configuration, type$.legacy_ConfiguredVariable_2);
+        return new L.ForwardRule0(url, _null, _null, new L.UnmodifiableSetView(t2, t3), new L.UnmodifiableSetView(t1, t3), prefix, t4, span);
+      } else
+        return new L.ForwardRule0(url, _null, _null, _null, _null, prefix, configuration == null ? C.List_empty18 : P.List_List$unmodifiable(configuration, type$.legacy_ConfiguredVariable_2), span);
+    },
+    _stylesheet0$_memberList$0: function() {
+      var _this = this,
+        t1 = type$.legacy_String,
+        identifiers = P.LinkedHashSet_LinkedHashSet$_empty(t1),
+        variables = P.LinkedHashSet_LinkedHashSet$_empty(t1);
+      t1 = _this.scanner;
+      do {
+        _this.whitespace$0();
+        _this.withErrorMessage$2(string$.Expect, new V.StylesheetParser__memberList_closure0(_this, variables, identifiers));
+        _this.whitespace$0();
+      } while (t1.scanChar$1(44));
+      return new S.Tuple2(identifiers, variables, type$.Tuple2_of_legacy_Set_legacy_String_and_legacy_Set_legacy_String);
+    },
+    _stylesheet0$_ifRule$2: function(start, child) {
+      var condition, children, clauses, lastClause, span, _this = this,
+        ifIndentation = _this.get$currentIndentation(),
+        wasInControlDirective = _this._stylesheet0$_inControlDirective;
+      _this._stylesheet0$_inControlDirective = true;
+      condition = _this.expression$0();
+      children = _this.children$1(0, child);
+      _this.whitespaceWithoutComments$0();
+      clauses = H.setRuntimeTypeInfo([V.IfClause$0(condition, children)], type$.JSArray_legacy_IfClause_2);
+      while (true) {
+        if (!_this.scanElse$1(ifIndentation)) {
+          lastClause = null;
+          break;
+        }
+        _this.whitespace$0();
+        if (_this.scanIdentifier$1("if")) {
+          _this.whitespace$0();
+          clauses.push(V.IfClause$0(_this.expression$0(), _this.children$1(0, child)));
+        } else {
+          lastClause = V.IfClause$last0(_this.children$1(0, child));
+          break;
+        }
+      }
+      _this._stylesheet0$_inControlDirective = wasInControlDirective;
+      span = _this.scanner.spanFrom$1(start);
+      _this.whitespaceWithoutComments$0();
+      return new V.IfRule0(P.List_List$unmodifiable(clauses, type$.legacy_IfClause_2), lastClause, span);
+    },
+    _stylesheet0$_importRule$1: function(start) {
+      var argument, _this = this,
+        imports = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Import_2),
+        t1 = _this.scanner;
+      do {
+        _this.whitespace$0();
+        argument = _this.importArgument$0();
+        if ((_this._stylesheet0$_inControlDirective || _this._stylesheet0$_inMixin) && argument instanceof B.DynamicImport0)
+          _this._stylesheet0$_disallowedAtRule$1(start);
+        imports.push(argument);
+        _this.whitespace$0();
+      } while (t1.scanChar$1(44));
+      _this.expectStatementSeparator$1("@import rule");
+      t1 = t1.spanFrom$1(start);
+      return new B.ImportRule0(P.List_List$unmodifiable(imports, type$.legacy_Import_2), t1);
+    },
+    importArgument$0: function() {
+      var url, urlSpan, innerError, queries, t2, t3, t4, exception, _this = this, _null = null,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        next = t1.peekChar$0();
+      if (next === 117 || next === 85) {
+        url = _this.dynamicUrl$0();
+        _this.whitespace$0();
+        queries = _this.tryImportQueries$0();
+        t2 = X.Interpolation$0(H.setRuntimeTypeInfo([url], type$.JSArray_legacy_Object), t1.spanFrom$1(start));
+        t1 = t1.spanFrom$1(start);
+        t3 = queries == null;
+        t4 = t3 ? _null : queries.item1;
+        return new Q.StaticImport0(t2, t4, t3 ? _null : queries.item2, t1);
+      }
+      url = _this.string$0();
+      urlSpan = t1.spanFrom$1(start);
+      _this.whitespace$0();
+      queries = _this.tryImportQueries$0();
+      if (_this.isPlainImportUrl$1(url) || queries != null) {
+        t2 = urlSpan;
+        t2 = X.Interpolation$0(H.setRuntimeTypeInfo([P.String_String$fromCharCodes(C.NativeUint32List_methods.sublist$2(t2.file._decodedChars, t2._file$_start, t2._end), 0, _null)], type$.JSArray_legacy_Object), urlSpan);
+        t1 = t1.spanFrom$1(start);
+        t3 = queries == null;
+        t4 = t3 ? _null : queries.item1;
+        return new Q.StaticImport0(t2, t4, t3 ? _null : queries.item2, t1);
+      } else
+        try {
+          t1 = _this.parseImportUrl$1(url);
+          return new B.DynamicImport0(t1, urlSpan);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          if (type$.legacy_FormatException._is(t1)) {
+            innerError = t1;
+            _this.error$2(0, "Invalid URL: " + H.S(J.get$message$x(innerError)), urlSpan);
+          } else
+            throw exception;
+        }
+    },
+    parseImportUrl$1: function(url) {
+      var t1 = $.$get$windows();
+      if (t1.style.rootLength$1(url) > 0)
+        return t1.toUri$1(url).toString$0(0);
+      P.Uri_parse(url);
+      return url;
+    },
+    isPlainImportUrl$1: function(url) {
+      var first;
+      if (url.length < 5)
+        return false;
+      if (C.JSString_methods.endsWith$1(url, ".css"))
+        return true;
+      first = C.JSString_methods._codeUnitAt$1(url, 0);
+      if (first === 47)
+        return C.JSString_methods._codeUnitAt$1(url, 1) === 47;
+      if (first !== 104)
+        return false;
+      return C.JSString_methods.startsWith$1(url, "http://") || C.JSString_methods.startsWith$1(url, "https://");
+    },
+    tryImportQueries$0: function() {
+      var t1, start, supports, $name, media, _this = this;
+      if (_this.scanIdentifier$1("supports")) {
+        t1 = _this.scanner;
+        t1.expectChar$1(40);
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+        if (_this.scanIdentifier$1("not")) {
+          _this.whitespace$0();
+          supports = new M.SupportsNegation0(_this._stylesheet0$_supportsConditionInParens$0(), t1.spanFrom$1(start));
+        } else if (t1.peekChar$0() === 40)
+          supports = _this._stylesheet0$_supportsCondition$0();
+        else {
+          $name = _this.expression$0();
+          t1.expectChar$1(58);
+          _this.whitespace$0();
+          supports = new L.SupportsDeclaration0($name, _this.expression$0(), t1.spanFrom$1(start));
+        }
+        t1.expectChar$1(41);
+        _this.whitespace$0();
+      } else
+        supports = null;
+      media = _this._stylesheet0$_lookingAtInterpolatedIdentifier$0() || _this.scanner.peekChar$0() === 40 ? _this._stylesheet0$_mediaQueryList$0() : null;
+      if (supports == null && media == null)
+        return null;
+      return new S.Tuple2(supports, media, type$.Tuple2_of_legacy_SupportsCondition_and_legacy_Interpolation_2);
+    },
+    _stylesheet0$_includeRule$1: function(start) {
+      var name0, namespace, $arguments, t3, t4, wasInContentBlock, $content, _this = this, _null = null, t1 = {},
+        $name = _this.identifier$0(),
+        t2 = _this.scanner;
+      if (t2.scanChar$1(46)) {
+        name0 = _this._stylesheet0$_publicIdentifier$0();
+        namespace = $name;
+        $name = name0;
+      } else {
+        $name = H.stringReplaceAllUnchecked($name, "_", "-");
+        namespace = _null;
+      }
+      _this.whitespace$0();
+      if (t2.peekChar$0() === 40)
+        $arguments = _this._stylesheet0$_argumentInvocation$1$mixin(true);
+      else {
+        t3 = Y.FileLocation$_(t2._sourceFile, t2._string_scanner$_position);
+        t4 = t3.offset;
+        $arguments = X.ArgumentInvocation$empty0(Y._FileSpan$(t3.file, t4, t4));
+      }
+      _this.whitespace$0();
+      t1.contentArguments = null;
+      if (_this.scanIdentifier$1("using")) {
+        _this.whitespace$0();
+        t3 = t1.contentArguments = _this._stylesheet0$_argumentDeclaration$0();
+        _this.whitespace$0();
+      } else
+        t3 = _null;
+      t3 = t3 == null;
+      if (!t3 || _this.lookingAtChildren$0()) {
+        if (t3) {
+          t3 = Y.FileLocation$_(t2._sourceFile, t2._string_scanner$_position);
+          t4 = t3.offset;
+          t1.contentArguments = new B.ArgumentDeclaration0(C.List_empty20, _null, Y._FileSpan$(t3.file, t4, t4));
+        }
+        wasInContentBlock = _this._stylesheet0$_inContentBlock;
+        _this._stylesheet0$_inContentBlock = true;
+        $content = _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_statement(), start, new V.StylesheetParser__includeRule_closure0(t1));
+        _this._stylesheet0$_inContentBlock = wasInContentBlock;
+      } else {
+        _this.expectStatementSeparator$0();
+        $content = _null;
+      }
+      t1 = t2.spanFrom$2(start, start);
+      return new A.IncludeRule0(namespace, $name, $arguments, $content, t1.expand$1(0, ($content == null ? $arguments : $content).get$span()));
+    },
+    mediaRule$1: function(start) {
+      return this._stylesheet0$_withChildren$3(this.get$_stylesheet0$_statement(), start, new V.StylesheetParser_mediaRule_closure0(this._stylesheet0$_mediaQueryList$0()));
+    },
+    _stylesheet0$_mixinRule$1: function(start) {
+      var $name, t1, $arguments, t2, t3, _this = this,
+        precedingComment = _this.lastSilentComment;
+      _this.lastSilentComment = null;
+      $name = _this.identifier$1$normalize(true);
+      _this.whitespace$0();
+      t1 = _this.scanner;
+      if (t1.peekChar$0() === 40)
+        $arguments = _this._stylesheet0$_argumentDeclaration$0();
+      else {
+        t2 = Y.FileLocation$_(t1._sourceFile, t1._string_scanner$_position);
+        t3 = t2.offset;
+        $arguments = new B.ArgumentDeclaration0(C.List_empty20, null, Y._FileSpan$(t2.file, t3, t3));
+      }
+      if (_this._stylesheet0$_inMixin || _this._stylesheet0$_inContentBlock)
+        _this.error$2(0, string$.Mixinscm, t1.spanFrom$1(start));
+      else if (_this._stylesheet0$_inControlDirective)
+        _this.error$2(0, string$.Mixinsb, t1.spanFrom$1(start));
+      _this.whitespace$0();
+      _this._stylesheet0$_inMixin = true;
+      _this._stylesheet0$_mixinHasContent = false;
+      return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_statement(), start, new V.StylesheetParser__mixinRule_closure0(_this, $name, $arguments, precedingComment));
+    },
+    mozDocumentRule$2: function(start, $name) {
+      var t5, t6, identifier, contents, argument, trailing, endPosition, t7, t8, start0, end, _this = this, _box_0 = {},
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        t4 = [],
+        buffer = new Z.InterpolationBuffer0(t3, t4);
+      _box_0.needsDeprecationWarning = false;
+      for (t5 = _this.get$whitespace(); true;) {
+        if (t1.peekChar$0() === 35) {
+          t6 = _this.singleInterpolation$0();
+          buffer._interpolation_buffer0$_flushText$0();
+          t4.push(t6);
+          _box_0.needsDeprecationWarning = true;
+        } else {
+          t6 = t1._string_scanner$_position;
+          identifier = _this.identifier$0();
+          switch (identifier) {
+            case "url":
+            case "url-prefix":
+            case "domain":
+              contents = _this._stylesheet0$_tryUrlContents$2$name(new S._SpanScannerState(t1, t6), identifier);
+              if (contents != null)
+                buffer.addInterpolation$1(contents);
+              else {
+                t1.expectChar$1(40);
+                _this.whitespace$0();
+                argument = _this.interpolatedString$0();
+                t1.expectChar$1(41);
+                t3._contents += identifier;
+                t3._contents += H.Primitives_stringFromCharCode(40);
+                buffer.addInterpolation$1(argument.asInterpolation$0());
+                t3._contents += H.Primitives_stringFromCharCode(41);
+              }
+              t6 = t3._contents;
+              trailing = t6.charCodeAt(0) == 0 ? t6 : t6;
+              if (!C.JSString_methods.endsWith$1(trailing, "url-prefix()") && !C.JSString_methods.endsWith$1(trailing, "url-prefix('')") && !C.JSString_methods.endsWith$1(trailing, 'url-prefix("")'))
+                _box_0.needsDeprecationWarning = true;
+              break;
+            case "regexp":
+              t3._contents += "regexp(";
+              t1.expectChar$1(40);
+              buffer.addInterpolation$1(_this.interpolatedString$0().asInterpolation$0());
+              t1.expectChar$1(41);
+              t3._contents += H.Primitives_stringFromCharCode(41);
+              _box_0.needsDeprecationWarning = true;
+              break;
+            default:
+              endPosition = t1._string_scanner$_position;
+              t7 = t1._sourceFile;
+              t8 = new Y._FileSpan(t7, t6, endPosition);
+              t8._FileSpan$3(t7, t6, endPosition);
+              _this.error$2(0, "Invalid function name.", t8);
+          }
+        }
+        _this.whitespace$0();
+        if (!t1.scanChar$1(44))
+          break;
+        t3._contents += H.Primitives_stringFromCharCode(44);
+        start0 = t1._string_scanner$_position;
+        t5.call$0();
+        end = t1._string_scanner$_position;
+        t3._contents += J.substring$2$s(t1.string, start0, end);
+      }
+      return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_statement(), start, new V.StylesheetParser_mozDocumentRule_closure0(_box_0, _this, $name, buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)))));
+    },
+    supportsRule$1: function(start) {
+      var _this = this,
+        condition = _this._stylesheet0$_supportsCondition$0();
+      _this.whitespace$0();
+      return _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_statement(), start, new V.StylesheetParser_supportsRule_closure0(condition));
+    },
+    _stylesheet0$_useNamespace$2: function(url, start) {
+      var namespace, basename, dot, t1, exception, _this = this;
+      if (_this.scanIdentifier$1("as")) {
+        _this.whitespace$0();
+        return _this.scanner.scanChar$1(42) ? null : _this.identifier$0();
+      }
+      basename = url.get$pathSegments().length === 0 ? "" : C.JSArray_methods.get$last(url.get$pathSegments());
+      dot = J.getInterceptor$asx(basename).indexOf$1(basename, ".");
+      t1 = C.JSString_methods.startsWith$1(basename, "_") ? 1 : 0;
+      namespace = C.JSString_methods.substring$2(basename, t1, dot === -1 ? basename.length : dot);
+      try {
+        t1 = S.SpanScanner$(namespace, null);
+        t1 = new G.Parser1(t1, _this.logger)._parser$_parseIdentifier$0();
+        return t1;
+      } catch (exception) {
+        if (H.unwrapException(exception) instanceof E.SassFormatException0)
+          _this.error$2(0, 'Invalid Sass identifier "' + H.S(namespace) + '"', _this.scanner.spanFrom$1(start));
+        else
+          throw exception;
+      }
+    },
+    _stylesheet0$_configuration$1$allowGuarded: function(allowGuarded) {
+      var variableNames, configuration, t1, t2, $name, expression, t3, guarded, endPosition, t4, t5, span, _this = this;
+      if (!_this.scanIdentifier$1("with"))
+        return null;
+      variableNames = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_String);
+      configuration = H.setRuntimeTypeInfo([], type$.JSArray_legacy_ConfiguredVariable_2);
+      _this.whitespace$0();
+      t1 = _this.scanner;
+      t1.expectChar$1(40);
+      for (; true;) {
+        _this.whitespace$0();
+        t2 = t1._string_scanner$_position;
+        t1.expectChar$1(36);
+        $name = _this.identifier$1$normalize(true);
+        _this.whitespace$0();
+        t1.expectChar$1(58);
+        _this.whitespace$0();
+        expression = _this._stylesheet0$_expressionUntilComma$0();
+        t3 = t1._string_scanner$_position;
+        if (allowGuarded && t1.scanChar$1(33))
+          if (_this.identifier$0() === "default") {
+            _this.whitespace$0();
+            guarded = true;
+          } else {
+            endPosition = t1._string_scanner$_position;
+            t4 = t1._sourceFile;
+            t5 = new Y._FileSpan(t4, t3, endPosition);
+            t5._FileSpan$3(t4, t3, endPosition);
+            _this.error$2(0, "Invalid flag name.", t5);
+            guarded = false;
+          }
+        else
+          guarded = false;
+        endPosition = t1._string_scanner$_position;
+        t3 = t1._sourceFile;
+        span = new Y._FileSpan(t3, t2, endPosition);
+        span._FileSpan$3(t3, t2, endPosition);
+        if (variableNames.contains$1(0, $name))
+          _this.error$2(0, string$.The_sa, span);
+        variableNames.add$1(0, $name);
+        configuration.push(new Z.ConfiguredVariable0($name, expression, guarded, span));
+        if (!t1.scanChar$1(44))
+          break;
+        _this.whitespace$0();
+        if (!_this._stylesheet0$_lookingAtExpression$0())
+          break;
+      }
+      t1.expectChar$1(41);
+      return configuration;
+    },
+    _stylesheet0$_configuration$0: function() {
+      return this._stylesheet0$_configuration$1$allowGuarded(false);
+    },
+    _stylesheet0$_warnRule$1: function(start) {
+      var value = this.expression$0();
+      this.expectStatementSeparator$1("@warn rule");
+      return new Y.WarnRule0(value, this.scanner.spanFrom$1(start));
+    },
+    _stylesheet0$_whileRule$2: function(start, child) {
+      var _this = this,
+        wasInControlDirective = _this._stylesheet0$_inControlDirective;
+      _this._stylesheet0$_inControlDirective = true;
+      return _this._stylesheet0$_withChildren$3(child, start, new V.StylesheetParser__whileRule_closure0(_this, wasInControlDirective, _this.expression$0()));
+    },
+    unknownAtRule$2: function(start, $name) {
+      var t2, t3, rule, _this = this, t1 = {},
+        wasInUnknownAtRule = _this._stylesheet0$_inUnknownAtRule;
+      _this._stylesheet0$_inUnknownAtRule = true;
+      t1.value = null;
+      t2 = _this.scanner;
+      t3 = t2.peekChar$0() !== 33 && !_this.atEndOfStatement$0() ? t1.value = _this.almostAnyValue$0() : null;
+      if (_this.lookingAtChildren$0())
+        rule = _this._stylesheet0$_withChildren$3(_this.get$_stylesheet0$_statement(), start, new V.StylesheetParser_unknownAtRule_closure0(t1, $name));
+      else {
+        _this.expectStatementSeparator$0();
+        rule = U.AtRule$0($name, t2.spanFrom$1(start), null, t3);
+      }
+      _this._stylesheet0$_inUnknownAtRule = wasInUnknownAtRule;
+      return rule;
+    },
+    _stylesheet0$_disallowedAtRule$1: function(start) {
+      this.almostAnyValue$0();
+      this.error$2(0, "This at-rule is not allowed here.", this.scanner.spanFrom$1(start));
+    },
+    _stylesheet0$_argumentDeclaration$0: function() {
+      var $arguments, named, restArgument, t3, $name, defaultValue, endPosition, t4, t5, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expectChar$1(40);
+      _this.whitespace$0();
+      $arguments = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Argument_2);
+      named = P.LinkedHashSet_LinkedHashSet$_empty(type$.legacy_String);
+      while (true) {
+        if (!(t1.peekChar$0() === 36)) {
+          restArgument = null;
+          break;
+        }
+        t3 = t1._string_scanner$_position;
+        t1.expectChar$1(36);
+        $name = _this.identifier$1$normalize(true);
+        _this.whitespace$0();
+        if (t1.scanChar$1(58)) {
+          _this.whitespace$0();
+          defaultValue = _this._stylesheet0$_expressionUntilComma$0();
+        } else {
+          if (t1.scanChar$1(46)) {
+            t1.expectChar$1(46);
+            t1.expectChar$1(46);
+            _this.whitespace$0();
+            restArgument = $name;
+            break;
+          }
+          defaultValue = null;
+        }
+        endPosition = t1._string_scanner$_position;
+        t4 = t1._sourceFile;
+        t5 = new Y._FileSpan(t4, t3, endPosition);
+        t5._FileSpan$3(t4, t3, endPosition);
+        $arguments.push(new Z.Argument0($name, defaultValue, t5));
+        if (!named.add$1(0, $name))
+          _this.error$2(0, "Duplicate argument.", C.JSArray_methods.get$last($arguments).span);
+        if (!t1.scanChar$1(44)) {
+          restArgument = null;
+          break;
+        }
+        _this.whitespace$0();
+      }
+      t1.expectChar$1(41);
+      t1 = t1.spanFrom$1(new S._SpanScannerState(t1, t2));
+      return new B.ArgumentDeclaration0(P.List_List$unmodifiable($arguments, type$.legacy_Argument_2), restArgument, t1);
+    },
+    _stylesheet0$_argumentInvocation$1$mixin: function(mixin) {
+      var positional, t3, t4, named, keywordRest, t5, rest, expression, t6, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expectChar$1(40);
+      _this.whitespace$0();
+      positional = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression_2);
+      t3 = type$.legacy_String;
+      t4 = type$.legacy_Expression_2;
+      named = P.LinkedHashMap_LinkedHashMap$_empty(t3, t4);
+      t5 = !mixin;
+      rest = null;
+      while (true) {
+        if (!_this._stylesheet0$_lookingAtExpression$0()) {
+          keywordRest = null;
+          break;
+        }
+        expression = _this._stylesheet0$_expressionUntilComma$1$singleEquals(t5);
+        _this.whitespace$0();
+        if (expression instanceof S.VariableExpression0 && t1.scanChar$1(58)) {
+          _this.whitespace$0();
+          t6 = expression.name;
+          if (named.containsKey$1(t6))
+            _this.error$2(0, "Duplicate argument.", expression.span);
+          named.$indexSet(0, t6, _this._stylesheet0$_expressionUntilComma$1$singleEquals(t5));
+        } else if (t1.scanChar$1(46)) {
+          t1.expectChar$1(46);
+          t1.expectChar$1(46);
+          if (rest != null) {
+            _this.whitespace$0();
+            keywordRest = expression;
+            break;
+          }
+          rest = expression;
+        } else if (named.get$isNotEmpty(named))
+          _this.error$2(0, string$.Positi, expression.get$span());
+        else
+          positional.push(expression);
+        _this.whitespace$0();
+        if (!t1.scanChar$1(44)) {
+          keywordRest = null;
+          break;
+        }
+        _this.whitespace$0();
+      }
+      t1.expectChar$1(41);
+      t1 = t1.spanFrom$1(new S._SpanScannerState(t1, t2));
+      return new X.ArgumentInvocation0(P.List_List$unmodifiable(positional, t4), H.ConstantMap_ConstantMap$from(named, t3, t4), rest, keywordRest, t1);
+    },
+    _stylesheet0$_argumentInvocation$0: function() {
+      return this._stylesheet0$_argumentInvocation$1$mixin(false);
+    },
+    expression$3$bracketList$singleEquals$until: function(bracketList, singleEquals, until) {
+      var t2, beforeBracket, t3, wasInParentheses, resetState, resolveOneOperation, resolveOperations, addSingleExpression, addOperator, resolveSpaceExpressions, first, next, t4, _this = this,
+        _s20_ = "Expected expression.",
+        _box_0 = {},
+        t1 = until != null;
+      if (t1 && until.call$0())
+        _this.scanner.error$1(0, _s20_);
+      if (bracketList) {
+        t2 = _this.scanner;
+        beforeBracket = new S._SpanScannerState(t2, t2._string_scanner$_position);
+        t2.expectChar$1(91);
+        _this.whitespace$0();
+        if (t2.scanChar$1(93))
+          return D.ListExpression$0(H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression_2), C.ListSeparator_undecided0, true, t2.spanFrom$1(beforeBracket));
+      } else
+        beforeBracket = null;
+      t2 = _this.scanner;
+      t3 = t2._string_scanner$_position;
+      wasInParentheses = _this._stylesheet0$_inParentheses;
+      _box_0.operands = _box_0.operators = _box_0.spaceExpressions = _box_0.commaExpressions = null;
+      _box_0.allowSlash = _this.lookingAtNumber$0();
+      _box_0.singleExpression = _this._stylesheet0$_singleExpression$0();
+      resetState = new V.StylesheetParser_expression_resetState0(_box_0, _this, new S._SpanScannerState(t2, t3));
+      resolveOneOperation = new V.StylesheetParser_expression_resolveOneOperation0(_box_0, _this);
+      resolveOperations = new V.StylesheetParser_expression_resolveOperations0(_box_0, resolveOneOperation);
+      addSingleExpression = new V.StylesheetParser_expression_addSingleExpression0(_box_0, _this, resetState, resolveOperations);
+      addOperator = new V.StylesheetParser_expression_addOperator0(_box_0, _this, resolveOneOperation);
+      resolveSpaceExpressions = new V.StylesheetParser_expression_resolveSpaceExpressions0(_box_0, resolveOperations);
+      $label0$0:
+        for (t3 = type$.JSArray_legacy_Expression_2; true;) {
+          _this.whitespace$0();
+          if (t1 && until.call$0())
+            break $label0$0;
+          first = t2.peekChar$0();
+          switch (first) {
+            case 40:
+              addSingleExpression.call$1(_this._stylesheet0$_parentheses$0());
+              break;
+            case 91:
+              addSingleExpression.call$1(_this.expression$1$bracketList(true));
+              break;
+            case 36:
+              addSingleExpression.call$1(_this._stylesheet0$_variable$0());
+              break;
+            case 38:
+              addSingleExpression.call$1(_this._stylesheet0$_selector$0());
+              break;
+            case 39:
+            case 34:
+              addSingleExpression.call$1(_this.interpolatedString$0());
+              break;
+            case 35:
+              addSingleExpression.call$1(_this._stylesheet0$_hashExpression$0());
+              break;
+            case 61:
+              t2.readChar$0();
+              if (singleEquals && t2.peekChar$0() !== 61)
+                addOperator.call$1(C.BinaryOperator_kjl0);
+              else {
+                t2.expectChar$1(61);
+                addOperator.call$1(C.BinaryOperator_YlX0);
+              }
+              break;
+            case 33:
+              next = t2.peekChar$1(1);
+              if (next === 61) {
+                t2.readChar$0();
+                t2.readChar$0();
+                addOperator.call$1(C.BinaryOperator_i5H0);
+              } else {
+                if (next != null)
+                  if ((next | 32) !== 105)
+                    t4 = next === 32 || next === 9 || next === 10 || next === 13 || next === 12;
+                  else
+                    t4 = true;
+                else
+                  t4 = true;
+                if (t4)
+                  addSingleExpression.call$1(_this._stylesheet0$_importantExpression$0());
+                else
+                  break $label0$0;
+              }
+              break;
+            case 60:
+              t2.readChar$0();
+              addOperator.call$1(t2.scanChar$1(61) ? C.BinaryOperator_33h0 : C.BinaryOperator_8qt0);
+              break;
+            case 62:
+              t2.readChar$0();
+              addOperator.call$1(t2.scanChar$1(61) ? C.BinaryOperator_1da0 : C.BinaryOperator_AcR1);
+              break;
+            case 42:
+              t2.readChar$0();
+              addOperator.call$1(C.BinaryOperator_O1M0);
+              break;
+            case 43:
+              if (_box_0.singleExpression == null)
+                addSingleExpression.call$1(_this._stylesheet0$_unaryOperation$0());
+              else {
+                t2.readChar$0();
+                addOperator.call$1(C.BinaryOperator_AcR2);
+              }
+              break;
+            case 45:
+              next = t2.peekChar$1(1);
+              if (next != null && next >= 48 && next <= 57 || next === 46)
+                if (_box_0.singleExpression != null) {
+                  t4 = t2.peekChar$1(-1);
+                  t4 = t4 === 32 || t4 === 9 || t4 === 10 || t4 === 13 || t4 === 12;
+                } else
+                  t4 = true;
+              else
+                t4 = false;
+              if (t4)
+                addSingleExpression.call$2$number(_this._stylesheet0$_number$0(), true);
+              else if (_this._stylesheet0$_lookingAtInterpolatedIdentifier$0())
+                addSingleExpression.call$1(_this.identifierLike$0());
+              else if (_box_0.singleExpression == null)
+                addSingleExpression.call$1(_this._stylesheet0$_unaryOperation$0());
+              else {
+                t2.readChar$0();
+                addOperator.call$1(C.BinaryOperator_iyO0);
+              }
+              break;
+            case 47:
+              if (_box_0.singleExpression == null)
+                addSingleExpression.call$1(_this._stylesheet0$_unaryOperation$0());
+              else {
+                t2.readChar$0();
+                addOperator.call$1(C.BinaryOperator_RTB0);
+              }
+              break;
+            case 37:
+              t2.readChar$0();
+              addOperator.call$1(C.BinaryOperator_2ad0);
+              break;
+            case 48:
+            case 49:
+            case 50:
+            case 51:
+            case 52:
+            case 53:
+            case 54:
+            case 55:
+            case 56:
+            case 57:
+              addSingleExpression.call$2$number(_this._stylesheet0$_number$0(), true);
+              break;
+            case 46:
+              if (t2.peekChar$1(1) === 46)
+                break $label0$0;
+              addSingleExpression.call$2$number(_this._stylesheet0$_number$0(), true);
+              break;
+            case 97:
+              if (!_this.get$plainCss() && _this.scanIdentifier$1("and"))
+                addOperator.call$1(C.BinaryOperator_and_and_20);
+              else
+                addSingleExpression.call$1(_this.identifierLike$0());
+              break;
+            case 111:
+              if (!_this.get$plainCss() && _this.scanIdentifier$1("or"))
+                addOperator.call$1(C.BinaryOperator_or_or_10);
+              else
+                addSingleExpression.call$1(_this.identifierLike$0());
+              break;
+            case 117:
+            case 85:
+              if (t2.peekChar$1(1) === 43)
+                addSingleExpression.call$1(_this._stylesheet0$_unicodeRange$0());
+              else
+                addSingleExpression.call$1(_this.identifierLike$0());
+              break;
+            case 98:
+            case 99:
+            case 100:
+            case 101:
+            case 102:
+            case 103:
+            case 104:
+            case 105:
+            case 106:
+            case 107:
+            case 108:
+            case 109:
+            case 110:
+            case 112:
+            case 113:
+            case 114:
+            case 115:
+            case 116:
+            case 118:
+            case 119:
+            case 120:
+            case 121:
+            case 122:
+            case 65:
+            case 66:
+            case 67:
+            case 68:
+            case 69:
+            case 70:
+            case 71:
+            case 72:
+            case 73:
+            case 74:
+            case 75:
+            case 76:
+            case 77:
+            case 78:
+            case 79:
+            case 80:
+            case 81:
+            case 82:
+            case 83:
+            case 84:
+            case 86:
+            case 87:
+            case 88:
+            case 89:
+            case 90:
+            case 95:
+            case 92:
+              addSingleExpression.call$1(_this.identifierLike$0());
+              break;
+            case 44:
+              if (_this._stylesheet0$_inParentheses) {
+                _this._stylesheet0$_inParentheses = false;
+                if (_box_0.allowSlash) {
+                  resetState.call$0();
+                  break;
+                }
+              }
+              if (_box_0.commaExpressions == null)
+                _box_0.commaExpressions = H.setRuntimeTypeInfo([], t3);
+              if (_box_0.singleExpression == null)
+                t2.error$1(0, _s20_);
+              resolveSpaceExpressions.call$0();
+              _box_0.commaExpressions.push(_box_0.singleExpression);
+              t2.readChar$0();
+              _box_0.allowSlash = true;
+              _box_0.singleExpression = null;
+              break;
+            default:
+              if (first != null && first >= 128) {
+                addSingleExpression.call$1(_this.identifierLike$0());
+                break;
+              } else
+                break $label0$0;
+          }
+        }
+      if (bracketList)
+        t2.expectChar$1(93);
+      if (_box_0.commaExpressions != null) {
+        resolveSpaceExpressions.call$0();
+        _this._stylesheet0$_inParentheses = wasInParentheses;
+        t1 = _box_0.singleExpression;
+        if (t1 != null)
+          _box_0.commaExpressions.push(t1);
+        t1 = _box_0.commaExpressions;
+        return D.ListExpression$0(t1, C.ListSeparator_comma0, bracketList, bracketList ? t2.spanFrom$1(beforeBracket) : null);
+      } else if (bracketList && _box_0.spaceExpressions != null) {
+        resolveOperations.call$0();
+        t1 = _box_0.spaceExpressions;
+        t1.push(_box_0.singleExpression);
+        return D.ListExpression$0(t1, C.ListSeparator_space0, true, t2.spanFrom$1(beforeBracket));
+      } else {
+        resolveSpaceExpressions.call$0();
+        if (bracketList)
+          _box_0.singleExpression = D.ListExpression$0(H.setRuntimeTypeInfo([_box_0.singleExpression], t3), C.ListSeparator_undecided0, true, t2.spanFrom$1(beforeBracket));
+        return _box_0.singleExpression;
+      }
+    },
+    expression$2$singleEquals$until: function(singleEquals, until) {
+      return this.expression$3$bracketList$singleEquals$until(false, singleEquals, until);
+    },
+    expression$1$bracketList: function(bracketList) {
+      return this.expression$3$bracketList$singleEquals$until(bracketList, false, null);
+    },
+    expression$0: function() {
+      return this.expression$3$bracketList$singleEquals$until(false, false, null);
+    },
+    expression$1$singleEquals: function(singleEquals) {
+      return this.expression$3$bracketList$singleEquals$until(false, singleEquals, null);
+    },
+    expression$1$until: function(until) {
+      return this.expression$3$bracketList$singleEquals$until(false, false, until);
+    },
+    _stylesheet0$_expressionUntilComma$1$singleEquals: function(singleEquals) {
+      return this.expression$2$singleEquals$until(singleEquals, new V.StylesheetParser__expressionUntilComma_closure0(this));
+    },
+    _stylesheet0$_expressionUntilComma$0: function() {
+      return this._stylesheet0$_expressionUntilComma$1$singleEquals(false);
+    },
+    _stylesheet0$_singleExpression$0: function() {
+      var next, _this = this,
+        t1 = _this.scanner,
+        first = t1.peekChar$0();
+      switch (first) {
+        case 40:
+          return _this._stylesheet0$_parentheses$0();
+        case 47:
+          return _this._stylesheet0$_unaryOperation$0();
+        case 46:
+          return _this._stylesheet0$_number$0();
+        case 91:
+          return _this.expression$1$bracketList(true);
+        case 36:
+          return _this._stylesheet0$_variable$0();
+        case 38:
+          return _this._stylesheet0$_selector$0();
+        case 39:
+        case 34:
+          return _this.interpolatedString$0();
+        case 35:
+          return _this._stylesheet0$_hashExpression$0();
+        case 43:
+          next = t1.peekChar$1(1);
+          return T.isDigit0(next) || next === 46 ? _this._stylesheet0$_number$0() : _this._stylesheet0$_unaryOperation$0();
+        case 45:
+          return _this._stylesheet0$_minusExpression$0();
+        case 33:
+          return _this._stylesheet0$_importantExpression$0();
+        case 117:
+        case 85:
+          if (t1.peekChar$1(1) === 43)
+            return _this._stylesheet0$_unicodeRange$0();
+          else
+            return _this.identifierLike$0();
+        case 48:
+        case 49:
+        case 50:
+        case 51:
+        case 52:
+        case 53:
+        case 54:
+        case 55:
+        case 56:
+        case 57:
+          return _this._stylesheet0$_number$0();
+        case 97:
+        case 98:
+        case 99:
+        case 100:
+        case 101:
+        case 102:
+        case 103:
+        case 104:
+        case 105:
+        case 106:
+        case 107:
+        case 108:
+        case 109:
+        case 110:
+        case 111:
+        case 112:
+        case 113:
+        case 114:
+        case 115:
+        case 116:
+        case 118:
+        case 119:
+        case 120:
+        case 121:
+        case 122:
+        case 65:
+        case 66:
+        case 67:
+        case 68:
+        case 69:
+        case 70:
+        case 71:
+        case 72:
+        case 73:
+        case 74:
+        case 75:
+        case 76:
+        case 77:
+        case 78:
+        case 79:
+        case 80:
+        case 81:
+        case 82:
+        case 83:
+        case 84:
+        case 86:
+        case 87:
+        case 88:
+        case 89:
+        case 90:
+        case 95:
+        case 92:
+          return _this.identifierLike$0();
+        default:
+          if (first != null && first >= 128)
+            return _this.identifierLike$0();
+          t1.error$1(0, "Expected expression.");
+      }
+    },
+    _stylesheet0$_parentheses$0: function() {
+      var wasInParentheses, start, first, expressions, t1, _this = this;
+      if (_this.get$plainCss())
+        _this.scanner.error$2$length(0, "Parentheses aren't allowed in plain CSS.", 1);
+      wasInParentheses = _this._stylesheet0$_inParentheses;
+      _this._stylesheet0$_inParentheses = true;
+      try {
+        t1 = _this.scanner;
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+        t1.expectChar$1(40);
+        _this.whitespace$0();
+        if (!_this._stylesheet0$_lookingAtExpression$0()) {
+          t1.expectChar$1(41);
+          t1 = D.ListExpression$0(H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression_2), C.ListSeparator_undecided0, false, t1.spanFrom$1(start));
+          return t1;
+        }
+        first = _this._stylesheet0$_expressionUntilComma$0();
+        if (t1.scanChar$1(58)) {
+          _this.whitespace$0();
+          t1 = _this._stylesheet0$_map$2(first, start);
+          return t1;
+        }
+        if (!t1.scanChar$1(44)) {
+          t1.expectChar$1(41);
+          t1 = t1.spanFrom$1(start);
+          return new T.ParenthesizedExpression0(first, t1);
+        }
+        _this.whitespace$0();
+        expressions = H.setRuntimeTypeInfo([first], type$.JSArray_legacy_Expression_2);
+        for (; true;) {
+          if (!_this._stylesheet0$_lookingAtExpression$0())
+            break;
+          J.add$1$ax(expressions, _this._stylesheet0$_expressionUntilComma$0());
+          if (!t1.scanChar$1(44))
+            break;
+          _this.whitespace$0();
+        }
+        t1.expectChar$1(41);
+        t1 = D.ListExpression$0(expressions, C.ListSeparator_comma0, false, t1.spanFrom$1(start));
+        return t1;
+      } finally {
+        _this._stylesheet0$_inParentheses = wasInParentheses;
+      }
+    },
+    _stylesheet0$_map$2: function(first, start) {
+      var t2, key, _this = this,
+        t1 = type$.Tuple2_of_legacy_Expression_and_legacy_Expression_2,
+        pairs = H.setRuntimeTypeInfo([new S.Tuple2(first, _this._stylesheet0$_expressionUntilComma$0(), t1)], type$.JSArray_legacy_Tuple2_of_legacy_Expression_and_legacy_Expression_2);
+      for (t2 = _this.scanner; t2.scanChar$1(44);) {
+        _this.whitespace$0();
+        if (!_this._stylesheet0$_lookingAtExpression$0())
+          break;
+        key = _this._stylesheet0$_expressionUntilComma$0();
+        t2.expectChar$1(58);
+        _this.whitespace$0();
+        pairs.push(new S.Tuple2(key, _this._stylesheet0$_expressionUntilComma$0(), t1));
+      }
+      t2.expectChar$1(41);
+      t1 = t2.spanFrom$1(start);
+      return new A.MapExpression0(P.List_List$unmodifiable(pairs, type$.legacy_Tuple2_of_legacy_Expression_and_legacy_Expression_2), t1);
+    },
+    _stylesheet0$_hashExpression$0: function() {
+      var start, first, t2, identifier, buffer, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$1(1) === 123)
+        return _this.identifierLike$0();
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expectChar$1(35);
+      first = t1.peekChar$0();
+      if (first != null && T.isDigit0(first))
+        return new K.ColorExpression0(_this._stylesheet0$_hexColorContents$1(start));
+      t2 = t1._string_scanner$_position;
+      identifier = _this.interpolatedIdentifier$0();
+      if (_this._stylesheet0$_isHexColor$1(identifier)) {
+        t1.set$state(new S._SpanScannerState(t1, t2));
+        return new K.ColorExpression0(_this._stylesheet0$_hexColorContents$1(start));
+      }
+      t2 = new P.StringBuffer("");
+      buffer = new Z.InterpolationBuffer0(t2, []);
+      t2._contents += H.Primitives_stringFromCharCode(35);
+      buffer.addInterpolation$1(identifier);
+      return new D.StringExpression0(buffer.interpolation$1(t1.spanFrom$1(start)), false);
+    },
+    _stylesheet0$_hexColorContents$1: function(start) {
+      var red, green, blue, alpha, digit4, t2, t3, _this = this,
+        digit1 = _this._stylesheet0$_hexDigit$0(),
+        digit2 = _this._stylesheet0$_hexDigit$0(),
+        digit3 = _this._stylesheet0$_hexDigit$0(),
+        t1 = _this.scanner;
+      if (!T.isHex0(t1.peekChar$0())) {
+        red = (digit1 << 4 >>> 0) + digit1;
+        green = (digit2 << 4 >>> 0) + digit2;
+        blue = (digit3 << 4 >>> 0) + digit3;
+        alpha = 1;
+      } else {
+        digit4 = _this._stylesheet0$_hexDigit$0();
+        t2 = digit1 << 4 >>> 0;
+        t3 = digit3 << 4 >>> 0;
+        if (!T.isHex0(t1.peekChar$0())) {
+          red = t2 + digit1;
+          green = (digit2 << 4 >>> 0) + digit2;
+          blue = t3 + digit3;
+          alpha = ((digit4 << 4 >>> 0) + digit4) / 255;
+        } else {
+          red = t2 + digit2;
+          green = t3 + digit4;
+          blue = (_this._stylesheet0$_hexDigit$0() << 4 >>> 0) + _this._stylesheet0$_hexDigit$0();
+          alpha = T.isHex0(t1.peekChar$0()) ? ((_this._stylesheet0$_hexDigit$0() << 4 >>> 0) + _this._stylesheet0$_hexDigit$0()) / 255 : 1;
+        }
+      }
+      return K.SassColor$rgb0(red, green, blue, alpha, t1.spanFrom$1(start));
+    },
+    _stylesheet0$_isHexColor$1: function(interpolation) {
+      var t1,
+        plain = interpolation.get$asPlain();
+      if (plain == null)
+        return false;
+      t1 = plain.length;
+      if (t1 !== 3 && t1 !== 4 && t1 !== 6 && t1 !== 8)
+        return false;
+      t1 = new H.CodeUnits(plain);
+      return t1.every$1(t1, T.character0__isHex$closure());
+    },
+    _stylesheet0$_hexDigit$0: function() {
+      var t1 = this.scanner,
+        char = t1.peekChar$0();
+      if (char == null || !T.isHex0(char))
+        t1.error$1(0, "Expected hex digit.");
+      return T.asHex0(t1.readChar$0());
+    },
+    _stylesheet0$_minusExpression$0: function() {
+      var _this = this,
+        next = _this.scanner.peekChar$1(1);
+      if (T.isDigit0(next) || next === 46)
+        return _this._stylesheet0$_number$0();
+      if (_this._stylesheet0$_lookingAtInterpolatedIdentifier$0())
+        return _this.identifierLike$0();
+      return _this._stylesheet0$_unaryOperation$0();
+    },
+    _stylesheet0$_importantExpression$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.readChar$0();
+      this.whitespace$0();
+      this.expectIdentifier$1("important");
+      t2 = t1.spanFrom$1(new S._SpanScannerState(t1, t2));
+      return new D.StringExpression0(X.Interpolation$0(H.setRuntimeTypeInfo(["!important"], type$.JSArray_legacy_Object), t2), false);
+    },
+    _stylesheet0$_unaryOperation$0: function() {
+      var _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        operator = _this._stylesheet0$_unaryOperatorFor$1(t1.readChar$0());
+      if (operator == null)
+        t1.error$2$position(0, "Expected unary operator.", t1._string_scanner$_position - 1);
+      else if (_this.get$plainCss() && operator !== C.UnaryOperator_zDx0)
+        t1.error$3$length$position(0, "Operators aren't allowed in plain CSS.", 1, t1._string_scanner$_position - 1);
+      _this.whitespace$0();
+      return new X.UnaryOperationExpression0(operator, _this._stylesheet0$_singleExpression$0(), t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _stylesheet0$_unaryOperatorFor$1: function(character) {
+      switch (character) {
+        case 43:
+          return C.UnaryOperator_j2w0;
+        case 45:
+          return C.UnaryOperator_U4G0;
+        case 47:
+          return C.UnaryOperator_zDx0;
+        default:
+          return null;
+      }
+    },
+    _stylesheet0$_number$0: function() {
+      var number, t4, unit, t5, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        first = t1.peekChar$0(),
+        t3 = first === 45,
+        sign = t3 ? -1 : 1;
+      if (first === 43 || t3)
+        t1.readChar$0();
+      number = t1.peekChar$0() === 46 ? 0 : _this.naturalNumber$0();
+      t3 = _this._stylesheet0$_tryDecimal$1$allowTrailingDot(t1._string_scanner$_position !== t2);
+      t4 = _this._stylesheet0$_tryExponent$0();
+      if (t1.scanChar$1(37))
+        unit = "%";
+      else {
+        if (_this.lookingAtIdentifier$0())
+          t5 = t1.peekChar$0() !== 45 || t1.peekChar$1(1) !== 45;
+        else
+          t5 = false;
+        unit = t5 ? _this.identifier$1$unit(true) : null;
+      }
+      return new T.NumberExpression0(sign * ((number + t3) * t4), unit, t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _stylesheet0$_tryDecimal$1$allowTrailingDot: function(allowTrailingDot) {
+      var t2,
+        t1 = this.scanner,
+        start = t1._string_scanner$_position;
+      if (t1.peekChar$0() !== 46)
+        return 0;
+      if (!T.isDigit0(t1.peekChar$1(1))) {
+        if (allowTrailingDot)
+          return 0;
+        t1.error$2$position(0, "Expected digit.", t1._string_scanner$_position + 1);
+      }
+      t1.readChar$0();
+      while (true) {
+        t2 = t1.peekChar$0();
+        if (!(t2 != null && t2 >= 48 && t2 <= 57))
+          break;
+        t1.readChar$0();
+      }
+      return P.double_parse(t1.substring$1(0, start));
+    },
+    _stylesheet0$_tryExponent$0: function() {
+      var next, t2, exponentSign, exponent,
+        t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first !== 101 && first !== 69)
+        return 1;
+      next = t1.peekChar$1(1);
+      if (!T.isDigit0(next) && next !== 45 && next !== 43)
+        return 1;
+      t1.readChar$0();
+      t2 = next === 45;
+      exponentSign = t2 ? -1 : 1;
+      if (next === 43 || t2)
+        t1.readChar$0();
+      if (!T.isDigit0(t1.peekChar$0()))
+        t1.error$1(0, "Expected digit.");
+      exponent = 0;
+      while (true) {
+        t2 = t1.peekChar$0();
+        if (!(t2 != null && t2 >= 48 && t2 <= 57))
+          break;
+        exponent = exponent * 10 + (t1.readChar$0() - 48);
+      }
+      return Math.pow(10, exponentSign * exponent);
+    },
+    _stylesheet0$_unicodeRange$0: function() {
+      var i, t2, j, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      _this.expectIdentChar$1(117);
+      t1.expectChar$1(43);
+      for (i = 0; i < 6; ++i)
+        if (!_this.scanCharIf$1(new V.StylesheetParser__unicodeRange_closure1()))
+          break;
+      if (t1.scanChar$1(63)) {
+        ++i;
+        for (; i < 6; ++i)
+          if (!t1.scanChar$1(63))
+            break;
+        t2 = t1.substring$1(0, start.position);
+        t1 = t1.spanFrom$1(start);
+        return new D.StringExpression0(X.Interpolation$0(H.setRuntimeTypeInfo([t2], type$.JSArray_legacy_Object), t1), false);
+      }
+      if (i === 0)
+        t1.error$1(0, 'Expected hex digit or "?".');
+      if (t1.scanChar$1(45)) {
+        for (j = 0; j < 6; ++j)
+          if (!_this.scanCharIf$1(new V.StylesheetParser__unicodeRange_closure2()))
+            break;
+        if (j === 0)
+          t1.error$1(0, "Expected hex digit.");
+      }
+      if (_this._stylesheet0$_lookingAtInterpolatedIdentifierBody$0())
+        t1.error$1(0, "Expected end of identifier.");
+      t2 = t1.substring$1(0, start.position);
+      t1 = t1.spanFrom$1(start);
+      return new D.StringExpression0(X.Interpolation$0(H.setRuntimeTypeInfo([t2], type$.JSArray_legacy_Object), t1), false);
+    },
+    _stylesheet0$_variable$0: function() {
+      var _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        $name = _this.variableName$0();
+      if (_this.get$plainCss())
+        _this.error$2(0, string$.Sass_v, t1.spanFrom$1(start));
+      return new S.VariableExpression0(null, $name, t1.spanFrom$1(start));
+    },
+    _stylesheet0$_selector$0: function() {
+      var t1, start, _this = this;
+      if (_this.get$plainCss())
+        _this.scanner.error$2$length(0, string$.The_pa, 1);
+      t1 = _this.scanner;
+      start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      t1.expectChar$1(38);
+      if (t1.scanChar$1(38)) {
+        _this.logger.warn$2$span(0, string$.In_Sas, t1.spanFrom$1(start));
+        t1.set$position(t1._string_scanner$_position - 1);
+      }
+      return new T.SelectorExpression0(t1.spanFrom$1(start));
+    },
+    interpolatedString$0: function() {
+      var t3, t4, buffer, next, second, t5,
+        t1 = this.scanner,
+        t2 = t1._string_scanner$_position,
+        quote = t1.readChar$0();
+      if (quote !== 39 && quote !== 34)
+        t1.error$2$position(0, "Expected string.", t2);
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer0(t3, t4);
+      for (; true;) {
+        next = t1.peekChar$0();
+        if (next === quote) {
+          t1.readChar$0();
+          break;
+        } else if (next == null || next === 10 || next === 13 || next === 12)
+          t1.error$1(0, "Expected " + H.Primitives_stringFromCharCode(quote) + ".");
+        else if (next === 92) {
+          second = t1.peekChar$1(1);
+          if (second === 10 || second === 13 || second === 12) {
+            t1.readChar$0();
+            t1.readChar$0();
+            if (second === 13)
+              t1.scanChar$1(10);
+          } else
+            t3._contents += H.Primitives_stringFromCharCode(this.escapeCharacter$0());
+        } else if (next === 35)
+          if (t1.peekChar$1(1) === 123) {
+            t5 = this.singleInterpolation$0();
+            buffer._interpolation_buffer0$_flushText$0();
+            t4.push(t5);
+          } else
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+        else
+          t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+      }
+      return new D.StringExpression0(buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2))), true);
+    },
+    identifierLike$0: function() {
+      var invocation, lower, color, specialFunction, $name, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        identifier = _this.interpolatedIdentifier$0(),
+        plain = identifier.get$asPlain(),
+        t2 = plain == null;
+      if (!t2) {
+        if (plain === "if") {
+          invocation = _this._stylesheet0$_argumentInvocation$0();
+          return new L.IfExpression0(invocation, B.spanForList0(H.setRuntimeTypeInfo([identifier, invocation], type$.JSArray_legacy_AstNode_2)));
+        } else if (plain === "not") {
+          _this.whitespace$0();
+          return new X.UnaryOperationExpression0(C.UnaryOperator_not_not0, _this._stylesheet0$_singleExpression$0(), identifier.span);
+        }
+        lower = plain.toLowerCase();
+        if (t1.peekChar$0() !== 40) {
+          switch (plain) {
+            case "false":
+              return new Z.BooleanExpression0(false, identifier.span);
+            case "null":
+              return new O.NullExpression0(identifier.span);
+            case "true":
+              return new Z.BooleanExpression0(true, identifier.span);
+          }
+          color = $.$get$colorsByName0().$index(0, lower);
+          if (color != null)
+            return new K.ColorExpression0(K.SassColor$rgb0(color.get$red(), color.get$green(), color.get$blue(), color.alpha, identifier.span));
+        }
+        specialFunction = _this.trySpecialFunction$2(lower, start);
+        if (specialFunction != null)
+          return specialFunction;
+      }
+      switch (t1.peekChar$0()) {
+        case 46:
+          if (t1.peekChar$1(1) === 46)
+            return new D.StringExpression0(identifier, false);
+          t1.readChar$0();
+          if (t2)
+            _this.error$2(0, string$.Interpn, identifier.span);
+          if (t1.peekChar$0() === 36) {
+            $name = _this.variableName$0();
+            _this._stylesheet0$_assertPublic$2($name, new V.StylesheetParser_identifierLike_closure0(_this, start));
+            return new S.VariableExpression0(plain, $name, t1.spanFrom$1(start));
+          }
+          t2 = t1._string_scanner$_position;
+          return new F.FunctionExpression0(plain, X.Interpolation$0(H.setRuntimeTypeInfo([_this._stylesheet0$_publicIdentifier$0()], type$.JSArray_legacy_Object), t1.spanFrom$1(new S._SpanScannerState(t1, t2))), _this._stylesheet0$_argumentInvocation$0(), t1.spanFrom$1(start));
+        case 40:
+          return new F.FunctionExpression0(null, identifier, _this._stylesheet0$_argumentInvocation$0(), t1.spanFrom$1(start));
+        default:
+          return new D.StringExpression0(identifier, false);
+      }
+    },
+    trySpecialFunction$2: function($name, start) {
+      var t1, buffer, t2, t3, next, contents, _this = this, _null = null;
+      switch (B.unvendor0($name)) {
+        case "calc":
+        case "element":
+        case "expression":
+          if (!_this.scanner.scanChar$1(40))
+            return _null;
+          t1 = new P.StringBuffer("");
+          buffer = new Z.InterpolationBuffer0(t1, []);
+          t1._contents = $name;
+          t1._contents += H.Primitives_stringFromCharCode(40);
+          break;
+        case "min":
+        case "max":
+          t1 = _this.scanner;
+          t2 = t1._string_scanner$_position;
+          if (!t1.scanChar$1(40))
+            return _null;
+          _this.whitespace$0();
+          t3 = new P.StringBuffer("");
+          buffer = new Z.InterpolationBuffer0(t3, []);
+          t3._contents = $name;
+          t3._contents += H.Primitives_stringFromCharCode(40);
+          if (!_this._stylesheet0$_tryMinMaxContents$1(buffer)) {
+            t1.set$state(new S._SpanScannerState(t1, t2));
+            return _null;
+          }
+          return new D.StringExpression0(buffer.interpolation$1(t1.spanFrom$1(start)), false);
+        case "progid":
+          t1 = _this.scanner;
+          if (!t1.scanChar$1(58))
+            return _null;
+          t2 = new P.StringBuffer("");
+          buffer = new Z.InterpolationBuffer0(t2, []);
+          t2._contents = $name;
+          t2._contents += H.Primitives_stringFromCharCode(58);
+          next = t1.peekChar$0();
+          while (true) {
+            if (next != null) {
+              if (!(next >= 97 && next <= 122))
+                t3 = next >= 65 && next <= 90;
+              else
+                t3 = true;
+              t3 = t3 || next === 46;
+            } else
+              t3 = false;
+            if (!t3)
+              break;
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            next = t1.peekChar$0();
+          }
+          t1.expectChar$1(40);
+          t2._contents += H.Primitives_stringFromCharCode(40);
+          break;
+        case "url":
+          contents = _this._stylesheet0$_tryUrlContents$1(start);
+          return contents == null ? _null : new D.StringExpression0(contents, false);
+        case "clamp":
+          if ($name !== "clamp")
+            return _null;
+          if (!_this.scanner.scanChar$1(40))
+            return _null;
+          t1 = new P.StringBuffer("");
+          buffer = new Z.InterpolationBuffer0(t1, []);
+          t1._contents = $name;
+          t1._contents += H.Primitives_stringFromCharCode(40);
+          break;
+        default:
+          return _null;
+      }
+      buffer.addInterpolation$1(_this._stylesheet0$_interpolatedDeclarationValue$1$allowEmpty(true));
+      t1 = _this.scanner;
+      t1.expectChar$1(41);
+      buffer._interpolation_buffer0$_text._contents += H.Primitives_stringFromCharCode(41);
+      return new D.StringExpression0(buffer.interpolation$1(t1.spanFrom$1(start)), false);
+    },
+    _stylesheet0$_tryMinMaxContents$2$allowComma: function(buffer, allowComma) {
+      var t1, t2, t3, t4, start, end, exception, t5, _this = this;
+      for (t1 = _this.scanner, t2 = buffer._interpolation_buffer0$_text, t3 = !allowComma, t4 = _this.get$_stylesheet0$_number(); true;) {
+        switch (t1.peekChar$0()) {
+          case 45:
+          case 43:
+          case 48:
+          case 49:
+          case 50:
+          case 51:
+          case 52:
+          case 53:
+          case 54:
+          case 55:
+          case 56:
+          case 57:
+            try {
+              start = t1._string_scanner$_position;
+              t4.call$0();
+              end = t1._string_scanner$_position;
+              t2._contents += J.substring$2$s(t1.string, start, end);
+            } catch (exception) {
+              if (type$.legacy_FormatException._is(H.unwrapException(exception)))
+                return false;
+              else
+                throw exception;
+            }
+            break;
+          case 35:
+            if (t1.peekChar$1(1) !== 123)
+              return false;
+            t5 = _this.singleInterpolation$0();
+            buffer._interpolation_buffer0$_flushText$0();
+            buffer._interpolation_buffer0$_contents.push(t5);
+            break;
+          case 99:
+          case 67:
+            switch (t1.peekChar$1(1)) {
+              case 97:
+              case 65:
+                if (!_this._stylesheet0$_tryMinMaxFunction$2(buffer, "calc"))
+                  return false;
+                break;
+              case 108:
+              case 76:
+                if (!_this._stylesheet0$_tryMinMaxFunction$2(buffer, "clamp"))
+                  return false;
+                break;
+            }
+            break;
+          case 101:
+          case 69:
+            if (!_this._stylesheet0$_tryMinMaxFunction$2(buffer, "env"))
+              return false;
+            break;
+          case 118:
+          case 86:
+            if (!_this._stylesheet0$_tryMinMaxFunction$2(buffer, "var"))
+              return false;
+            break;
+          case 40:
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            if (!_this._stylesheet0$_tryMinMaxContents$2$allowComma(buffer, false))
+              return false;
+            break;
+          case 109:
+          case 77:
+            t1.readChar$0();
+            if (_this.scanIdentChar$1(105)) {
+              if (!_this.scanIdentChar$1(110))
+                return false;
+              t2._contents += "min(";
+            } else if (_this.scanIdentChar$1(97)) {
+              if (!_this.scanIdentChar$1(120))
+                return false;
+              t2._contents += "max(";
+            } else
+              return false;
+            if (!t1.scanChar$1(40))
+              return false;
+            if (!_this._stylesheet0$_tryMinMaxContents$1(buffer))
+              return false;
+            break;
+          default:
+            return false;
+        }
+        _this.whitespace$0();
+        switch (t1.peekChar$0()) {
+          case 41:
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            return true;
+          case 43:
+          case 45:
+          case 42:
+          case 47:
+            t2._contents += H.Primitives_stringFromCharCode(32);
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            t2._contents += H.Primitives_stringFromCharCode(32);
+            break;
+          case 44:
+            if (t3)
+              return false;
+            t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            t2._contents += H.Primitives_stringFromCharCode(32);
+            break;
+          default:
+            return false;
+        }
+        _this.whitespace$0();
+      }
+    },
+    _stylesheet0$_tryMinMaxContents$1: function(buffer) {
+      return this._stylesheet0$_tryMinMaxContents$2$allowComma(buffer, true);
+    },
+    _stylesheet0$_tryMinMaxFunction$2: function(buffer, $name) {
+      var t1, t2;
+      if (!this.scanIdentifier$1($name))
+        return false;
+      t1 = this.scanner;
+      if (!t1.scanChar$1(40))
+        return false;
+      t2 = buffer._interpolation_buffer0$_text;
+      t2._contents += $name;
+      t2._contents += H.Primitives_stringFromCharCode(40);
+      buffer.addInterpolation$1(this._stylesheet0$_interpolatedDeclarationValue$1$allowEmpty(true));
+      t2._contents += H.Primitives_stringFromCharCode(41);
+      if (!t1.scanChar$1(41))
+        return false;
+      return true;
+    },
+    _stylesheet0$_tryUrlContents$2$name: function(start, $name) {
+      var t3, t4, buffer, next, t5, endPosition, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      if (!t1.scanChar$1(40))
+        return null;
+      _this.whitespaceWithoutComments$0();
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer0(t3, t4);
+      t3._contents = $name == null ? "url" : $name;
+      t3._contents += H.Primitives_stringFromCharCode(40);
+      for (; true;) {
+        next = t1.peekChar$0();
+        if (next == null)
+          break;
+        else {
+          if (next !== 33)
+            if (next !== 37)
+              if (next !== 38)
+                t5 = next >= 42 && next <= 126 || next >= 128;
+              else
+                t5 = true;
+            else
+              t5 = true;
+          else
+            t5 = true;
+          if (t5)
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          else if (next === 92)
+            t3._contents += H.S(_this.escape$0());
+          else if (next === 35)
+            if (t1.peekChar$1(1) === 123) {
+              t5 = _this.singleInterpolation$0();
+              buffer._interpolation_buffer0$_flushText$0();
+              t4.push(t5);
+            } else
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          else if (next === 32 || next === 9 || next === 10 || next === 13 || next === 12) {
+            _this.whitespaceWithoutComments$0();
+            if (t1.peekChar$0() !== 41)
+              break;
+          } else if (next === 41) {
+            t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+            endPosition = t1._string_scanner$_position;
+            t2 = t1._sourceFile;
+            t3 = start.position;
+            t1 = new Y._FileSpan(t2, t3, endPosition);
+            t1._FileSpan$3(t2, t3, endPosition);
+            return buffer.interpolation$1(t1);
+          } else
+            break;
+        }
+      }
+      t1.set$state(new S._SpanScannerState(t1, t2));
+      return null;
+    },
+    _stylesheet0$_tryUrlContents$1: function(start) {
+      return this._stylesheet0$_tryUrlContents$2$name(start, null);
+    },
+    dynamicUrl$0: function() {
+      var contents, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      _this.expectIdentifier$1("url");
+      contents = _this._stylesheet0$_tryUrlContents$1(start);
+      if (contents != null)
+        return new D.StringExpression0(contents, false);
+      return new F.FunctionExpression0(null, X.Interpolation$0(H.setRuntimeTypeInfo(["url"], type$.JSArray_legacy_Object), t1.spanFrom$1(start)), _this._stylesheet0$_argumentInvocation$0(), t1.spanFrom$1(start));
+    },
+    almostAnyValue$1$omitComments: function(omitComments) {
+      var t4, t5, next, commentStart, end, t6, contents, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        buffer = new Z.InterpolationBuffer0(t3, []);
+      $label0$1:
+        for (t4 = t1.string, t5 = !omitComments; true;) {
+          next = t1.peekChar$0();
+          switch (next) {
+            case 92:
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 34:
+            case 39:
+              buffer.addInterpolation$1(_this.interpolatedString$0().asInterpolation$0());
+              break;
+            case 47:
+              commentStart = t1._string_scanner$_position;
+              if (_this.scanComment$0()) {
+                if (t5) {
+                  end = t1._string_scanner$_position;
+                  t3._contents += J.substring$2$s(t4, commentStart, end);
+                }
+              } else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 35:
+              if (t1.peekChar$1(1) === 123)
+                buffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+              else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 13:
+            case 10:
+            case 12:
+              if (_this.get$indented())
+                break $label0$1;
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+            case 33:
+            case 59:
+            case 123:
+            case 125:
+              break $label0$1;
+            case 117:
+            case 85:
+              t6 = t1._string_scanner$_position;
+              if (!_this.scanIdentifier$1("url")) {
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+                break;
+              }
+              contents = _this._stylesheet0$_tryUrlContents$1(new S._SpanScannerState(t1, t6));
+              if (contents == null) {
+                if (t6 < 0 || t6 > t4.length)
+                  H.throwExpression(P.ArgumentError$("Invalid position " + t6));
+                t1._string_scanner$_position = t6;
+                t1._lastMatch = null;
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              } else
+                buffer.addInterpolation$1(contents);
+              break;
+            default:
+              if (next == null)
+                break $label0$1;
+              if (_this.lookingAtIdentifier$0())
+                t3._contents += _this.identifier$0();
+              else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              break;
+          }
+        }
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    almostAnyValue$0: function() {
+      return this.almostAnyValue$1$omitComments(false);
+    },
+    _stylesheet0$_interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon: function(allowColon, allowEmpty, allowSemicolon) {
+      var t4, t5, t6, wroteNewline, next, t7, start, end, contents, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        buffer = new Z.InterpolationBuffer0(t3, []),
+        brackets = H.setRuntimeTypeInfo([], type$.JSArray_legacy_int);
+      $label0$1:
+        for (t4 = t1.string, t5 = !allowColon, t6 = !allowSemicolon, wroteNewline = false; true;) {
+          next = t1.peekChar$0();
+          switch (next) {
+            case 92:
+              t3._contents += H.S(_this.escape$1$identifierStart(true));
+              wroteNewline = false;
+              break;
+            case 34:
+            case 39:
+              buffer.addInterpolation$1(_this.interpolatedString$0().asInterpolation$0());
+              wroteNewline = false;
+              break;
+            case 47:
+              if (t1.peekChar$1(1) === 42) {
+                t7 = _this.get$loudComment();
+                start = t1._string_scanner$_position;
+                t7.call$0();
+                end = t1._string_scanner$_position;
+                t3._contents += J.substring$2$s(t4, start, end);
+              } else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 35:
+              if (t1.peekChar$1(1) === 123)
+                buffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+              else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 32:
+            case 9:
+              if (!wroteNewline) {
+                t7 = t1.peekChar$1(1);
+                t7 = !(t7 === 32 || t7 === 9 || t7 === 10 || t7 === 13 || t7 === 12);
+              } else
+                t7 = true;
+              if (t7)
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              else
+                t1.readChar$0();
+              break;
+            case 10:
+            case 13:
+            case 12:
+              if (_this.get$indented())
+                break $label0$1;
+              t7 = t1.peekChar$1(-1);
+              if (!(t7 === 10 || t7 === 13 || t7 === 12))
+                t3._contents += "\n";
+              t1.readChar$0();
+              wroteNewline = true;
+              break;
+            case 40:
+            case 123:
+            case 91:
+              t3._contents += H.Primitives_stringFromCharCode(next);
+              brackets.push(T.opposite0(t1.readChar$0()));
+              wroteNewline = false;
+              break;
+            case 41:
+            case 125:
+            case 93:
+              if (brackets.length === 0)
+                break $label0$1;
+              t3._contents += H.Primitives_stringFromCharCode(next);
+              t1.expectChar$1(brackets.pop());
+              wroteNewline = false;
+              break;
+            case 59:
+              if (t6 && brackets.length === 0)
+                break $label0$1;
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 58:
+              if (t5 && brackets.length === 0)
+                break $label0$1;
+              t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+            case 117:
+            case 85:
+              t7 = t1._string_scanner$_position;
+              if (!_this.scanIdentifier$1("url")) {
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+                wroteNewline = false;
+                break;
+              }
+              contents = _this._stylesheet0$_tryUrlContents$1(new S._SpanScannerState(t1, t7));
+              if (contents == null) {
+                if (t7 < 0 || t7 > t4.length)
+                  H.throwExpression(P.ArgumentError$("Invalid position " + t7));
+                t1._string_scanner$_position = t7;
+                t1._lastMatch = null;
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              } else
+                buffer.addInterpolation$1(contents);
+              wroteNewline = false;
+              break;
+            default:
+              if (next == null)
+                break $label0$1;
+              if (_this.lookingAtIdentifier$0())
+                t3._contents += _this.identifier$0();
+              else
+                t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+              wroteNewline = false;
+              break;
+          }
+        }
+      if (brackets.length !== 0)
+        t1.expectChar$1(C.JSArray_methods.get$last(brackets));
+      if (!allowEmpty && buffer._interpolation_buffer0$_contents.length === 0 && t3._contents.length === 0)
+        t1.error$1(0, "Expected token.");
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _stylesheet0$_interpolatedDeclarationValue$1$allowEmpty: function(allowEmpty) {
+      return this._stylesheet0$_interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon(true, allowEmpty, false);
+    },
+    _stylesheet0$_interpolatedDeclarationValue$2$allowEmpty$allowSemicolon: function(allowEmpty, allowSemicolon) {
+      return this._stylesheet0$_interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon(true, allowEmpty, allowSemicolon);
+    },
+    _stylesheet0$_interpolatedDeclarationValue$0: function() {
+      return this._stylesheet0$_interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon(true, false, false);
+    },
+    interpolatedIdentifier$0: function() {
+      var first, _this = this,
+        _s20_ = "Expected identifier.",
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        t2 = new P.StringBuffer(""),
+        t3 = [],
+        buffer = new Z.InterpolationBuffer0(t2, t3);
+      if (t1.scanChar$1(45)) {
+        t2._contents += H.Primitives_stringFromCharCode(45);
+        if (t1.scanChar$1(45)) {
+          t2._contents += H.Primitives_stringFromCharCode(45);
+          _this._stylesheet0$_interpolatedIdentifierBody$1(buffer);
+          return buffer.interpolation$1(t1.spanFrom$1(start));
+        }
+      }
+      first = t1.peekChar$0();
+      if (first == null)
+        t1.error$1(0, _s20_);
+      else if (first === 95 || T.isAlphabetic1(first) || first >= 128)
+        t2._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+      else if (first === 92)
+        t2._contents += H.S(_this.escape$1$identifierStart(true));
+      else if (first === 35 && t1.peekChar$1(1) === 123) {
+        t2 = _this.singleInterpolation$0();
+        buffer._interpolation_buffer0$_flushText$0();
+        t3.push(t2);
+      } else
+        t1.error$1(0, _s20_);
+      _this._stylesheet0$_interpolatedIdentifierBody$1(buffer);
+      return buffer.interpolation$1(t1.spanFrom$1(start));
+    },
+    _stylesheet0$_interpolatedIdentifierBody$1: function(buffer) {
+      var t1, t2, t3, next, t4;
+      for (t1 = buffer._interpolation_buffer0$_contents, t2 = this.scanner, t3 = buffer._interpolation_buffer0$_text; true;) {
+        next = t2.peekChar$0();
+        if (next == null)
+          break;
+        else {
+          if (next !== 95)
+            if (next !== 45) {
+              if (!(next >= 97 && next <= 122))
+                t4 = next >= 65 && next <= 90;
+              else
+                t4 = true;
+              if (!t4)
+                t4 = next >= 48 && next <= 57;
+              else
+                t4 = true;
+              t4 = t4 || next >= 128;
+            } else
+              t4 = true;
+          else
+            t4 = true;
+          if (t4)
+            t3._contents += H.Primitives_stringFromCharCode(t2.readChar$0());
+          else if (next === 92)
+            t3._contents += H.S(this.escape$0());
+          else if (next === 35 && t2.peekChar$1(1) === 123) {
+            t4 = this.singleInterpolation$0();
+            buffer._interpolation_buffer0$_flushText$0();
+            t1.push(t4);
+          } else
+            break;
+        }
+      }
+    },
+    singleInterpolation$0: function() {
+      var contents, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      t1.expect$1("#{");
+      _this.whitespace$0();
+      contents = _this.expression$0();
+      t1.expectChar$1(125);
+      if (_this.get$plainCss())
+        _this.error$2(0, string$.Interpp, t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+      return contents;
+    },
+    _stylesheet0$_mediaQueryList$0: function() {
+      var t1 = this.scanner,
+        t2 = t1._string_scanner$_position,
+        t3 = new P.StringBuffer(""),
+        buffer = new Z.InterpolationBuffer0(t3, []);
+      for (; true;) {
+        this.whitespace$0();
+        this._stylesheet0$_mediaQuery$1(buffer);
+        if (!t1.scanChar$1(44))
+          break;
+        t3._contents += H.Primitives_stringFromCharCode(44);
+        t3._contents += H.Primitives_stringFromCharCode(32);
+      }
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _stylesheet0$_mediaQuery$1: function(buffer) {
+      var t1, identifier, _this = this;
+      if (_this.scanner.peekChar$0() !== 40) {
+        buffer.addInterpolation$1(_this.interpolatedIdentifier$0());
+        _this.whitespace$0();
+        if (!_this._stylesheet0$_lookingAtInterpolatedIdentifier$0())
+          return;
+        t1 = buffer._interpolation_buffer0$_text;
+        t1._contents += H.Primitives_stringFromCharCode(32);
+        identifier = _this.interpolatedIdentifier$0();
+        _this.whitespace$0();
+        if (B.equalsIgnoreCase0(identifier.get$asPlain(), "and"))
+          t1._contents += " and ";
+        else {
+          buffer.addInterpolation$1(identifier);
+          if (_this.scanIdentifier$1("and")) {
+            _this.whitespace$0();
+            t1._contents += " and ";
+          } else
+            return;
+        }
+      }
+      for (t1 = buffer._interpolation_buffer0$_text; true;) {
+        _this.whitespace$0();
+        buffer.addInterpolation$1(_this._stylesheet0$_mediaFeature$0());
+        _this.whitespace$0();
+        if (!_this.scanIdentifier$1("and"))
+          break;
+        t1._contents += " and ";
+      }
+    },
+    _stylesheet0$_mediaFeature$0: function() {
+      var interpolation, t2, t3, t4, buffer, t5, next, isAngle, _this = this,
+        t1 = _this.scanner;
+      if (t1.peekChar$0() === 35) {
+        interpolation = _this.singleInterpolation$0();
+        return X.Interpolation$0(H.setRuntimeTypeInfo([interpolation], type$.JSArray_legacy_Object), interpolation.get$span());
+      }
+      t2 = t1._string_scanner$_position;
+      t3 = new P.StringBuffer("");
+      t4 = [];
+      buffer = new Z.InterpolationBuffer0(t3, t4);
+      t1.expectChar$1(40);
+      t3._contents += H.Primitives_stringFromCharCode(40);
+      _this.whitespace$0();
+      t5 = _this._stylesheet0$_expressionUntilComparison$0();
+      buffer._interpolation_buffer0$_flushText$0();
+      t4.push(t5);
+      if (t1.scanChar$1(58)) {
+        _this.whitespace$0();
+        t3._contents += H.Primitives_stringFromCharCode(58);
+        t3._contents += H.Primitives_stringFromCharCode(32);
+        t5 = _this.expression$0();
+        buffer._interpolation_buffer0$_flushText$0();
+        t4.push(t5);
+      } else {
+        next = t1.peekChar$0();
+        isAngle = next === 60 || next === 62;
+        if (isAngle || next === 61) {
+          t3._contents += H.Primitives_stringFromCharCode(32);
+          t3._contents += H.Primitives_stringFromCharCode(t1.readChar$0());
+          if (isAngle && t1.scanChar$1(61))
+            t3._contents += H.Primitives_stringFromCharCode(61);
+          t3._contents += H.Primitives_stringFromCharCode(32);
+          _this.whitespace$0();
+          t5 = _this._stylesheet0$_expressionUntilComparison$0();
+          buffer._interpolation_buffer0$_flushText$0();
+          t4.push(t5);
+          if (isAngle && t1.scanChar$1(next)) {
+            t3._contents += H.Primitives_stringFromCharCode(32);
+            t3._contents += H.Primitives_stringFromCharCode(next);
+            if (t1.scanChar$1(61))
+              t3._contents += H.Primitives_stringFromCharCode(61);
+            t3._contents += H.Primitives_stringFromCharCode(32);
+            _this.whitespace$0();
+            t5 = _this._stylesheet0$_expressionUntilComparison$0();
+            buffer._interpolation_buffer0$_flushText$0();
+            t4.push(t5);
+          }
+        }
+      }
+      t1.expectChar$1(41);
+      _this.whitespace$0();
+      t3._contents += H.Primitives_stringFromCharCode(41);
+      return buffer.interpolation$1(t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+    },
+    _stylesheet0$_expressionUntilComparison$0: function() {
+      return this.expression$1$until(new V.StylesheetParser__expressionUntilComparison_closure0(this));
+    },
+    _stylesheet0$_supportsCondition$0: function() {
+      var condition, operator, right, endPosition, t3, t4, lowerOperator, _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position;
+      if (_this.scanIdentifier$1("not")) {
+        _this.whitespace$0();
+        return new M.SupportsNegation0(_this._stylesheet0$_supportsConditionInParens$0(), t1.spanFrom$1(new S._SpanScannerState(t1, t2)));
+      }
+      condition = _this._stylesheet0$_supportsConditionInParens$0();
+      _this.whitespace$0();
+      for (operator = null; _this.lookingAtIdentifier$0();) {
+        if (operator != null)
+          _this.expectIdentifier$1(operator);
+        else if (_this.scanIdentifier$1("or"))
+          operator = "or";
+        else {
+          _this.expectIdentifier$1("and");
+          operator = "and";
+        }
+        _this.whitespace$0();
+        right = _this._stylesheet0$_supportsConditionInParens$0();
+        endPosition = t1._string_scanner$_position;
+        t3 = t1._sourceFile;
+        t4 = new Y._FileSpan(t3, t2, endPosition);
+        t4._FileSpan$3(t3, t2, endPosition);
+        condition = new U.SupportsOperation0(condition, right, operator, t4);
+        lowerOperator = operator.toLowerCase();
+        if (lowerOperator !== "and" && lowerOperator !== "or")
+          H.throwExpression(P.ArgumentError$value(operator, "operator", 'may only be "and" or "or".'));
+        _this.whitespace$0();
+      }
+      return condition;
+    },
+    _stylesheet0$_supportsConditionInParens$0: function() {
+      var $name, nameStart, wasInParentheses, identifier, operation, contents, identifier0, t2, $arguments, condition, exception, value, _this = this,
+        t1 = _this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      if (_this._stylesheet0$_lookingAtInterpolatedIdentifier$0()) {
+        identifier0 = _this.interpolatedIdentifier$0();
+        t2 = identifier0.get$asPlain();
+        if ((t2 == null ? null : t2.toLowerCase()) === "not")
+          _this.error$2(0, '"not" is not a valid identifier here.', identifier0.span);
+        if (t1.scanChar$1(40)) {
+          $arguments = _this._stylesheet0$_interpolatedDeclarationValue$2$allowEmpty$allowSemicolon(true, true);
+          t1.expectChar$1(41);
+          return new F.SupportsFunction0(identifier0, $arguments, t1.spanFrom$1(start));
+        } else {
+          t2 = identifier0.contents;
+          if (t2.length !== 1 || !type$.legacy_Expression_2._is(C.JSArray_methods.get$first(t2)))
+            _this.error$2(0, "Expected @supports condition.", identifier0.span);
+          else
+            return new X.SupportsInterpolation0(type$.legacy_Expression_2._as(C.JSArray_methods.get$first(t2)), t1.spanFrom$1(start));
+        }
+      }
+      t1.expectChar$1(40);
+      _this.whitespace$0();
+      if (_this.scanIdentifier$1("not")) {
+        _this.whitespace$0();
+        condition = _this._stylesheet0$_supportsConditionInParens$0();
+        t1.expectChar$1(41);
+        return new M.SupportsNegation0(condition, t1.spanFrom$1(start));
+      } else if (t1.peekChar$0() === 40) {
+        condition = _this._stylesheet0$_supportsCondition$0();
+        t1.expectChar$1(41);
+        return condition;
+      }
+      $name = null;
+      nameStart = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      wasInParentheses = _this._stylesheet0$_inParentheses;
+      try {
+        $name = _this.expression$0();
+        t1.expectChar$1(58);
+      } catch (exception) {
+        if (type$.legacy_FormatException._is(H.unwrapException(exception))) {
+          t1.set$state(nameStart);
+          _this._stylesheet0$_inParentheses = wasInParentheses;
+          identifier = _this.interpolatedIdentifier$0();
+          operation = _this._stylesheet0$_trySupportsOperation$2(identifier, nameStart);
+          if (operation != null) {
+            t1.expectChar$1(41);
+            return operation;
+          }
+          t2 = new Z.InterpolationBuffer0(new P.StringBuffer(""), []);
+          t2.addInterpolation$1(identifier);
+          t2.addInterpolation$1(_this._stylesheet0$_interpolatedDeclarationValue$3$allowColon$allowEmpty$allowSemicolon(false, true, true));
+          contents = t2.interpolation$1(t1.spanFrom$1(nameStart));
+          if (t1.peekChar$0() === 58)
+            throw exception;
+          t1.expectChar$1(41);
+          return new Y.SupportsAnything0(contents, t1.spanFrom$1(start));
+        } else
+          throw exception;
+      }
+      _this.whitespace$0();
+      value = _this.expression$0();
+      t1.expectChar$1(41);
+      return new L.SupportsDeclaration0($name, value, t1.spanFrom$1(start));
+    },
+    _stylesheet0$_trySupportsOperation$2: function(interpolation, start) {
+      var expression, beforeWhitespace, t2, t3, operator, operation, right, t4, endPosition, t5, t6, lowerOperator, _this = this, _null = null,
+        t1 = interpolation.contents;
+      if (t1.length !== 1)
+        return _null;
+      expression = C.JSArray_methods.get$first(t1);
+      if (!type$.legacy_Expression_2._is(expression))
+        return _null;
+      t1 = _this.scanner;
+      beforeWhitespace = new S._SpanScannerState(t1, t1._string_scanner$_position);
+      _this.whitespace$0();
+      for (t2 = start.position, t3 = interpolation.span, operator = _null, operation = operator; _this.lookingAtIdentifier$0();) {
+        if (operator != null)
+          _this.expectIdentifier$1(operator);
+        else if (_this.scanIdentifier$1("and"))
+          operator = "and";
+        else {
+          if (!_this.scanIdentifier$1("or")) {
+            if (beforeWhitespace._scanner !== t1)
+              H.throwExpression(P.ArgumentError$(string$.The_gi));
+            t2 = beforeWhitespace.position;
+            if (t2 < 0 || t2 > t1.string.length)
+              H.throwExpression(P.ArgumentError$("Invalid position " + t2));
+            t1._string_scanner$_position = t2;
+            return t1._lastMatch = null;
+          }
+          operator = "or";
+        }
+        _this.whitespace$0();
+        right = _this._stylesheet0$_supportsConditionInParens$0();
+        t4 = operation == null ? new X.SupportsInterpolation0(expression, t3) : operation;
+        endPosition = t1._string_scanner$_position;
+        t5 = t1._sourceFile;
+        t6 = new Y._FileSpan(t5, t2, endPosition);
+        t6._FileSpan$3(t5, t2, endPosition);
+        operation = new U.SupportsOperation0(t4, right, operator, t6);
+        lowerOperator = operator.toLowerCase();
+        if (lowerOperator !== "and" && lowerOperator !== "or")
+          H.throwExpression(P.ArgumentError$value(operator, "operator", 'may only be "and" or "or".'));
+        _this.whitespace$0();
+      }
+      return operation;
+    },
+    _stylesheet0$_lookingAtInterpolatedIdentifier$0: function() {
+      var second,
+        t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first == null)
+        return false;
+      if (first === 95 || T.isAlphabetic1(first) || first >= 128 || first === 92)
+        return true;
+      if (first === 35)
+        return t1.peekChar$1(1) === 123;
+      if (first !== 45)
+        return false;
+      second = t1.peekChar$1(1);
+      if (second == null)
+        return false;
+      if (second === 35)
+        return t1.peekChar$1(2) === 123;
+      return second === 95 || T.isAlphabetic1(second) || second >= 128 || second === 92 || second === 45;
+    },
+    _stylesheet0$_lookingAtInterpolatedIdentifierBody$0: function() {
+      var t1 = this.scanner,
+        first = t1.peekChar$0();
+      if (first == null)
+        return false;
+      if (first === 95 || T.isAlphabetic1(first) || first >= 128 || T.isDigit0(first) || first === 45 || first === 92)
+        return true;
+      return first === 35 && t1.peekChar$1(1) === 123;
+    },
+    _stylesheet0$_lookingAtExpression$0: function() {
+      var next,
+        t1 = this.scanner,
+        character = t1.peekChar$0();
+      if (character == null)
+        return false;
+      if (character === 46)
+        return t1.peekChar$1(1) !== 46;
+      if (character === 33) {
+        next = t1.peekChar$1(1);
+        if (next != null)
+          if ((next | 32) !== 105)
+            t1 = next === 32 || next === 9 || T.isNewline0(next);
+          else
+            t1 = true;
+        else
+          t1 = true;
+        return t1;
+      }
+      if (character !== 40)
+        if (character !== 47)
+          if (character !== 91)
+            if (character !== 39)
+              if (character !== 34)
+                if (character !== 35)
+                  if (character !== 43)
+                    if (character !== 45)
+                      if (character !== 92)
+                        if (character !== 36)
+                          if (character !== 38)
+                            t1 = character === 95 || T.isAlphabetic1(character) || character >= 128 || T.isDigit0(character);
+                          else
+                            t1 = true;
+                        else
+                          t1 = true;
+                      else
+                        t1 = true;
+                    else
+                      t1 = true;
+                  else
+                    t1 = true;
+                else
+                  t1 = true;
+              else
+                t1 = true;
+            else
+              t1 = true;
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    _stylesheet0$_withChildren$1$3: function(child, start, create) {
+      var result = create.call$2(this.children$1(0, child), this.scanner.spanFrom$1(start));
+      this.whitespaceWithoutComments$0();
+      return result;
+    },
+    _stylesheet0$_withChildren$3: function(child, start, create) {
+      return this._stylesheet0$_withChildren$1$3(child, start, create, type$.dynamic);
+    },
+    _stylesheet0$_urlString$0: function() {
+      var innerError, t2, exception,
+        t1 = this.scanner,
+        start = new S._SpanScannerState(t1, t1._string_scanner$_position),
+        url = this.string$0();
+      try {
+        t2 = P.Uri_parse(url);
+        return t2;
+      } catch (exception) {
+        t2 = H.unwrapException(exception);
+        if (type$.legacy_FormatException._is(t2)) {
+          innerError = t2;
+          this.error$2(0, "Invalid URL: " + H.S(J.get$message$x(innerError)), t1.spanFrom$1(start));
+        } else
+          throw exception;
+      }
+    },
+    _stylesheet0$_publicIdentifier$0: function() {
+      var _this = this,
+        t1 = _this.scanner,
+        t2 = t1._string_scanner$_position,
+        result = _this.identifier$1$normalize(true);
+      _this._stylesheet0$_assertPublic$2(result, new V.StylesheetParser__publicIdentifier_closure0(_this, new S._SpanScannerState(t1, t2)));
+      return result;
+    },
+    _stylesheet0$_assertPublic$2: function(identifier, span) {
+      if (!T.isPrivate0(identifier))
+        return;
+      this.error$2(0, string$.Privat, span.call$0());
+    },
+    get$plainCss: function() {
+      return false;
+    }
+  };
+  V.StylesheetParser_parse_closure0.prototype = {
+    call$0: function() {
+      var statements, t4,
+        t1 = this.$this,
+        t2 = t1.scanner,
+        t3 = t2._string_scanner$_position;
+      t2.scanChar$1(65279);
+      statements = t1.statements$1(new V.StylesheetParser_parse__closure1(t1));
+      t2.expectDone$0();
+      t4 = t1._stylesheet0$_globalVariables;
+      t4 = t4.get$values(t4);
+      C.JSArray_methods.addAll$1(statements, H.MappedIterable_MappedIterable(t4, new V.StylesheetParser_parse__closure2(), H._instanceType(t4)._eval$1("Iterable.E"), type$.legacy_Statement_2));
+      return V.Stylesheet$0(statements, t2.spanFrom$1(new S._SpanScannerState(t2, t3)), t1.get$plainCss());
+    },
+    $signature: 214
+  };
+  V.StylesheetParser_parse__closure1.prototype = {
+    call$0: function() {
+      return this.$this._stylesheet0$_statement$1$root(true);
+    },
+    $signature: 52
+  };
+  V.StylesheetParser_parse__closure2.prototype = {
+    call$1: function(declaration) {
+      return Z.VariableDeclaration$0(declaration.name, new O.NullExpression0(declaration.expression.get$span()), declaration.span, null, false, true, null);
+    },
+    $signature: 435
+  };
+  V.StylesheetParser_parseArgumentDeclaration_closure0.prototype = {
+    call$0: function() {
+      var $arguments,
+        t1 = this.$this,
+        t2 = t1.scanner;
+      t2.expectChar$2$name(64, "@-rule");
+      t1.identifier$0();
+      t1.whitespace$0();
+      t1.identifier$0();
+      $arguments = t1._stylesheet0$_argumentDeclaration$0();
+      t1.whitespace$0();
+      t2.expectChar$1(123);
+      return $arguments;
+    },
+    $signature: 436
+  };
+  V.StylesheetParser__parseSingleProduction_closure0.prototype = {
+    call$0: function() {
+      var result = this.production.call$0();
+      this.$this.scanner.expectDone$0();
+      return result;
+    },
+    $signature: function() {
+      return this.T._eval$1("0*()");
+    }
+  };
+  V.StylesheetParser_parseSignature_closure.prototype = {
+    call$0: function() {
+      var t2, $arguments, t3,
+        t1 = this.$this,
+        $name = t1.identifier$0();
+      t1.whitespace$0();
+      t2 = t1.scanner;
+      if (t2.peekChar$0() === 40)
+        $arguments = t1._stylesheet0$_argumentDeclaration$0();
+      else {
+        t1 = Y.FileLocation$_(t2._sourceFile, t2._string_scanner$_position);
+        t3 = t1.offset;
+        $arguments = new B.ArgumentDeclaration0(C.List_empty20, null, Y._FileSpan$(t1.file, t3, t3));
+      }
+      t2.expectDone$0();
+      return new S.Tuple2($name, $arguments, type$.Tuple2_of_legacy_String_and_legacy_ArgumentDeclaration);
+    },
+    $signature: 437
+  };
+  V.StylesheetParser__statement_closure0.prototype = {
+    call$0: function() {
+      return this.$this._stylesheet0$_statement$0();
+    },
+    $signature: 52
+  };
+  V.StylesheetParser_variableDeclarationWithoutNamespace_closure1.prototype = {
+    call$0: function() {
+      return this.$this.scanner.spanFrom$1(this._box_0.start);
+    },
+    $signature: 33
+  };
+  V.StylesheetParser_variableDeclarationWithoutNamespace_closure2.prototype = {
+    call$0: function() {
+      return this.declaration;
+    },
+    $signature: 438
+  };
+  V.StylesheetParser__declarationOrBuffer_closure1.prototype = {
+    call$2: function(children, span) {
+      return L.Declaration$0(this.name, span, children, null);
+    },
+    $signature: 69
+  };
+  V.StylesheetParser__declarationOrBuffer_closure2.prototype = {
+    call$2: function(children, span) {
+      return L.Declaration$0(this.name, span, children, this._box_0.value);
+    },
+    $signature: 69
+  };
+  V.StylesheetParser__styleRule_closure0.prototype = {
+    call$2: function(children, span) {
+      var t2, _this = this,
+        t1 = _this.$this;
+      if (t1.get$indented() && children.length === 0)
+        t1.logger.warn$2$span(0, string$.This_s, _this._box_0.interpolation.span);
+      t1._stylesheet0$_inStyleRule = _this.wasInStyleRule;
+      t2 = _this._box_0;
+      return X.StyleRule$0(t2.interpolation, children, t1.scanner.spanFrom$1(t2.start));
+    },
+    $signature: 440
+  };
+  V.StylesheetParser__propertyOrVariableDeclaration_closure1.prototype = {
+    call$2: function(children, span) {
+      return L.Declaration$0(this._box_0.name, span, children, null);
+    },
+    $signature: 69
+  };
+  V.StylesheetParser__propertyOrVariableDeclaration_closure2.prototype = {
+    call$2: function(children, span) {
+      return L.Declaration$0(this._box_0.name, span, children, this.value);
+    },
+    $signature: 69
+  };
+  V.StylesheetParser__atRootRule_closure1.prototype = {
+    call$2: function(children, span) {
+      return V.AtRootRule$0(children, span, this.query);
+    },
+    $signature: 201
+  };
+  V.StylesheetParser__atRootRule_closure2.prototype = {
+    call$2: function(children, span) {
+      return V.AtRootRule$0(children, span, null);
+    },
+    $signature: 201
+  };
+  V.StylesheetParser__eachRule_closure0.prototype = {
+    call$2: function(children, span) {
+      var _this = this;
+      _this.$this._stylesheet0$_inControlDirective = _this.wasInControlDirective;
+      return V.EachRule$0(_this.variables, _this.list, children, span);
+    },
+    $signature: 442
+  };
+  V.StylesheetParser__functionRule_closure0.prototype = {
+    call$2: function(children, span) {
+      return M.FunctionRule$0(this.name, this.$arguments, children, span, this.precedingComment);
+    },
+    $signature: 443
+  };
+  V.StylesheetParser__forRule_closure1.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      if (!t1.lookingAtIdentifier$0())
+        return false;
+      if (t1.scanIdentifier$1("to"))
+        return this._box_0.exclusive = true;
+      else if (t1.scanIdentifier$1("through")) {
+        this._box_0.exclusive = false;
+        return true;
+      } else
+        return false;
+    },
+    $signature: 35
+  };
+  V.StylesheetParser__forRule_closure2.prototype = {
+    call$2: function(children, span) {
+      var _this = this;
+      _this.$this._stylesheet0$_inControlDirective = _this.wasInControlDirective;
+      return B.ForRule$0(_this.variable, _this.from, _this.to, children, span, _this._box_0.exclusive);
+    },
+    $signature: 444
+  };
+  V.StylesheetParser__memberList_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this;
+      if (t1.scanner.peekChar$0() === 36)
+        this.variables.add$1(0, t1.variableName$0());
+      else
+        this.identifiers.add$1(0, t1.identifier$1$normalize(true));
+    },
+    $signature: 0
+  };
+  V.StylesheetParser__includeRule_closure0.prototype = {
+    call$2: function(children, span) {
+      return Y.ContentBlock$0(this._box_0.contentArguments, children, span);
+    },
+    $signature: 445
+  };
+  V.StylesheetParser_mediaRule_closure0.prototype = {
+    call$2: function(children, span) {
+      return G.MediaRule$0(this.query, children, span);
+    },
+    $signature: 446
+  };
+  V.StylesheetParser__mixinRule_closure0.prototype = {
+    call$2: function(children, span) {
+      var _this = this,
+        t1 = _this.$this,
+        hadContent = t1._stylesheet0$_mixinHasContent;
+      t1._stylesheet0$_inMixin = false;
+      t1._stylesheet0$_mixinHasContent = null;
+      return T.MixinRule$0(_this.name, _this.$arguments, children, span, _this.precedingComment, hadContent);
+    },
+    $signature: 447
+  };
+  V.StylesheetParser_mozDocumentRule_closure0.prototype = {
+    call$2: function(children, span) {
+      var _this = this;
+      if (_this._box_0.needsDeprecationWarning)
+        _this.$this.logger.warn$3$deprecation$span(0, string$.x40_moz_, true, span);
+      return U.AtRule$0(_this.name, span, children, _this.value);
+    },
+    $signature: 160
+  };
+  V.StylesheetParser_supportsRule_closure0.prototype = {
+    call$2: function(children, span) {
+      return B.SupportsRule$0(this.condition, children, span);
+    },
+    $signature: 449
+  };
+  V.StylesheetParser__whileRule_closure0.prototype = {
+    call$2: function(children, span) {
+      this.$this._stylesheet0$_inControlDirective = this.wasInControlDirective;
+      return G.WhileRule$0(this.condition, children, span);
+    },
+    $signature: 450
+  };
+  V.StylesheetParser_unknownAtRule_closure0.prototype = {
+    call$2: function(children, span) {
+      return U.AtRule$0(this.name, span, children, this._box_0.value);
+    },
+    $signature: 160
+  };
+  V.StylesheetParser_expression_resetState0.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this._box_0;
+      t1.operands = t1.operators = t1.spaceExpressions = t1.commaExpressions = null;
+      t2 = this.$this;
+      t2.scanner.set$state(this.start);
+      t1.allowSlash = t2.lookingAtNumber$0();
+      t1.singleExpression = t2._stylesheet0$_singleExpression$0();
+    },
+    $signature: 1
+  };
+  V.StylesheetParser_expression_resolveOneOperation0.prototype = {
+    call$0: function() {
+      var t2, t3,
+        t1 = this._box_0,
+        operator = t1.operators.pop();
+      if (operator !== C.BinaryOperator_RTB0)
+        t1.allowSlash = false;
+      t2 = t1.allowSlash && !this.$this._stylesheet0$_inParentheses;
+      t3 = t1.operands;
+      if (t2)
+        t1.singleExpression = new V.BinaryOperationExpression0(C.BinaryOperator_RTB0, t3.pop(), t1.singleExpression, true);
+      else
+        t1.singleExpression = new V.BinaryOperationExpression0(operator, t3.pop(), t1.singleExpression, false);
+    },
+    $signature: 1
+  };
+  V.StylesheetParser_expression_resolveOperations0.prototype = {
+    call$0: function() {
+      var t2,
+        t1 = this._box_0;
+      if (t1.operators == null)
+        return;
+      for (t2 = this.resolveOneOperation; t1.operators.length !== 0;)
+        t2.call$0();
+    },
+    $signature: 1
+  };
+  V.StylesheetParser_expression_addSingleExpression0.prototype = {
+    call$2$number: function(expression, number) {
+      var t2, _this = this,
+        t1 = _this._box_0;
+      if (t1.singleExpression != null) {
+        t2 = _this.$this;
+        if (t2._stylesheet0$_inParentheses) {
+          t2._stylesheet0$_inParentheses = false;
+          if (t1.allowSlash) {
+            _this.resetState.call$0();
+            return;
+          }
+        }
+        if (t1.spaceExpressions == null)
+          t1.spaceExpressions = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression_2);
+        _this.resolveOperations.call$0();
+        t1.spaceExpressions.push(t1.singleExpression);
+        t1.allowSlash = number;
+      } else if (!number)
+        t1.allowSlash = false;
+      t1.singleExpression = expression;
+    },
+    call$1: function(expression) {
+      return this.call$2$number(expression, false);
+    },
+    $signature: 451
+  };
+  V.StylesheetParser_expression_addOperator0.prototype = {
+    call$1: function(operator) {
+      var t2, t3, t4, t5, singleExpression,
+        t1 = this.$this;
+      if (t1.get$plainCss() && operator !== C.BinaryOperator_RTB0 && operator !== C.BinaryOperator_kjl0) {
+        t2 = t1.scanner;
+        t3 = operator.operator.length;
+        t2.error$3$length$position(0, "Operators aren't allowed in plain CSS.", t3, t2._string_scanner$_position - t3);
+      }
+      t2 = this._box_0;
+      t2.allowSlash = t2.allowSlash && operator === C.BinaryOperator_RTB0;
+      if (t2.operators == null)
+        t2.operators = H.setRuntimeTypeInfo([], type$.JSArray_legacy_BinaryOperator_2);
+      if (t2.operands == null)
+        t2.operands = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Expression_2);
+      t3 = this.resolveOneOperation;
+      t4 = operator.precedence;
+      while (true) {
+        t5 = t2.operators;
+        if (!(t5.length !== 0 && C.JSArray_methods.get$last(t5).precedence >= t4))
+          break;
+        t3.call$0();
+      }
+      t2.operators.push(operator);
+      t2.operands.push(t2.singleExpression);
+      t1.whitespace$0();
+      t2.allowSlash = t2.allowSlash && t1.lookingAtNumber$0();
+      singleExpression = t1._stylesheet0$_singleExpression$0();
+      t2.singleExpression = singleExpression;
+      t2.allowSlash = t2.allowSlash && singleExpression instanceof T.NumberExpression0;
+    },
+    $signature: 452
+  };
+  V.StylesheetParser_expression_resolveSpaceExpressions0.prototype = {
+    call$0: function() {
+      var t1, t2;
+      this.resolveOperations.call$0();
+      t1 = this._box_0;
+      t2 = t1.spaceExpressions;
+      if (t2 != null) {
+        t2.push(t1.singleExpression);
+        t1.singleExpression = D.ListExpression$0(t1.spaceExpressions, C.ListSeparator_space0, false, null);
+        t1.spaceExpressions = null;
+      }
+    },
+    $signature: 1
+  };
+  V.StylesheetParser__expressionUntilComma_closure0.prototype = {
+    call$0: function() {
+      return this.$this.scanner.peekChar$0() === 44;
+    },
+    $signature: 35
+  };
+  V.StylesheetParser__unicodeRange_closure1.prototype = {
+    call$1: function(char) {
+      return char != null && T.isHex0(char);
+    },
+    $signature: 24
+  };
+  V.StylesheetParser__unicodeRange_closure2.prototype = {
+    call$1: function(char) {
+      return char != null && T.isHex0(char);
+    },
+    $signature: 24
+  };
+  V.StylesheetParser_identifierLike_closure0.prototype = {
+    call$0: function() {
+      return this.$this.scanner.spanFrom$1(this.start);
+    },
+    $signature: 33
+  };
+  V.StylesheetParser__expressionUntilComparison_closure0.prototype = {
+    call$0: function() {
+      var t1 = this.$this.scanner,
+        next = t1.peekChar$0();
+      if (next === 61)
+        return t1.peekChar$1(1) !== 61;
+      return next === 60 || next === 62;
+    },
+    $signature: 35
+  };
+  V.StylesheetParser__publicIdentifier_closure0.prototype = {
+    call$0: function() {
+      return this.$this.scanner.spanFrom$1(this.start);
+    },
+    $signature: 33
+  };
+  V.Stylesheet0.prototype = {
+    Stylesheet$3$plainCss0: function(children, span, plainCss) {
+      var t1, t2, t3, t4, _i, child;
+      for (t1 = this.children, t2 = t1.length, t3 = this._stylesheet1$_forwards, t4 = this._stylesheet1$_uses, _i = 0; _i < t2; ++_i) {
+        child = t1[_i];
+        if (child instanceof T.UseRule0)
+          t4.push(child);
+        else if (child instanceof L.ForwardRule0)
+          t3.push(child);
+        else if (!(child instanceof B.SilentComment0) && !(child instanceof L.LoudComment0) && !(child instanceof Z.VariableDeclaration0))
+          break;
+      }
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitStylesheet$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return (t1 && C.JSArray_methods).join$1(t1, " ");
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.ModifiableCssSupportsRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitCssSupportsRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    copyWithoutChildren$0: function() {
+      return B.ModifiableCssSupportsRule$0(this.condition, this.span);
+    },
+    $isCssSupportsRule0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  B.SupportsRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitSupportsRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return "@supports " + this.condition.toString$0(0) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  M.Syntax0.prototype = {
+    toString$0: function(_) {
+      return this._syntax0$_name;
+    }
+  };
+  F.TypeSelector0.prototype = {
+    get$minSpecificity: function() {
+      return 1;
+    },
+    accept$1$1: function(visitor) {
+      visitor._buffer.write$1(0, this.name);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    addSuffix$1: function(suffix) {
+      var t1 = this.name;
+      return new F.TypeSelector0(new D.QualifiedName0(t1.name + suffix, t1.namespace));
+    },
+    unify$1: function(compound) {
+      var unified, t1, t2, cur, _i;
+      if (C.JSArray_methods.get$first(compound) instanceof N.UniversalSelector0 || C.JSArray_methods.get$first(compound) instanceof F.TypeSelector0) {
+        unified = Y.unifyUniversalAndElement0(this, C.JSArray_methods.get$first(compound));
+        if (unified == null)
+          return null;
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector_2);
+        t1.push(unified);
+        for (t2 = H.SubListIterable$(compound, 1, null, H._arrayInstanceType(compound)._precomputed1), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+          cur = t2.__internal$_current;
+          t1.push(cur);
+        }
+        return t1;
+      } else {
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector_2);
+        t1.push(this);
+        for (t2 = compound.length, _i = 0; _i < compound.length; compound.length === t2 || (0, H.throwConcurrentModificationError)(compound), ++_i)
+          t1.push(compound[_i]);
+        return t1;
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof F.TypeSelector0 && other.name.$eq(0, this.name);
+    },
+    get$hashCode: function(_) {
+      var t1 = this.name;
+      return C.JSString_methods.get$hashCode(t1.name) ^ J.get$hashCode$(t1.namespace);
+    }
+  };
+  G.Types.prototype = {};
+  X.UnaryOperationExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitUnaryOperationExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.operator,
+        t2 = t1.operator;
+      t1 = t1 === C.UnaryOperator_not_not0 ? t2 + H.Primitives_stringFromCharCode(32) : t2;
+      t1 += H.S(this.operand);
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  X.UnaryOperator0.prototype = {
+    toString$0: function(_) {
+      return this.name;
+    }
+  };
+  N.UnitlessSassNumber0.prototype = {
+    get$numeratorUnits: function() {
+      return C.List_empty;
+    },
+    get$denominatorUnits: function() {
+      return C.List_empty;
+    },
+    get$hasUnits: function() {
+      return false;
+    },
+    withValue$1: function(value) {
+      return new N.UnitlessSassNumber0(value, null);
+    },
+    withSlash$2: function(numerator, denominator) {
+      return new N.UnitlessSassNumber0(this.value, new S.Tuple2(numerator, denominator, type$.Tuple2_of_legacy_SassNumber_and_legacy_SassNumber_2));
+    },
+    hasUnit$1: function(unit) {
+      return false;
+    },
+    compatibleWithUnit$1: function(unit) {
+      return true;
+    },
+    coerceValueToMatch$1: function(other) {
+      return this.value;
+    },
+    convertValueToMatch$3: function(other, $name, otherName) {
+      return other.get$hasUnits() ? this.super$SassNumber$convertValueToMatch0(other, $name, otherName) : this.value;
+    },
+    coerce$2: function(newNumerators, newDenominators) {
+      return T.SassNumber_SassNumber$withUnits0(this.value, newDenominators, newNumerators);
+    },
+    coerceValue$3: function(newNumerators, newDenominators, $name) {
+      return this.value;
+    },
+    coerceValueToUnit$2: function(unit, $name) {
+      return this.value;
+    },
+    greaterThan$1: function(other) {
+      var t1, t2;
+      if (other instanceof T.SassNumber0) {
+        t1 = this.value;
+        t2 = other.value;
+        return t1 > t2 && !(Math.abs(t1 - t2) < $.$get$epsilon0()) ? C.SassBoolean_true : C.SassBoolean_false;
+      }
+      return this.super$SassNumber$greaterThan0(other);
+    },
+    greaterThanOrEquals$1: function(other) {
+      var t1, t2;
+      if (other instanceof T.SassNumber0) {
+        t1 = this.value;
+        t2 = other.value;
+        return t1 > t2 || Math.abs(t1 - t2) < $.$get$epsilon0() ? C.SassBoolean_true : C.SassBoolean_false;
+      }
+      return this.super$SassNumber$greaterThanOrEquals0(other);
+    },
+    lessThan$1: function(other) {
+      var t1, t2;
+      if (other instanceof T.SassNumber0) {
+        t1 = this.value;
+        t2 = other.value;
+        return t1 < t2 && !(Math.abs(t1 - t2) < $.$get$epsilon0()) ? C.SassBoolean_true : C.SassBoolean_false;
+      }
+      return this.super$SassNumber$lessThan0(other);
+    },
+    lessThanOrEquals$1: function(other) {
+      var t1, t2;
+      if (other instanceof T.SassNumber0) {
+        t1 = this.value;
+        t2 = other.value;
+        return t1 < t2 || Math.abs(t1 - t2) < $.$get$epsilon0() ? C.SassBoolean_true : C.SassBoolean_false;
+      }
+      return this.super$SassNumber$lessThanOrEquals0(other);
+    },
+    modulo$1: function(other) {
+      if (other instanceof T.SassNumber0)
+        return other.withValue$1(this.moduloLikeSass$2(this.value, other.value));
+      return this.super$SassNumber$modulo0(other);
+    },
+    plus$1: function(other) {
+      if (other instanceof T.SassNumber0)
+        return other.withValue$1(this.value + other.value);
+      return this.super$SassNumber$plus0(other);
+    },
+    minus$1: function(other) {
+      if (other instanceof T.SassNumber0)
+        return other.withValue$1(this.value - other.value);
+      return this.super$SassNumber$minus0(other);
+    },
+    times$1: function(other) {
+      if (other instanceof T.SassNumber0)
+        return other.withValue$1(this.value * other.value);
+      return this.super$SassNumber$times0(other);
+    },
+    dividedBy$1: function(other) {
+      var t1, t2, t3;
+      if (other instanceof T.SassNumber0) {
+        t1 = other.get$hasUnits();
+        t2 = this.value;
+        t3 = other.value;
+        if (t1) {
+          t1 = other.get$denominatorUnits();
+          t1 = T.SassNumber_SassNumber$withUnits0(t2 / t3, other.get$numeratorUnits(), t1);
+        } else
+          t1 = new N.UnitlessSassNumber0(t2 / t3, null);
+        return t1;
+      }
+      return this.super$SassNumber$dividedBy0(other);
+    },
+    unaryMinus$0: function() {
+      return new N.UnitlessSassNumber0(-this.value, null);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof N.UnitlessSassNumber0 && Math.abs(this.value - other.value) < $.$get$epsilon0();
+    },
+    get$hashCode: function(_) {
+      return T.fuzzyHashCode0(this.value);
+    }
+  };
+  N.UniversalSelector0.prototype = {
+    get$minSpecificity: function() {
+      return 0;
+    },
+    accept$1$1: function(visitor) {
+      var t2,
+        t1 = this.namespace;
+      if (t1 != null) {
+        t2 = visitor._buffer;
+        t2.write$1(0, t1);
+        t2.writeCharCode$1(124);
+      }
+      visitor._buffer.writeCharCode$1(42);
+      return null;
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    unify$1: function(compound) {
+      var unified, t1, t2, cur, _i, _this = this;
+      if (C.JSArray_methods.get$first(compound) instanceof N.UniversalSelector0 || C.JSArray_methods.get$first(compound) instanceof F.TypeSelector0) {
+        unified = Y.unifyUniversalAndElement0(_this, C.JSArray_methods.get$first(compound));
+        if (unified == null)
+          return null;
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector_2);
+        t1.push(unified);
+        for (t2 = H.SubListIterable$(compound, 1, null, H._arrayInstanceType(compound)._precomputed1), t2 = new H.ListIterator(t2, t2.get$length(t2)); t2.moveNext$0();) {
+          cur = t2.__internal$_current;
+          t1.push(cur);
+        }
+        return t1;
+      }
+      t1 = _this.namespace;
+      if (t1 != null && t1 !== "*") {
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_SimpleSelector_2);
+        t1.push(_this);
+        for (t2 = compound.length, _i = 0; _i < compound.length; compound.length === t2 || (0, H.throwConcurrentModificationError)(compound), ++_i)
+          t1.push(compound[_i]);
+        return t1;
+      }
+      if (compound.length !== 0)
+        return compound;
+      return H.setRuntimeTypeInfo([_this], type$.JSArray_legacy_SimpleSelector_2);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof N.UniversalSelector0 && other.namespace == this.namespace;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.namespace);
+    }
+  };
+  R.UnprefixedMapView0.prototype = {
+    get$keys: function(_) {
+      return new R._UnprefixedKeys0(this);
+    },
+    $index: function(_, key) {
+      return typeof key == "string" ? this._unprefixed_map_view0$_map.$index(0, J.$add$ansx(this._unprefixed_map_view0$_prefix, key)) : null;
+    },
+    containsKey$1: function(key) {
+      return typeof key == "string" && this._unprefixed_map_view0$_map.containsKey$1(J.$add$ansx(this._unprefixed_map_view0$_prefix, key));
+    },
+    remove$1: function(_, key) {
+      return typeof key == "string" ? this._unprefixed_map_view0$_map.remove$1(0, J.$add$ansx(this._unprefixed_map_view0$_prefix, key)) : null;
+    }
+  };
+  R._UnprefixedKeys0.prototype = {
+    get$iterator: function(_) {
+      var t1 = this._unprefixed_map_view0$_view._unprefixed_map_view0$_map;
+      t1 = J.where$1$ax(t1.get$keys(t1), new R._UnprefixedKeys_iterator_closure1(this)).map$1$1(0, new R._UnprefixedKeys_iterator_closure2(this), type$.legacy_String);
+      return t1.get$iterator(t1);
+    },
+    contains$1: function(_, key) {
+      return this._unprefixed_map_view0$_view.containsKey$1(key);
+    }
+  };
+  R._UnprefixedKeys_iterator_closure1.prototype = {
+    call$1: function(key) {
+      return J.startsWith$1$s(key, this.$this._unprefixed_map_view0$_view._unprefixed_map_view0$_prefix);
+    },
+    $signature: 6
+  };
+  R._UnprefixedKeys_iterator_closure2.prototype = {
+    call$1: function(key) {
+      return J.substring$1$s(key, this.$this._unprefixed_map_view0$_view._unprefixed_map_view0$_prefix.length);
+    },
+    $signature: 4
+  };
+  T.UseRule0.prototype = {
+    UseRule$4$configuration0: function(url, namespace, span, configuration) {
+      var t1, t2, _i, variable;
+      for (t1 = this.configuration, t2 = t1.length, _i = 0; _i < t2; ++_i) {
+        variable = t1[_i];
+        if (variable.isGuarded)
+          throw H.wrapException(P.ArgumentError$value(variable, "configured variable", "can't be guarded in a @use rule."));
+      }
+    },
+    accept$1$1: function(visitor) {
+      return visitor.visitUseRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.url,
+        t2 = "@use " + H.S(new D.StringExpression0(X.Interpolation$0(H.setRuntimeTypeInfo([J.toString$0$(t1)], type$.JSArray_legacy_Object), null), true).asInterpolation$1$static(true).get$asPlain()),
+        basename = t1.get$pathSegments().length === 0 ? "" : C.JSArray_methods.get$last(t1.get$pathSegments()),
+        dot = J.getInterceptor$asx(basename).indexOf$1(basename, ".");
+      t1 = this.namespace;
+      if (t1 !== C.JSString_methods.substring$2(basename, 0, dot === -1 ? basename.length : dot))
+        t1 = t2 + (" as " + (t1 == null ? "*" : t1));
+      else
+        t1 = t2;
+      t2 = this.configuration;
+      t1 = (t2.length !== 0 ? t1 + (" with (" + C.JSArray_methods.join$1(t2, ", ") + ")") : t1) + ";";
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  E.UserDefinedCallable0.prototype = {
+    get$name: function(_) {
+      return this.declaration.name;
+    },
+    $isAsyncCallable0: 1,
+    $isCallable0: 1
+  };
+  B.resolveImportPath_closure1.prototype = {
+    call$0: function() {
+      return B._exactlyOne0(B._tryPath0($.$get$context().withoutExtension$1(this.path) + ".import" + this.extension));
+    },
+    $signature: 12
+  };
+  B.resolveImportPath_closure2.prototype = {
+    call$0: function() {
+      return B._exactlyOne0(B._tryPathWithExtensions0(H.S(this.path) + ".import"));
+    },
+    $signature: 12
+  };
+  B._tryPathAsDirectory_closure0.prototype = {
+    call$0: function() {
+      return B._exactlyOne0(B._tryPathWithExtensions0(D.join(this.path, "index.import", null)));
+    },
+    $signature: 12
+  };
+  B._exactlyOne_closure0.prototype = {
+    call$1: function(path) {
+      var t1 = $.$get$context();
+      return C.JSString_methods.$add("  ", t1.prettyUri$1(t1.toUri$1(path)));
+    },
+    $signature: 4
+  };
+  B.forwardToString_closure.prototype = {
+    call$1: function(thisArg) {
+      return J.toString$0$(thisArg);
+    },
+    $signature: 41
+  };
+  B.createClass_closure.prototype = {
+    call$2: function($name, body) {
+      this.$prototype[$name] = P.allowInteropCaptureThis(body);
+    },
+    $signature: 453
+  };
+  B._PropertyDescriptor0.prototype = {};
+  B.indent_closure0.prototype = {
+    call$1: function(line) {
+      return C.JSString_methods.$add(C.JSString_methods.$mul(" ", this.indentation), line);
+    },
+    $signature: 4
+  };
+  B.flattenVertically_closure1.prototype = {
+    call$1: function(inner) {
+      return Q.QueueList_QueueList$from(inner, this.T._eval$1("0*"));
+    },
+    $signature: function() {
+      return this.T._eval$1("QueueList<0*>*(Iterable<0*>*)");
+    }
+  };
+  B.flattenVertically_closure2.prototype = {
+    call$1: function(queue) {
+      this.result.push(queue.removeFirst$0());
+      return queue.get$length(queue) === 0;
+    },
+    $signature: function() {
+      return this.T._eval$1("bool*(QueueList<0*>*)");
+    }
+  };
+  B.longestCommonSubsequence_closure2.prototype = {
+    call$2: function(element1, element2) {
+      return J.$eq$(element1, element2) ? element1 : null;
+    },
+    $signature: function() {
+      return this.T._eval$1("0*(0*,0*)");
+    }
+  };
+  B.longestCommonSubsequence_closure3.prototype = {
+    call$1: function(_) {
+      return P.List_List$filled(J.get$length$asx(this.list2) + 1, 0, false, type$.legacy_int);
+    },
+    $signature: 208
+  };
+  B.longestCommonSubsequence_closure4.prototype = {
+    call$1: function(_) {
+      var t1 = new Array(J.get$length$asx(this.list2));
+      t1.fixed$length = Array;
+      return H.setRuntimeTypeInfo(t1, this.T._eval$1("JSArray<0*>"));
+    },
+    $signature: function() {
+      return this.T._eval$1("List<0*>*(int*)");
+    }
+  };
+  B.longestCommonSubsequence_backtrack0.prototype = {
+    call$2: function(i, j) {
+      var selection, t1, _this = this;
+      if (i === -1 || j === -1)
+        return H.setRuntimeTypeInfo([], _this.T._eval$1("JSArray<0*>"));
+      selection = J.$index$asx(_this.selections[i], j);
+      if (selection != null) {
+        t1 = _this.call$2(i - 1, j - 1);
+        J.add$1$ax(t1, selection);
+        return t1;
+      }
+      t1 = _this.lengths;
+      return J.$index$asx(t1[i + 1], j) > J.$index$asx(t1[i], j + 1) ? _this.call$2(i, j - 1) : _this.call$2(i - 1, j);
+    },
+    $signature: function() {
+      return this.T._eval$1("List<0*>*(int*,int*)");
+    }
+  };
+  B.mapAddAll2_closure0.prototype = {
+    call$2: function(key, inner) {
+      var t1 = this.destination;
+      if (t1.containsKey$1(key))
+        t1.$index(0, key).addAll$1(0, inner);
+      else
+        t1.$indexSet(0, key, inner);
+    },
+    $signature: function() {
+      return this.K1._eval$1("@<0>")._bind$1(this.K2)._bind$1(this.V)._eval$1("Null(1*,Map<2*,3*>*)");
+    }
+  };
+  F.CssValue0.prototype = {
+    toString$0: function(_) {
+      return J.toString$0$(this.value);
+    },
+    $isAstNode0: 1,
+    get$value: function(receiver) {
+      return this.value;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.ValueExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitValueExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return J.toString$0$(this.value);
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.ModifiableCssValue0.prototype = {
+    toString$0: function(_) {
+      return J.toString$0$(this.value);
+    },
+    $isAstNode0: 1,
+    $isCssValue0: 1,
+    get$value: function(receiver) {
+      return this.value;
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  F.Value0.prototype = {
+    get$isTruthy: function() {
+      return true;
+    },
+    get$separator: function() {
+      return C.ListSeparator_undecided0;
+    },
+    get$hasBrackets: function() {
+      return false;
+    },
+    get$asList: function() {
+      return H.setRuntimeTypeInfo([this], type$.JSArray_legacy_Value_2);
+    },
+    get$lengthAsList: function() {
+      return 1;
+    },
+    get$isBlank: function() {
+      return false;
+    },
+    get$isSpecialNumber: function() {
+      return false;
+    },
+    get$isVar: function() {
+      return false;
+    },
+    get$realNull: function() {
+      return this;
+    },
+    sassIndexToListIndex$2: function(sassIndex, $name) {
+      var _this = this,
+        index = sassIndex.assertNumber$1($name).assertInt$1($name);
+      if (index === 0)
+        throw H.wrapException(_this._value0$_exception$2("List index may not be 0.", $name));
+      if (Math.abs(index) > _this.get$lengthAsList())
+        throw H.wrapException(_this._value0$_exception$2("Invalid index " + sassIndex.toString$0(0) + " for a list with " + _this.get$lengthAsList() + " elements.", $name));
+      return index < 0 ? _this.get$lengthAsList() + index : index - 1;
+    },
+    assertColor$1: function($name) {
+      return H.throwExpression(this._value0$_exception$2(this.toString$0(0) + " is not a color.", $name));
+    },
+    assertFunction$1: function($name) {
+      return H.throwExpression(this._value0$_exception$2(this.toString$0(0) + " is not a function reference.", $name));
+    },
+    assertMap$1: function($name) {
+      return H.throwExpression(this._value0$_exception$2(this.toString$0(0) + " is not a map.", $name));
+    },
+    tryMap$0: function() {
+      return null;
+    },
+    assertNumber$1: function($name) {
+      return H.throwExpression(this._value0$_exception$2(this.toString$0(0) + " is not a number.", $name));
+    },
+    assertNumber$0: function() {
+      return this.assertNumber$1(null);
+    },
+    assertString$1: function($name) {
+      return H.throwExpression(this._value0$_exception$2(this.toString$0(0) + " is not a string.", $name));
+    },
+    assertSelector$2$allowParent$name: function(allowParent, $name) {
+      var error, t1, exception,
+        string = this._value0$_selectorString$1($name);
+      try {
+        t1 = D.SelectorList_SelectorList$parse0(string, allowParent, true, null);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException0) {
+          error = t1;
+          throw H.wrapException(this._value0$_exception$2(C.JSString_methods.replaceFirst$2(J.toString$0$(error), "Error: ", ""), $name));
+        } else
+          throw exception;
+      }
+    },
+    assertSelector$1$name: function($name) {
+      return this.assertSelector$2$allowParent$name(false, $name);
+    },
+    assertSelector$0: function() {
+      return this.assertSelector$2$allowParent$name(false, null);
+    },
+    assertSelector$1$allowParent: function(allowParent) {
+      return this.assertSelector$2$allowParent$name(allowParent, null);
+    },
+    assertCompoundSelector$1$name: function($name) {
+      var error, t1, exception,
+        allowParent = false,
+        string = this._value0$_selectorString$1($name);
+      try {
+        t1 = T.SelectorParser$0(string, allowParent, true, null, null).parseCompoundSelector$0();
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        if (t1 instanceof E.SassFormatException0) {
+          error = t1;
+          throw H.wrapException(this._value0$_exception$2(C.JSString_methods.replaceFirst$2(J.toString$0$(error), "Error: ", ""), $name));
+        } else
+          throw exception;
+      }
+    },
+    _value0$_selectorString$1: function($name) {
+      var string = this._value0$_selectorStringOrNull$0();
+      if (string != null)
+        return string;
+      throw H.wrapException(this._value0$_exception$2(this.toString$0(0) + string$.x20is_no, $name));
+    },
+    _value0$_selectorString$0: function() {
+      return this._value0$_selectorString$1(null);
+    },
+    _value0$_selectorStringOrNull$0: function() {
+      var t1, t2, result, t3, _i, complex, string, compound, _this = this, _null = null;
+      if (_this instanceof D.SassString0)
+        return _this.text;
+      if (!(_this instanceof D.SassList0))
+        return _null;
+      t1 = _this._list1$_contents;
+      t2 = t1.length;
+      if (t2 === 0)
+        return _null;
+      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
+      t3 = _this.separator === C.ListSeparator_comma0;
+      if (t3)
+        for (_i = 0; _i < t2; ++_i) {
+          complex = t1[_i];
+          if (complex instanceof D.SassString0)
+            result.push(complex.text);
+          else if (complex instanceof D.SassList0 && complex.separator === C.ListSeparator_space0) {
+            string = complex._value0$_selectorString$0();
+            result.push(string);
+          } else
+            return _null;
+        }
+      else
+        for (_i = 0; _i < t2; ++_i) {
+          compound = t1[_i];
+          if (compound instanceof D.SassString0)
+            result.push(compound.text);
+          else
+            return _null;
+        }
+      return C.JSArray_methods.join$1(result, t3 ? ", " : " ");
+    },
+    changeListContents$2$separator: function(contents, separator) {
+      var t1 = separator == null ? this.get$separator() : separator,
+        t2 = this.get$hasBrackets();
+      return D.SassList$0(contents, t1, t2);
+    },
+    changeListContents$1: function(contents) {
+      return this.changeListContents$2$separator(contents, null);
+    },
+    greaterThan$1: function(other) {
+      return H.throwExpression(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " > " + H.S(other) + '".'));
+    },
+    greaterThanOrEquals$1: function(other) {
+      return H.throwExpression(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " >= " + H.S(other) + '".'));
+    },
+    lessThan$1: function(other) {
+      return H.throwExpression(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " < " + H.S(other) + '".'));
+    },
+    lessThanOrEquals$1: function(other) {
+      return H.throwExpression(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " <= " + H.S(other) + '".'));
+    },
+    times$1: function(other) {
+      return H.throwExpression(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " * " + H.S(other) + '".'));
+    },
+    modulo$1: function(other) {
+      return H.throwExpression(E.SassScriptException$0('Undefined operation "' + this.toString$0(0) + " % " + H.S(other) + '".'));
+    },
+    plus$1: function(other) {
+      var t1;
+      if (other instanceof D.SassString0)
+        return new D.SassString0(C.JSString_methods.$add(N.serializeValue(this, false, true), other.text), other.hasQuotes);
+      else {
+        t1 = N.serializeValue(this, false, true);
+        other.toString;
+        return new D.SassString0(t1 + N.serializeValue(other, false, true), false);
+      }
+    },
+    minus$1: function(other) {
+      var t1 = N.serializeValue(this, false, true) + "-";
+      other.toString;
+      return new D.SassString0(t1 + N.serializeValue(other, false, true), false);
+    },
+    dividedBy$1: function(other) {
+      var t1 = N.serializeValue(this, false, true) + "/";
+      other.toString;
+      return new D.SassString0(t1 + N.serializeValue(other, false, true), false);
+    },
+    unaryPlus$0: function() {
+      return new D.SassString0("+" + N.serializeValue(this, false, true), false);
+    },
+    unaryMinus$0: function() {
+      return new D.SassString0("-" + N.serializeValue(this, false, true), false);
+    },
+    unaryNot$0: function() {
+      return C.SassBoolean_false;
+    },
+    withoutSlash$0: function() {
+      return this;
+    },
+    toString$0: function(_) {
+      return N.serializeValue(this, true, true);
+    },
+    _value0$_exception$2: function(message, $name) {
+      return new E.SassScriptException0($name == null ? message : "$" + $name + ": " + message);
+    }
+  };
+  S.VariableExpression0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitVariableExpression$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.namespace;
+      t1 = t1 != null ? "$" + (t1 + ".") : "$";
+      t1 += this.name;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isExpression0: 1,
+    $isAstNode0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  Z.VariableDeclaration0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitVariableDeclaration$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.namespace;
+      t1 = t1 != null ? "$" + (t1 + ".") : "$";
+      t1 += this.name + ": " + H.S(this.expression) + ";";
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  N.withWarnCallback_closure0.prototype = {
+    call$0: function() {
+      return this.callback.call$0();
+    },
+    "call*": "call$0",
+    $requiredArgCount: 0,
+    $signature: function() {
+      return this.T._eval$1("0*()");
+    }
+  };
+  Y.WarnRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitWarnRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      return "@warn " + H.S(this.expression) + ";";
+    },
+    $isAstNode0: 1,
+    $isStatement0: 1,
+    get$span: function() {
+      return this.span;
+    }
+  };
+  G.WhileRule0.prototype = {
+    accept$1$1: function(visitor) {
+      return visitor.visitWhileRule$1(this);
+    },
+    accept$1: function(visitor) {
+      return this.accept$1$1(visitor, type$.dynamic);
+    },
+    toString$0: function(_) {
+      var t1 = this.children;
+      return "@while " + H.S(this.condition) + " {" + (t1 && C.JSArray_methods).join$1(t1, " ") + "}";
+    },
+    get$span: function() {
+      return this.span;
+    }
+  };
+  (function aliases() {
+    var _ = J.Interceptor.prototype;
+    _.super$Interceptor$noSuchMethod = _.noSuchMethod$1;
+    _ = J.JavaScriptObject.prototype;
+    _.super$JavaScriptObject$toString = _.toString$0;
+    _ = H.JsLinkedHashMap.prototype;
+    _.super$JsLinkedHashMap$internalContainsKey = _.internalContainsKey$1;
+    _.super$JsLinkedHashMap$internalGet = _.internalGet$1;
+    _.super$JsLinkedHashMap$internalSet = _.internalSet$2;
+    _.super$JsLinkedHashMap$internalRemove = _.internalRemove$1;
+    _ = P._BroadcastStreamController.prototype;
+    _.super$_BroadcastStreamController$_addEventError = _._addEventError$0;
+    _ = P._BufferingStreamSubscription.prototype;
+    _.super$_BufferingStreamSubscription$_add = _._async$_add$1;
+    _.super$_BufferingStreamSubscription$_addError = _._addError$2;
+    _ = P.ListMixin.prototype;
+    _.super$ListMixin$setRange = _.setRange$4;
+    _ = P.Iterable.prototype;
+    _.super$Iterable$where = _.where$1;
+    _.super$Iterable$skipWhile = _.skipWhile$1;
+    _ = B.ModifiableCssParentNode.prototype;
+    _.super$ModifiableCssParentNode$addChild = _.addChild$1;
+    _ = M.SimpleSelector.prototype;
+    _.super$SimpleSelector$addSuffix = _.addSuffix$1;
+    _.super$SimpleSelector$unify = _.unify$1;
+    _ = G.Parser.prototype;
+    _.super$Parser$silentComment = _.silentComment$0;
+    _ = V.StylesheetParser.prototype;
+    _.super$StylesheetParser$importArgument = _.importArgument$0;
+    _ = F.Value.prototype;
+    _.super$Value$assertMap = _.assertMap$1;
+    _.super$Value$plus = _.plus$1;
+    _.super$Value$minus = _.minus$1;
+    _.super$Value$dividedBy = _.dividedBy$1;
+    _ = T.SassNumber.prototype;
+    _.super$SassNumber$convertValueToMatch = _.convertValueToMatch$3;
+    _.super$SassNumber$coerce = _.coerce$3;
+    _.super$SassNumber$coerceValue = _.coerceValue$3;
+    _.super$SassNumber$coerceValueToUnit = _.coerceValueToUnit$2;
+    _.super$SassNumber$greaterThan = _.greaterThan$1;
+    _.super$SassNumber$greaterThanOrEquals = _.greaterThanOrEquals$1;
+    _.super$SassNumber$lessThan = _.lessThan$1;
+    _.super$SassNumber$lessThanOrEquals = _.lessThanOrEquals$1;
+    _.super$SassNumber$modulo = _.modulo$1;
+    _.super$SassNumber$plus = _.plus$1;
+    _.super$SassNumber$minus = _.minus$1;
+    _.super$SassNumber$times = _.times$1;
+    _.super$SassNumber$dividedBy = _.dividedBy$1;
+    _ = Y.SourceSpanMixin.prototype;
+    _.super$SourceSpanMixin$compareTo = _.compareTo$1;
+    _.super$SourceSpanMixin$$eq = _.$eq;
+    _ = X.StringScanner.prototype;
+    _.super$StringScanner$readChar = _.readChar$0;
+    _.super$StringScanner$scanChar = _.scanChar$1;
+    _.super$StringScanner$scan = _.scan$1;
+    _.super$StringScanner$matches = _.matches$1;
+    _ = B.ModifiableCssParentNode0.prototype;
+    _.super$ModifiableCssParentNode$addChild0 = _.addChild$1;
+    _ = T.SassNumber0.prototype;
+    _.super$SassNumber$convertValueToMatch0 = _.convertValueToMatch$3;
+    _.super$SassNumber$coerce0 = _.coerce$3;
+    _.super$SassNumber$coerceValue0 = _.coerceValue$3;
+    _.super$SassNumber$coerceValueToUnit0 = _.coerceValueToUnit$2;
+    _.super$SassNumber$greaterThan0 = _.greaterThan$1;
+    _.super$SassNumber$greaterThanOrEquals0 = _.greaterThanOrEquals$1;
+    _.super$SassNumber$lessThan0 = _.lessThan$1;
+    _.super$SassNumber$lessThanOrEquals0 = _.lessThanOrEquals$1;
+    _.super$SassNumber$modulo0 = _.modulo$1;
+    _.super$SassNumber$plus0 = _.plus$1;
+    _.super$SassNumber$minus0 = _.minus$1;
+    _.super$SassNumber$times0 = _.times$1;
+    _.super$SassNumber$dividedBy0 = _.dividedBy$1;
+    _ = G.Parser1.prototype;
+    _.super$Parser$silentComment0 = _.silentComment$0;
+    _ = M.SimpleSelector0.prototype;
+    _.super$SimpleSelector$addSuffix0 = _.addSuffix$1;
+    _.super$SimpleSelector$unify0 = _.unify$1;
+    _ = V.StylesheetParser0.prototype;
+    _.super$StylesheetParser$importArgument0 = _.importArgument$0;
+    _ = F.Value0.prototype;
+    _.super$Value$assertMap0 = _.assertMap$1;
+    _.super$Value$plus0 = _.plus$1;
+    _.super$Value$minus0 = _.minus$1;
+    _.super$Value$dividedBy0 = _.dividedBy$1;
+  })();
+  (function installTearOffs() {
+    var _static_2 = hunkHelpers._static_2,
+      _instance_1_i = hunkHelpers._instance_1i,
+      _instance_1_u = hunkHelpers._instance_1u,
+      _static_1 = hunkHelpers._static_1,
+      _static_0 = hunkHelpers._static_0,
+      _static = hunkHelpers.installStaticTearOff,
+      _instance_0_u = hunkHelpers._instance_0u,
+      _instance = hunkHelpers.installInstanceTearOff,
+      _instance_2_u = hunkHelpers._instance_2u,
+      _instance_0_i = hunkHelpers._instance_0i;
+    _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 167);
+    _instance_1_i(J.JSArray.prototype, "get$contains", "contains$1", 26);
+    _instance_1_i(H._CastIterableBase.prototype, "get$contains", "contains$1", 26);
+    _instance_1_u(H.ConstantStringMap.prototype, "get$containsKey", "containsKey$1", 26);
+    _instance_1_u(H.ConstantProtoMap.prototype, "get$containsKey", "containsKey$1", 26);
+    _instance_1_u(H.JsLinkedHashMap.prototype, "get$containsKey", "containsKey$1", 26);
+    _static_1(P, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 106);
+    _static_1(P, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 106);
+    _static_1(P, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 106);
+    _static_0(P, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 1);
+    _static_1(P, "async___nullDataHandler$closure", "_nullDataHandler", 213);
+    _static_2(P, "async___nullErrorHandler$closure", "_nullErrorHandler", 56);
+    _static_0(P, "async___nullDoneHandler$closure", "_nullDoneHandler", 1);
+    _static(P, "async___rootHandleUncaughtError$closure", 5, null, ["call$5"], ["_rootHandleUncaughtError"], 456, 0);
+    _static(P, "async___rootRun$closure", 4, null, ["call$1$4", "call$4"], ["_rootRun", function($self, $parent, zone, f) {
+      return P._rootRun($self, $parent, zone, f, type$.dynamic);
+    }], 457, 1);
+    _static(P, "async___rootRunUnary$closure", 5, null, ["call$2$5", "call$5"], ["_rootRunUnary", function($self, $parent, zone, f, arg) {
+      return P._rootRunUnary($self, $parent, zone, f, arg, type$.dynamic, type$.dynamic);
+    }], 458, 1);
+    _static(P, "async___rootRunBinary$closure", 6, null, ["call$3$6", "call$6"], ["_rootRunBinary", function($self, $parent, zone, f, arg1, arg2) {
+      return P._rootRunBinary($self, $parent, zone, f, arg1, arg2, type$.dynamic, type$.dynamic, type$.dynamic);
+    }], 459, 1);
+    _static(P, "async___rootRegisterCallback$closure", 4, null, ["call$1$4", "call$4"], ["_rootRegisterCallback", function($self, $parent, zone, f) {
+      return P._rootRegisterCallback($self, $parent, zone, f, type$.dynamic);
+    }], 460, 0);
+    _static(P, "async___rootRegisterUnaryCallback$closure", 4, null, ["call$2$4", "call$4"], ["_rootRegisterUnaryCallback", function($self, $parent, zone, f) {
+      return P._rootRegisterUnaryCallback($self, $parent, zone, f, type$.dynamic, type$.dynamic);
+    }], 461, 0);
+    _static(P, "async___rootRegisterBinaryCallback$closure", 4, null, ["call$3$4", "call$4"], ["_rootRegisterBinaryCallback", function($self, $parent, zone, f) {
+      return P._rootRegisterBinaryCallback($self, $parent, zone, f, type$.dynamic, type$.dynamic, type$.dynamic);
+    }], 462, 0);
+    _static(P, "async___rootErrorCallback$closure", 5, null, ["call$5"], ["_rootErrorCallback"], 463, 0);
+    _static(P, "async___rootScheduleMicrotask$closure", 4, null, ["call$4"], ["_rootScheduleMicrotask"], 464, 0);
+    _static(P, "async___rootCreateTimer$closure", 5, null, ["call$5"], ["_rootCreateTimer"], 465, 0);
+    _static(P, "async___rootCreatePeriodicTimer$closure", 5, null, ["call$5"], ["_rootCreatePeriodicTimer"], 466, 0);
+    _static(P, "async___rootPrint$closure", 4, null, ["call$4"], ["_rootPrint"], 467, 0);
+    _static_1(P, "async___printToZone$closure", "_printToZone", 468);
+    _static(P, "async___rootFork$closure", 5, null, ["call$5"], ["_rootFork"], 469, 0);
+    var _;
+    _instance_0_u(_ = P._BroadcastSubscription.prototype, "get$_async$_onPause", "_async$_onPause$0", 1);
+    _instance_0_u(_, "get$_async$_onResume", "_async$_onResume$0", 1);
+    _instance(P._AsyncCompleter.prototype, "get$complete", 0, 0, function() {
+      return [null];
+    }, ["call$1", "call$0"], ["complete$1", "complete$0"], 298, 0);
+    _instance_2_u(P._Future.prototype, "get$_completeError", "_completeError$2", 56);
+    _instance_1_i(_ = P._StreamController.prototype, "get$add", "add$1", 63);
+    _instance(_, "get$addError", 0, 1, function() {
+      return [null];
+    }, ["call$2", "call$1"], ["addError$2", "addError$1"], 289, 0);
+    _instance_0_i(_, "get$close", "close$0", 285);
+    _instance_1_u(_, "get$_async$_add", "_async$_add$1", 63);
+    _instance_2_u(_, "get$_addError", "_addError$2", 56);
+    _instance_0_u(_, "get$_close", "_close$0", 1);
+    _instance_0_u(_ = P._ControllerSubscription.prototype, "get$_async$_onPause", "_async$_onPause$0", 1);
+    _instance_0_u(_, "get$_async$_onResume", "_async$_onResume$0", 1);
+    _instance(_ = P._BufferingStreamSubscription.prototype, "get$pause", 1, 0, null, ["call$1", "call$0"], ["pause$1", "pause$0"], 154, 0);
+    _instance_0_i(_, "get$resume", "resume$0", 1);
+    _instance_0_u(_, "get$_async$_onPause", "_async$_onPause$0", 1);
+    _instance_0_u(_, "get$_async$_onResume", "_async$_onResume$0", 1);
+    _instance(_ = P._DoneStreamSubscription.prototype, "get$pause", 1, 0, null, ["call$1", "call$0"], ["pause$1", "pause$0"], 154, 0);
+    _instance_0_i(_, "get$resume", "resume$0", 1);
+    _instance_0_u(_, "get$_sendDone", "_sendDone$0", 1);
+    _instance_1_u(_ = P._StreamIterator.prototype, "get$_onData", "_onData$1", 63);
+    _instance_2_u(_, "get$_onError", "_onError$2", 56);
+    _instance_0_u(_, "get$_onDone", "_onDone$0", 1);
+    _instance_0_u(_ = P._ForwardingStreamSubscription.prototype, "get$_async$_onPause", "_async$_onPause$0", 1);
+    _instance_0_u(_, "get$_async$_onResume", "_async$_onResume$0", 1);
+    _instance_1_u(_, "get$_handleData", "_handleData$1", 63);
+    _instance_2_u(_, "get$_handleError", "_handleError$2", 283);
+    _instance_0_u(_, "get$_handleDone", "_handleDone$0", 1);
+    _static_2(P, "collection___defaultEquals$closure", "_defaultEquals", 148);
+    _static_1(P, "collection___defaultHashCode$closure", "_defaultHashCode", 149);
+    _static_2(P, "collection_ListMixin__compareAny$closure", "ListMixin__compareAny", 167);
+    _instance_1_u(P._HashMap.prototype, "get$containsKey", "containsKey$1", 26);
+    _instance_1_u(P._LinkedCustomHashMap.prototype, "get$containsKey", "containsKey$1", 26);
+    _instance(_ = P._LinkedHashSet.prototype, "get$_newSimilarSet", 0, 0, null, ["call$1$0", "call$0"], ["_newSimilarSet$1$0", "_newSimilarSet$0"], 278, 0);
+    _instance_1_i(_, "get$contains", "contains$1", 26);
+    _instance(P._LinkedIdentityHashSet.prototype, "get$_newSimilarSet", 0, 0, null, ["call$1$0", "call$0"], ["_newSimilarSet$1$0", "_newSimilarSet$0"], 274, 0);
+    _instance_1_u(P.MapMixin.prototype, "get$containsKey", "containsKey$1", 26);
+    _instance_1_u(P.MapView.prototype, "get$containsKey", "containsKey$1", 26);
+    _instance(_ = P._UnmodifiableSet.prototype, "get$_newSimilarSet", 0, 0, null, ["call$1$0", "call$0"], ["_newSimilarSet$1$0", "_newSimilarSet$0"], 266, 0);
+    _instance_1_i(_, "get$contains", "contains$1", 26);
+    _static_1(P, "convert___defaultToEncodable$closure", "_defaultToEncodable", 43);
+    _static_1(P, "core__identityHashCode$closure", "identityHashCode", 149);
+    _static_2(P, "core__identical$closure", "identical", 148);
+    _static_1(P, "core_Uri_decodeComponent$closure", "Uri_decodeComponent", 198);
+    _instance_1_i(P.Iterable.prototype, "get$contains", "contains$1", 26);
+    _static(P, "math__max$closure", 2, null, ["call$1$2", "call$2"], ["max", function(a, b) {
+      return P.max(a, b, type$.num);
+    }], 472, 1);
+    _instance_1_u(_ = Y.StreamCompleter.prototype, "get$setSourceStream", "setSourceStream$1", 49);
+    _instance(_, "get$setError", 0, 1, function() {
+      return [null];
+    }, ["call$2", "call$1"], ["setError$2", "setError$1"], 296, 0);
+    _instance_0_u(_ = L.StreamGroup.prototype, "get$_onListen", "_onListen$0", 1);
+    _instance_0_u(_, "get$_onPause", "_onPause$0", 1);
+    _instance_0_u(_, "get$_onResume", "_onResume$0", 1);
+    _instance_0_u(_, "get$_onCancel", "_onCancel$0", 139);
+    _instance_1_i(O.EmptyUnmodifiableSet.prototype, "get$contains", "contains$1", 23);
+    _instance_1_i(M._DelegatingIterableBase.prototype, "get$contains", "contains$1", 23);
+    _instance_1_i(M.MapKeySet.prototype, "get$contains", "contains$1", 23);
+    _instance_1_u(B.ModifiableCssNode.prototype, "get$_node0$_isInvisible", "_node0$_isInvisible$1", 7);
+    _instance_1_u(D.SelectorList.prototype, "get$_complexContainsParentSelector", "_complexContainsParentSelector$1", 15);
+    _static_1(Y, "functions___isUnique$closure", "_isUnique", 18);
+    _static_1(K, "color___opacify$closure", "_opacify", 25);
+    _static_1(K, "color___transparentize$closure", "_transparentize", 25);
+    _instance_0_u(_ = G.Parser.prototype, "get$whitespace", "whitespace$0", 1);
+    _instance_0_u(_, "get$loudComment", "loudComment$0", 1);
+    _instance_0_u(_, "get$string", "string$0", 12);
+    _instance_0_u(U.SassParser.prototype, "get$loudComment", "loudComment$0", 1);
+    _instance(_ = V.StylesheetParser.prototype, "get$_statement", 0, 0, null, ["call$1$root", "call$0"], ["_statement$1$root", "_statement$0"], 262, 0);
+    _instance_0_u(_, "get$_declarationChild", "_declarationChild$0", 57);
+    _instance_0_u(_, "get$_declarationAtRule", "_declarationAtRule$0", 57);
+    _instance_0_u(_, "get$_functionChild", "_functionChild$0", 57);
+    _instance(_, "get$expression", 0, 0, null, ["call$3$bracketList$singleEquals$until", "call$0", "call$2$singleEquals$until", "call$1$bracketList", "call$1$singleEquals", "call$1$until"], ["expression$3$bracketList$singleEquals$until", "expression$0", "expression$2$singleEquals$until", "expression$1$bracketList", "expression$1$singleEquals", "expression$1$until"], 261, 0);
+    _instance_0_u(_, "get$_number", "_number$0", 259);
+    _instance_1_u(K.LimitedMapView.prototype, "get$containsKey", "containsKey$1", 23);
+    _instance_1_u(Z.MergedMapView.prototype, "get$containsKey", "containsKey$1", 23);
+    _instance_1_i(N.NoSourceMapBuffer0.prototype, "get$write", "write$1", 49);
+    _instance_1_u(F.PrefixedMapView.prototype, "get$containsKey", "containsKey$1", 23);
+    _instance_1_u(U.PublicMemberMapView.prototype, "get$containsKey", "containsKey$1", 23);
+    _instance_1_i(D.SourceMapBuffer0.prototype, "get$write", "write$1", 49);
+    _instance_1_u(R.UnprefixedMapView.prototype, "get$containsKey", "containsKey$1", 23);
+    _static_1(B, "utils__isPublic$closure", "isPublic", 6);
+    _instance_2_u(T.SassNumber.prototype, "get$moduloLikeSass", "moduloLikeSass$2", 50);
+    _instance_1_u(_ = N._SerializeVisitor0.prototype, "get$_visitMediaQuery", "_visitMediaQuery$1", 243);
+    _instance_1_u(_, "get$_isInvisible", "_isInvisible$1", 7);
+    _instance(Y.SourceFile.prototype, "get$span", 0, 1, null, ["call$2", "call$1"], ["span$2", "span$1"], 248, 0);
+    _instance(Y.SourceSpanMixin.prototype, "get$message", 1, 1, function() {
+      return {color: null};
+    }, ["call$2$color", "call$1"], ["message$2$color", "message$1"], 255, 0);
+    _static(L, "from_handlers__StreamTransformer__defaultHandleError$closure", 3, null, ["call$1$3", "call$3"], ["_StreamTransformer__defaultHandleError", function(error, stackTrace, sink) {
+      return L._StreamTransformer__defaultHandleError(error, stackTrace, sink, type$.dynamic);
+    }], 473, 0);
+    _static(R, "rate_limit___collectToList$closure", 2, null, ["call$1$2", "call$2"], ["_collectToList", function(element, soFar) {
+      return R._collectToList(element, soFar, type$.dynamic);
+    }], 474, 0);
+    _static_1(K, "color1___opacify$closure", "_opacify0", 29);
+    _static_1(K, "color1___transparentize$closure", "_transparentize0", 29);
+    _static_1(Y, "functions0___isUnique$closure", "_isUnique0", 19);
+    _instance_1_u(K.LimitedMapView0.prototype, "get$containsKey", "containsKey$1", 23);
+    _instance_1_u(D.SelectorList0.prototype, "get$_list2$_complexContainsParentSelector", "_list2$_complexContainsParentSelector$1", 14);
+    _instance_1_u(Z.MergedMapView0.prototype, "get$containsKey", "containsKey$1", 23);
+    _instance_1_i(N.NoSourceMapBuffer.prototype, "get$write", "write$1", 49);
+    _instance_1_u(B.ModifiableCssNode0.prototype, "get$_node2$_isInvisible", "_node2$_isInvisible$1", 8);
+    _static_2(B, "node___render$closure", "_render", 475);
+    _static_1(B, "node___renderSync$closure", "_renderSync", 476);
+    _instance_2_u(T.SassNumber0.prototype, "get$moduloLikeSass", "moduloLikeSass$2", 50);
+    _instance_0_u(_ = G.Parser1.prototype, "get$whitespace", "whitespace$0", 1);
+    _instance_0_u(_, "get$loudComment", "loudComment$0", 1);
+    _instance_0_u(_, "get$string", "string$0", 12);
+    _instance_1_u(F.PrefixedMapView0.prototype, "get$containsKey", "containsKey$1", 23);
+    _instance_1_u(U.PublicMemberMapView0.prototype, "get$containsKey", "containsKey$1", 23);
+    _static_1(U, "sass__main$closure", "main", 477);
+    _instance_0_u(U.SassParser0.prototype, "get$loudComment", "loudComment$0", 1);
+    _instance_1_u(_ = N._SerializeVisitor.prototype, "get$_serialize0$_visitMediaQuery", "_serialize0$_visitMediaQuery$1", 427);
+    _instance_1_u(_, "get$_serialize0$_isInvisible", "_serialize0$_isInvisible$1", 8);
+    _instance_1_i(D.SourceMapBuffer.prototype, "get$write", "write$1", 49);
+    _instance(_ = V.StylesheetParser0.prototype, "get$_stylesheet0$_statement", 0, 0, null, ["call$1$root", "call$0"], ["_stylesheet0$_statement$1$root", "_stylesheet0$_statement$0"], 432, 0);
+    _instance_0_u(_, "get$_stylesheet0$_declarationChild", "_stylesheet0$_declarationChild$0", 52);
+    _instance_0_u(_, "get$_stylesheet0$_declarationAtRule", "_stylesheet0$_declarationAtRule$0", 52);
+    _instance_0_u(_, "get$_stylesheet0$_functionChild", "_stylesheet0$_functionChild$0", 52);
+    _instance_0_u(_, "get$_stylesheet0$_number", "_stylesheet0$_number$0", 434);
+    _instance_1_u(R.UnprefixedMapView0.prototype, "get$containsKey", "containsKey$1", 23);
+    _static_1(B, "utils0__isPublic$closure", "isPublic0", 6);
+    _static_1(D, "path__dirname$closure", "dirname", 4);
+    _static_1(T, "character__isWhitespace$closure", "isWhitespace", 24);
+    _static_1(T, "character__isNewline$closure", "isNewline", 24);
+    _static_1(T, "character__isHex$closure", "isHex", 24);
+    _static_2(T, "number0__fuzzyLessThan$closure", "fuzzyLessThan", 38);
+    _static_2(T, "number0__fuzzyLessThanOrEquals$closure", "fuzzyLessThanOrEquals", 38);
+    _static_2(T, "number0__fuzzyGreaterThan$closure", "fuzzyGreaterThan", 38);
+    _static_2(T, "number0__fuzzyGreaterThanOrEquals$closure", "fuzzyGreaterThanOrEquals", 38);
+    _static_1(T, "number0__fuzzyRound$closure", "fuzzyRound", 39);
+    _static_1(T, "character0__isWhitespace$closure", "isWhitespace0", 24);
+    _static_1(T, "character0__isNewline$closure", "isNewline0", 24);
+    _static_1(T, "character0__isHex$closure", "isHex0", 24);
+    _static_2(T, "number2__fuzzyLessThan$closure", "fuzzyLessThan0", 38);
+    _static_2(T, "number2__fuzzyLessThanOrEquals$closure", "fuzzyLessThanOrEquals0", 38);
+    _static_2(T, "number2__fuzzyGreaterThan$closure", "fuzzyGreaterThan0", 38);
+    _static_2(T, "number2__fuzzyGreaterThanOrEquals$closure", "fuzzyGreaterThanOrEquals0", 38);
+    _static_1(T, "number2__fuzzyRound$closure", "fuzzyRound0", 39);
+    _static_1(F, "value1__wrapValue$closure", "wrapValue", 319);
+  })();
+  (function inheritance() {
+    var _mixin = hunkHelpers.mixin,
+      _inherit = hunkHelpers.inherit,
+      _inheritMany = hunkHelpers.inheritMany;
+    _inherit(P.Object, null);
+    _inheritMany(P.Object, [H.JS_CONST, J.Interceptor, J.ArrayIterator, P.Iterable, H.CastIterator, H.Closure, P.Error, P._ListBase_Object_ListMixin, H.ListIterator, P.Iterator, H.ExpandIterator, H.EmptyIterator, H.FollowedByIterator, H.WhereTypeIterator, H.FixedLengthListMixin, H.UnmodifiableListMixin, H.Symbol, P.MapView, H.ConstantMap, H.JSInvocationMirror, H.TypeErrorDecoder, H.NullThrownFromJavaScriptException, H.ExceptionAndStackTrace, H._StackTrace, H._Required, P.MapMixin, H.LinkedHashMapCell, H.LinkedHashMapKeyIterator, H.JSSyntaxRegExp, H._MatchImplementation, H._AllMatchesIterator, H.StringMatch, H._StringAllMatchesIterator, H.Rti, H._FunctionParameters, H._Type, P._TimerImpl, P._AsyncAwaitCompleter, P._AsyncStarStreamController, P._IterationMarker, P._SyncStarIterator, P.Stream, P._BufferingStreamSubscription, P._BroadcastStreamController, P._Completer, P._FutureListener, P._Future, P._AsyncCallbackEntry, P.StreamTransformerBase, P._StreamController, P._SyncStreamControllerDispatch, P._AsyncStreamControllerDispatch, P._AddStreamState, P._DelayedEvent, P._DelayedDone, P._PendingEvents, P._DoneStreamSubscription, P._StreamIterator, P.AsyncError, P._ZoneFunction, P._RunNullaryZoneFunction, P._RunUnaryZoneFunction, P._RunBinaryZoneFunction, P._RegisterNullaryZoneFunction, P._RegisterUnaryZoneFunction, P._RegisterBinaryZoneFunction, P._ZoneSpecification, P._ZoneDelegate, P._Zone, P._HashMapKeyIterator, P._SetBase, P._LinkedHashSetCell, P._LinkedHashSetIterator, P.ListMixin, P._MapBaseValueIterator, P._UnmodifiableMapMixin, P._ListQueueIterator, P.Codec, P._Base64Encoder, P.ChunkedConversionSink, P._JsonStringifier, P.StringConversionSinkMixin, P._Utf8Encoder, P._Utf8Decoder, P.DateTime, P.Duration, P.OutOfMemoryError, P.StackOverflowError, P._Exception, P.FormatException, P.MapEntry, P.Null, P._StringStackTrace, P.RuneIterator, P.StringBuffer, P._Uri, P.UriData, P._SimpleUri, P._JSRandom, N.ArgParser, V.ArgResults, G.Option, G.OptionType, G.Parser0, G.Usage, V.ErrorResult, F.ValueResult, Y.StreamCompleter, L.StreamGroup, L._StreamGroupState, G.StreamQueue, G._NextRequest, Q.Repl, B.ReplAdapter, U.DefaultEquality, U.IterableEquality, U.ListEquality, U._MapEntry, U.MapEquality, Q._QueueList_Object_ListMixin, M._DelegatingIterableBase, L.UnmodifiableSetMixin, M.Context, M._PathDirection, M._PathRelation, O.Style, X.ParsedPath, X.PathException, F.CssMediaQuery, F._SingletonCssMediaQueryMergeResult, F.MediaQuerySuccessfulMergeResult, B.AstNode, F.ModifiableCssValue, F.CssValue, B._FakeAstNode, Z.Argument, B.ArgumentDeclaration, X.ArgumentInvocation, V.AtRootQuery, Z.ConfiguredVariable, V.BinaryOperationExpression, V.BinaryOperator, Z.BooleanExpression, K.ColorExpression, F.FunctionExpression, L.IfExpression, D.ListExpression, A.MapExpression, O.NullExpression, T.NumberExpression, T.ParenthesizedExpression, T.SelectorExpression, D.StringExpression, X.UnaryOperationExpression, X.UnaryOperator, F.ValueExpression, S.VariableExpression, B.DynamicImport, Q.StaticImport, X.Interpolation, M.ParentStatement, Q.ContentRule, Q.DebugRule, D.ErrorRule, X.ExtendRule, L.ForwardRule, V.IfRule, V.IfClause, B.ImportRule, A.IncludeRule, L.LoudComment, B.ReturnRule, B.SilentComment, T.UseRule, Z.VariableDeclaration, Y.WarnRule, Y.SupportsAnything, L.SupportsDeclaration, F.SupportsFunction, X.SupportsInterpolation, M.SupportsNegation, U.SupportsOperation, T.Selector, N.AttributeOperator, S.Combinator, D.QualifiedName, X.CompileResult, Q.AsyncEnvironment, Q._EnvironmentModule0, O.AsyncImportCache, S.AsyncBuiltInCallable, Q.BuiltInCallable, L.PlainCssCallable, E.UserDefinedCallable, A.Configuration, Z.ConfiguredValue, O.Environment, O._EnvironmentModule, G.SourceSpanException, E.SassScriptException, B.ExecutableOptions, B.UsageException, A._Watcher, T.EmptyExtender, F.Extender, S.Extension, L.ExtendMode, R.ImportCache, B.AsyncImporter, E.ImporterResult, Z.InterpolationBuffer, B.FileSystemException, B.Stderr, F._QuietLogger, S.StderrLogger, T.TrackingLogger, Q.BuiltInModule, R.ForwardedModuleView, B.ShadowedModuleView, G.Parser, M.StylesheetGraph, M.StylesheetNode, M.Syntax, G.FixedLengthListBuilder, U.MultiDirWatcher, N.NoSourceMapBuffer0, D.SourceMapBuffer0, F.Value, D.ListSeparator, E._EvaluateVisitor0, E._ImportedCssVisitor0, E.EvaluateResult, E._ArgumentResults0, V._CloneCssVisitor, R.Evaluator, R._EvaluateVisitor, R._ImportedCssVisitor, R._ArgumentResults, D.RecursiveStatementVisitor, N._SerializeVisitor0, N.OutputStyle, N.LineFeed, N.SerializeResult, L.Entry, T.Mapping, T.TargetLineEntry, T.TargetEntry, Y.SourceFile, D.SourceLocationMixin, Y.SourceSpanMixin, U.Highlighter, U._Highlight, U._Line, V.SourceLocation, U.Chain, A.Frame, T.LazyTrace, Y.Trace, N.UnparsedFrame, X.StringScanner, S._SpanScannerState, A.AsciiGlyphSet, K.UnicodeGlyphSet, S.Tuple2, S.Tuple3, E.WatchEvent, E.ChangeType, Y.SupportsAnything0, Z.Argument0, B.ArgumentDeclaration0, X.ArgumentInvocation0, F.Value0, B.AsyncImporter0, S.AsyncBuiltInCallable0, X.CompileResult0, Q.AsyncEnvironment0, Q._EnvironmentModule2, E._EvaluateVisitor2, E._ImportedCssVisitor2, E.EvaluateResult0, E._ArgumentResults2, O.AsyncImportCache0, G.Parser1, V.AtRootQuery0, M.ParentStatement0, B.AstNode0, T.Selector0, N.AttributeOperator0, V.BinaryOperationExpression0, V.BinaryOperator0, Z.BooleanExpression0, Q.BuiltInCallable0, Q.BuiltInModule0, V._CloneCssVisitor0, K.ColorExpression0, S.Combinator0, A.Configuration0, Z.ConfiguredValue0, Z.ConfiguredVariable0, Q.ContentRule0, Q.DebugRule0, L.SupportsDeclaration0, B.DynamicImport0, T.EmptyExtender0, O.Environment0, O._EnvironmentModule1, D.ErrorRule0, R._EvaluateVisitor1, R._ImportedCssVisitor1, R._ArgumentResults1, E.SassScriptException0, X.ExtendRule0, F.Extender0, S.Extension0, G.FixedLengthListBuilder0, L.ForwardRule0, R.ForwardedModuleView0, F.FunctionExpression0, F.SupportsFunction0, L.IfExpression0, V.IfRule0, V.IfClause0, F.NodeImporter, R.ImportCache0, B.ImportRule0, A.IncludeRule0, X.Interpolation0, X.SupportsInterpolation0, Z.InterpolationBuffer0, D.ListExpression0, D.ListSeparator0, L.LoudComment0, A.MapExpression0, F.CssMediaQuery0, F._SingletonCssMediaQueryMergeResult0, F.MediaQuerySuccessfulMergeResult0, L.ExtendMode0, M.SupportsNegation0, N.NoSourceMapBuffer, B._FakeAstNode0, B.FileSystemException0, B.Stderr0, O.NullExpression0, T.NumberExpression0, U.SupportsOperation0, T.ParenthesizedExpression0, L.PlainCssCallable0, D.QualifiedName0, E.ImporterResult0, B.ReturnRule0, T.SelectorExpression0, N._SerializeVisitor, N.OutputStyle0, N.LineFeed0, N.SerializeResult0, B.ShadowedModuleView0, B.SilentComment0, D.SourceMapBuffer, Q.StaticImport0, S.StderrLogger0, D.StringExpression0, M.Syntax0, X.UnaryOperationExpression0, X.UnaryOperator0, T.UseRule0, E.UserDefinedCallable0, F.CssValue0, F.ValueExpression0, F.ModifiableCssValue0, S.VariableExpression0, Z.VariableDeclaration0, Y.WarnRule0]);
+    _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JSArray, J.JSNumber, J.JSString, H.NativeTypedData]);
+    _inheritMany(J.JavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction, B.Stdin, B.Stdout, B.ReadlineModule, B.ReadlineOptions, B.ReadlineInterface, V.BufferModule, V.BufferConstants, V.Buffer, F.ConsoleModule, F.Console, F.EventEmitter, D.FS, D.FSConstants, D.FSWatcher, D.ReadStream, D.ReadStreamOptions, D.WriteStream, D.WriteStreamOptions, D.Stats, E.Promise, E.Date, E.JsError, E.Atomics, Y.Modules, Y.Module1, Y.Net, Y.Socket, Y.NetAddress, Y.NetServer, X.NodeJsError, X.Process, X.CPUUsage, X.Release, D.StreamModule, D.Readable, D.Writable, D.Duplex, D.Transform, D.WritableOptions, D.ReadableOptions, L.Immediate, L.Timeout, N.TTY, M.Util, Y.Chokidar, Y.ChokidarOptions, Y.ChokidarWatcher, F.JSFunction, F.NodeImporterResult, B._PropertyDescriptor, Y.Chokidar0, Y.ChokidarOptions0, Y.ChokidarWatcher0, K._NodeSassColor, D.Exports, E.FiberClass, E.Fiber, F.JSFunction0, F.NodeImporterResult0, D._NodeSassList, A._NodeSassMap, T._NodeSassNumber, Z.RenderContext, L.RenderContextOptions, R.RenderOptions, U.RenderResult, U.RenderResultStats, R._Exports, D._NodeSassString, G.Types, B._PropertyDescriptor0]);
+    _inherit(J.JSUnmodifiableArray, J.JSArray);
+    _inheritMany(J.JSNumber, [J.JSInt, J.JSDouble]);
+    _inheritMany(P.Iterable, [H._CastIterableBase, H.EfficientLengthIterable, H.MappedIterable, H.WhereIterable, H.ExpandIterable, H.TakeIterable, H.SkipIterable, H.SkipWhileIterable, H.FollowedByIterable, H.WhereTypeIterable, H._ConstantMapKeyIterable, P.IterableBase, H._StringAllMatchesIterable, P.Runes]);
+    _inheritMany(H._CastIterableBase, [H.CastIterable, H.__CastListBase__CastIterableBase_ListMixin, H.CastSet, H.CastQueue]);
+    _inherit(H._EfficientLengthCastIterable, H.CastIterable);
+    _inherit(H._CastListBase, H.__CastListBase__CastIterableBase_ListMixin);
+    _inheritMany(H.Closure, [H._CastListBase_sort_closure, H.ConstantStringMap_values_closure, H.Instantiation, H.Primitives_functionNoSuchMethod_closure, H.TearOffClosure, H.JsLinkedHashMap_values_closure, H.JsLinkedHashMap_addAll_closure, H.initHooks_closure, H.initHooks_closure0, H.initHooks_closure1, P._AsyncRun__initializeScheduleImmediate_internalCallback, P._AsyncRun__initializeScheduleImmediate_closure, P._AsyncRun__scheduleImmediateJsOverride_internalCallback, P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, P._TimerImpl_internalCallback, P._TimerImpl$periodic_closure, P._awaitOnObject_closure, P._awaitOnObject_closure0, P._wrapJsFunctionForAsync_closure, P._asyncStarHelper_closure, P._asyncStarHelper_closure0, P._AsyncStarStreamController__resumeBody, P._AsyncStarStreamController__resumeBody_closure, P._AsyncStarStreamController_closure0, P._AsyncStarStreamController_closure1, P._AsyncStarStreamController_closure, P._AsyncStarStreamController__closure, P._SyncBroadcastStreamController__sendData_closure, P._SyncBroadcastStreamController__sendError_closure, P._SyncBroadcastStreamController__sendDone_closure, P.Future_wait__error_set, P.Future_wait__stackTrace_set, P.Future_wait__error_get, P.Future_wait__stackTrace_get, P.Future_wait_handleError, P.Future_wait_closure, P._Future__addListener_closure, P._Future__prependListeners_closure, P._Future__chainForeignFuture_closure, P._Future__chainForeignFuture_closure0, P._Future__chainForeignFuture_closure1, P._Future__asyncCompleteWithValue_closure, P._Future__chainFuture_closure, P._Future__asyncCompleteError_closure, P._Future__propagateToListeners_handleWhenCompleteCallback, P._Future__propagateToListeners_handleWhenCompleteCallback_closure, P._Future__propagateToListeners_handleValueCallback, P._Future__propagateToListeners_handleError, P.Stream_Stream$fromFuture_closure, P.Stream_Stream$fromFuture_closure0, P.Stream_length_closure, P.Stream_length_closure0, P._StreamController__subscribe_closure, P._StreamController__recordCancel_complete, P._AddStreamState_cancel_closure, P._BufferingStreamSubscription__sendError_sendError, P._BufferingStreamSubscription__sendDone_sendDone, P._PendingEvents_schedule_closure, P._CustomZone_bindCallback_closure, P._CustomZone_bindUnaryCallback_closure, P._CustomZone_bindCallbackGuarded_closure, P._rootHandleUncaughtError_closure, P._RootZone_bindCallback_closure, P._RootZone_bindCallbackGuarded_closure, P._HashMap_values_closure, P._HashMap_addAll_closure, P._LinkedCustomHashMap_closure, P.HashMap_HashMap$from_closure, P.LinkedHashMap_LinkedHashMap$from_closure, P.MapBase_mapToString_closure, P.MapMixin_entries_closure, P.Utf8Decoder_closure, P.Utf8Decoder_closure0, P._JsonStringifier_writeMap_closure, P.NoSuchMethodError_toString_closure, P.Duration_toString_sixDigits, P.Duration_toString_twoDigits, P.Uri__parseIPv4Address_error, P.Uri_parseIPv6Address_error, P.Uri_parseIPv6Address_parseHex, P._Uri__makePath_closure, P._createTables_closure, P._createTables_build, P._createTables_setChars, P._createTables_setRange, N.ArgParser_findByAbbreviation_closure, N.ArgParser_findByAbbreviation_closure0, G.Parser_parse_closure, G.Parser_setOption_closure, G.Usage_generate_closure, G.Usage_buildAllowedList_closure, L.StreamGroup_add_closure, L.StreamGroup_add_closure0, L.StreamGroup__onListen_closure, L.StreamGroup__onCancel_closure, L.StreamGroup__onCancel_closure0, L.StreamGroup__listenToStream_closure, G.StreamQueue__ensureListening_closure, G.StreamQueue__ensureListening_closure1, G.StreamQueue__ensureListening_closure0, Q.closure113, B.ReplAdapter_runAsync_closure, B.defaultCompare_closure, M.futureToPromise_closure, M.Context_join_closure, M.Context_joinAll_closure, M.Context_split_closure, M._validateArgList_closure, X.ParsedPath_normalize_closure, X.ParsedPath__splitExtension_closure, X.ParsedPath__splitExtension_closure0, K.PathMap__create_closure, K.PathMap__create_closure0, K.PathMap__create_closure1, L.WindowsStyle_absolutePathToUri_closure, B.ArgumentDeclaration_verify_closure, B.ArgumentDeclaration_verify_closure0, D.ListExpression_toString_closure, A.MapExpression_toString_closure, X.Interpolation_toString_closure, V.EachRule_toString_closure, V.IfRule_toString_closure, V.IfClause$__closure, V.IfClause$___closure, M.ParentStatement_closure, M.ParentStatement__closure, S.ComplexSelector_isInvisible_closure, X.CompoundSelector_isInvisible_closure, N.IDSelector_unify_closure, D.SelectorList_isInvisible_closure, D.SelectorList_asSassList_closure, D.SelectorList_asSassList__closure, D.SelectorList_unify_closure, D.SelectorList_unify__closure, D.SelectorList_unify___closure, D.SelectorList_resolveParentSelectors_closure, D.SelectorList_resolveParentSelectors__closure, D.SelectorList_resolveParentSelectors__closure0, D.SelectorList__complexContainsParentSelector_closure, D.SelectorList__complexContainsParentSelector__closure, D.SelectorList__resolveParentSelectorsCompound_closure, D.SelectorList__resolveParentSelectorsCompound_closure0, D.SelectorList__resolveParentSelectorsCompound_closure1, X._compileStylesheet_closure0, Q.AsyncEnvironment_importForwards_closure, Q.AsyncEnvironment_importForwards_closure0, Q.AsyncEnvironment_importForwards_closure1, Q.AsyncEnvironment_importForwards_closure2, Q.AsyncEnvironment__getVariableFromGlobalModule_closure, Q.AsyncEnvironment_setVariable_closure, Q.AsyncEnvironment_setVariable_closure0, Q.AsyncEnvironment_setVariable_closure1, Q.AsyncEnvironment__getFunctionFromGlobalModule_closure, Q.AsyncEnvironment__getMixinFromGlobalModule_closure, Q._EnvironmentModule__EnvironmentModule_closure5, Q._EnvironmentModule__EnvironmentModule_closure6, Q._EnvironmentModule__EnvironmentModule_closure7, Q._EnvironmentModule__EnvironmentModule_closure8, Q._EnvironmentModule__EnvironmentModule_closure9, Q._EnvironmentModule__EnvironmentModule_closure10, O.AsyncImportCache_canonicalize_closure, O.AsyncImportCache__canonicalize_closure, O.AsyncImportCache_importCanonical_closure, O.AsyncImportCache_humanize_closure, O.AsyncImportCache_humanize_closure0, O.AsyncImportCache_humanize_closure1, S.AsyncBuiltInCallable$mixin_closure, Q.BuiltInCallable$mixin_closure, U._compileStylesheet_closure, O.Environment_importForwards_closure, O.Environment_importForwards_closure0, O.Environment_importForwards_closure1, O.Environment_importForwards_closure2, O.Environment__getVariableFromGlobalModule_closure, O.Environment_setVariable_closure, O.Environment_setVariable_closure0, O.Environment_setVariable_closure1, O.Environment__getFunctionFromGlobalModule_closure, O.Environment__getMixinFromGlobalModule_closure, O._EnvironmentModule__EnvironmentModule_closure, O._EnvironmentModule__EnvironmentModule_closure0, O._EnvironmentModule__EnvironmentModule_closure1, O._EnvironmentModule__EnvironmentModule_closure2, O._EnvironmentModule__EnvironmentModule_closure3, O._EnvironmentModule__EnvironmentModule_closure4, D._writeSourceMap_closure, B.ExecutableOptions_closure, B.ExecutableOptions_emitErrorCss_closure, A.watch_closure, A._Watcher__debounceEvents_closure, A._Watcher__debounceEvents__closure, F.Extender_extensionsWhereTarget_closure, F.Extender__registerSelector_closure, F.Extender_addExtension_closure, F.Extender_addExtension_closure0, F.Extender_addExtension_closure1, F.Extender__extendExistingExtensions_closure, F.Extender__extendExistingExtensions_closure0, F.Extender_addExtensions_closure, F.Extender_addExtensions__closure, F.Extender_addExtensions___closure, F.Extender_addExtensions___closure0, F.Extender__extendList_closure, F.Extender__extendComplex_closure, F.Extender__extendComplex_closure0, F.Extender__extendComplex__closure, F.Extender__extendComplex__closure0, F.Extender__extendComplex___closure, F.Extender__extendCompound_closure, F.Extender__extendCompound_closure0, F.Extender__extendCompound__closure, F.Extender__extendCompound__closure0, F.Extender__extendCompound_closure1, F.Extender__extendCompound_closure2, F.Extender__extendCompound_closure3, F.Extender__extendCompound_closure4, F.Extender__extendSimple_withoutPseudo, F.Extender__extendSimple_closure, F.Extender__extendPseudo_closure, F.Extender__extendPseudo_closure0, F.Extender__extendPseudo_closure1, F.Extender__extendPseudo_closure2, F.Extender__extendPseudo_closure3, F.Extender__trim_closure, F.Extender__trim_closure0, F.Extender_clone_closure, Y.unifyComplex_closure, Y._weaveParents_closure, Y._weaveParents_closure0, Y._weaveParents_closure1, Y._weaveParents__closure1, Y._weaveParents_closure2, Y._weaveParents_closure3, Y._weaveParents__closure0, Y._weaveParents_closure4, Y._weaveParents_closure5, Y._weaveParents__closure, Y._mustUnify_closure, Y._mustUnify__closure, Y.paths_closure, Y.paths__closure, Y.paths___closure, Y._hasRoot_closure, Y.listIsSuperselector_closure, Y.listIsSuperselector__closure, Y._simpleIsSuperselectorOfCompound_closure, Y._simpleIsSuperselectorOfCompound__closure, Y._selectorPseudoIsSuperselector_closure, Y._selectorPseudoIsSuperselector_closure0, Y._selectorPseudoIsSuperselector_closure1, Y._selectorPseudoIsSuperselector_closure2, Y._selectorPseudoIsSuperselector_closure3, Y._selectorPseudoIsSuperselector__closure, Y._selectorPseudoIsSuperselector___closure, Y._selectorPseudoIsSuperselector___closure0, Y._selectorPseudoIsSuperselector_closure4, Y._selectorPseudoIsSuperselector_closure5, Y._selectorPseudosNamed_closure, Y.closure, K.closure44, K.closure45, K.closure46, K.closure47, K.closure48, K.closure49, K.closure50, K.closure51, K.closure52, K.closure53, K.closure54, K.closure55, K.closure56, K.closure57, K.closure58, K.closure59, K.closure60, K.closure61, K.closure62, K.closure63, K.closure64, K.closure65, K.closure66, K.closure67, K.closure68, K.closure69, K._closure8, K.closure70, K.closure99, K.closure100, K.closure101, K.closure102, K.closure103, K.closure104, K.closure105, K.closure106, K._closure13, K.closure107, K.closure82, K.closure81, K.closure80, K.closure79, K.closure78, K.closure77, K.closure76, K.closure75, K.closure73, K.closure72, K.closure71, K.closure74, K.closure_hexString, K._updateComponents_getParam, K._updateComponents_closure, K._updateComponents_updateValue, K._updateComponents_updateRgb, K._functionString_closure, K._removedColorFunction_closure, K._removeUnits_closure, K._removeUnits_closure0, K._parseChannels_closure, D.closure43, D.closure42, D.closure41, D.closure40, D.closure39, D.closure38, D._closure5, D._closure6, D._closure7, D.closure37, D.closure35, D.closure36, A.closure34, A.closure97, A._closure12, A.closure98, A._closure11, A.closure32, A.closure33, A._closure4, A.closure96, A.closure95, A._closure10, A.closure30, A.closure31, A.closure29, A.closure28, A.closure27, A._modify__modifyNestedMap, A._deepMergeImpl__ensureMutable, A._deepMergeImpl_closure, K.closure25, K.closure90, K.closure24, K.closure23, K.closure22, K.closure26, K.closure88, K._closure9, K.closure87, K.closure86, K.closure84, K.closure94, K.closure93, K.closure92, K.closure91, K.closure89, K.closure85, K.closure83, K.closure18, K.closure17, K.closure19, K.closure21, K.closure20, K._numberFunction_closure, Q.closure108, Q.closure109, Q.closure110, Q.closure111, T.closure13, T._closure1, T._closure2, T.closure12, T._closure, T._closure0, T.__closure, T.closure11, T.closure10, T.closure9, T.closure16, T.closure15, T._closure3, T.closure14, D.closure8, D.closure7, D.closure3, D.closure2, D.closure1, D.closure0, D.closure6, D.closure5, D.closure4, R.ImportCache_canonicalize_closure, R.ImportCache__canonicalize_closure, R.ImportCache_importCanonical_closure, R.ImportCache_humanize_closure, R.ImportCache_humanize_closure0, R.ImportCache_humanize_closure1, B.resolveImportPath_closure, B.resolveImportPath_closure0, B._tryPathAsDirectory_closure, B._exactlyOne_closure, F._realCasePath_helper, F._realCasePath_helper_closure, F._realCasePath_helper__closure, B._readFile_closure, B.writeFile_closure, B.deleteFile_closure, B.readStdin_closure, B.readStdin_closure0, B.readStdin_closure1, B.readStdin_closure2, B.fileExists_closure, B.dirExists_closure, B.ensureDir_closure, B.listDir_closure, B.listDir__closure, B.listDir__closure0, B.listDir_closure_list, B.listDir__list_closure, B.modificationTime_closure, B.watchDir_closure, B.watchDir_closure0, B.watchDir_closure1, B.watchDir_closure2, B.watchDir_closure3, B.watchDir__closure, V.AtRootQueryParser_parse_closure, Q.closure112, E.KeyframeSelectorParser_parse_closure, F.MediaQueryParser_parse_closure, G.Parser__parseIdentifier_closure, G.Parser_scanIdentChar_matches, U.SassParser_children_closure, T.SelectorParser_parse_closure, T.SelectorParser_parseCompoundSelector_closure, V.StylesheetParser_parse_closure, V.StylesheetParser_parse__closure, V.StylesheetParser_parse__closure0, V.StylesheetParser_parseArgumentDeclaration_closure, V.StylesheetParser_parseVariableDeclaration_closure, V.StylesheetParser_parseUseRule_closure, V.StylesheetParser__parseSingleProduction_closure, V.StylesheetParser__statement_closure, V.StylesheetParser_variableDeclarationWithoutNamespace_closure, V.StylesheetParser_variableDeclarationWithoutNamespace_closure0, V.StylesheetParser__declarationOrBuffer_closure, V.StylesheetParser__declarationOrBuffer_closure0, V.StylesheetParser__styleRule_closure, V.StylesheetParser__propertyOrVariableDeclaration_closure, V.StylesheetParser__propertyOrVariableDeclaration_closure0, V.StylesheetParser__atRootRule_closure, V.StylesheetParser__atRootRule_closure0, V.StylesheetParser__eachRule_closure, V.StylesheetParser__functionRule_closure, V.StylesheetParser__forRule_closure, V.StylesheetParser__forRule_closure0, V.StylesheetParser__memberList_closure, V.StylesheetParser__includeRule_closure, V.StylesheetParser_mediaRule_closure, V.StylesheetParser__mixinRule_closure, V.StylesheetParser_mozDocumentRule_closure, V.StylesheetParser_supportsRule_closure, V.StylesheetParser__whileRule_closure, V.StylesheetParser_unknownAtRule_closure, V.StylesheetParser_expression_resetState, V.StylesheetParser_expression_resolveOneOperation, V.StylesheetParser_expression_resolveOperations, V.StylesheetParser_expression_addSingleExpression, V.StylesheetParser_expression_addOperator, V.StylesheetParser_expression_resolveSpaceExpressions, V.StylesheetParser__expressionUntilComma_closure, V.StylesheetParser__unicodeRange_closure, V.StylesheetParser__unicodeRange_closure0, V.StylesheetParser_identifierLike_closure, V.StylesheetParser__expressionUntilComparison_closure, V.StylesheetParser__publicIdentifier_closure, M.StylesheetGraph_modifiedSince_transitiveModificationTime, M.StylesheetGraph_modifiedSince_transitiveModificationTime_closure, M.StylesheetGraph__add_closure, M.StylesheetGraph_addCanonical_closure, M.StylesheetGraph_reload_closure, M.StylesheetGraph__recanonicalizeImportsForNode_closure, M.StylesheetGraph__nodeFor_closure, M.StylesheetGraph__nodeFor_closure0, F._PrefixedKeys_iterator_closure, D.SourceMapBuffer__addEntry_closure, D.SourceMapBuffer_buildSourceMap_closure, R._UnprefixedKeys_iterator_closure, R._UnprefixedKeys_iterator_closure0, B.indent_closure, B.flattenVertically_closure, B.flattenVertically_closure0, B.longestCommonSubsequence_closure, B.longestCommonSubsequence_closure0, B.longestCommonSubsequence_closure1, B.longestCommonSubsequence_backtrack, B.mapAddAll2_closure, K.SassColor_SassColor$hwb_toRgb, D.SassList_isBlank_closure, A.SassMap_asList_closure, T.SassNumber__coerceOrConvertValue__compatibilityException, T.SassNumber__coerceOrConvertValue_closure, T.SassNumber__coerceOrConvertValue_closure0, T.SassNumber__coerceOrConvertValue_closure1, T.SassNumber__coerceOrConvertValue_closure2, T.SassNumber_plus_closure, T.SassNumber_minus_closure, T.SassNumber_multiplyUnits_closure, T.SassNumber_multiplyUnits_closure0, T.SassNumber_multiplyUnits_closure1, T.SassNumber_multiplyUnits_closure2, T.SassNumber__areAnyConvertible_closure, T.SassNumber__canonicalizeUnitList_closure, T.SassNumber__canonicalMultiplier_closure, L.SingleUnitSassNumber_multiplyUnits_closure, L.SingleUnitSassNumber_multiplyUnits_closure0, E._EvaluateVisitor_closure9, E._EvaluateVisitor_closure10, E._EvaluateVisitor_closure11, E._EvaluateVisitor_closure12, E._EvaluateVisitor_closure13, E._EvaluateVisitor_closure14, E._EvaluateVisitor_closure15, E._EvaluateVisitor_closure16, E._EvaluateVisitor__closure4, E._EvaluateVisitor_closure17, E._EvaluateVisitor_closure18, E._EvaluateVisitor__closure2, E._EvaluateVisitor__closure3, E._EvaluateVisitor_run_closure0, E._EvaluateVisitor__withWarnCallback_closure0, E._EvaluateVisitor__loadModule_closure1, E._EvaluateVisitor__loadModule_closure2, E._EvaluateVisitor__execute_closure0, E._EvaluateVisitor__combineCss_closure2, E._EvaluateVisitor__combineCss_closure3, E._EvaluateVisitor__combineCss_closure4, E._EvaluateVisitor__extendModules_closure1, E._EvaluateVisitor__extendModules_closure2, E._EvaluateVisitor__topologicalModules_visitModule0, E._EvaluateVisitor_visitAtRootRule_closure2, E._EvaluateVisitor_visitAtRootRule_closure3, E._EvaluateVisitor_visitAtRootRule_closure4, E._EvaluateVisitor__scopeForAtRoot_closure5, E._EvaluateVisitor__scopeForAtRoot_closure6, E._EvaluateVisitor__scopeForAtRoot_closure7, E._EvaluateVisitor__scopeForAtRoot__closure0, E._EvaluateVisitor__scopeForAtRoot_closure8, E._EvaluateVisitor__scopeForAtRoot_closure9, E._EvaluateVisitor__scopeForAtRoot_closure10, E._EvaluateVisitor_visitContentRule_closure0, E._EvaluateVisitor_visitDeclaration_closure0, E._EvaluateVisitor_visitEachRule_closure2, E._EvaluateVisitor_visitEachRule_closure3, E._EvaluateVisitor_visitEachRule_closure4, E._EvaluateVisitor_visitEachRule__closure0, E._EvaluateVisitor_visitEachRule___closure0, E._EvaluateVisitor_visitExtendRule_closure0, E._EvaluateVisitor_visitAtRule_closure1, E._EvaluateVisitor_visitAtRule__closure0, E._EvaluateVisitor_visitAtRule_closure2, E._EvaluateVisitor_visitForRule_closure4, E._EvaluateVisitor_visitForRule_closure5, E._EvaluateVisitor_visitForRule_closure6, E._EvaluateVisitor_visitForRule_closure7, E._EvaluateVisitor_visitForRule_closure8, E._EvaluateVisitor_visitForRule__closure0, E._EvaluateVisitor_visitForwardRule_closure1, E._EvaluateVisitor_visitForwardRule_closure2, E._EvaluateVisitor__assertConfigurationIsEmpty_closure0, E._EvaluateVisitor_visitIfRule_closure0, E._EvaluateVisitor_visitIfRule__closure0, E._EvaluateVisitor__visitDynamicImport_closure0, E._EvaluateVisitor__visitDynamicImport__closure0, E._EvaluateVisitor_visitIncludeRule_closure2, E._EvaluateVisitor_visitIncludeRule_closure3, E._EvaluateVisitor_visitIncludeRule_closure4, E._EvaluateVisitor_visitIncludeRule__closure0, E._EvaluateVisitor_visitIncludeRule___closure0, E._EvaluateVisitor_visitIncludeRule____closure0, E._EvaluateVisitor_visitMediaRule_closure1, E._EvaluateVisitor_visitMediaRule__closure0, E._EvaluateVisitor_visitMediaRule___closure0, E._EvaluateVisitor_visitMediaRule_closure2, E._EvaluateVisitor__visitMediaQueries_closure0, E._EvaluateVisitor_visitStyleRule_closure6, E._EvaluateVisitor_visitStyleRule_closure7, E._EvaluateVisitor_visitStyleRule_closure8, E._EvaluateVisitor_visitStyleRule_closure9, E._EvaluateVisitor_visitStyleRule_closure10, E._EvaluateVisitor_visitStyleRule_closure11, E._EvaluateVisitor_visitStyleRule__closure0, E._EvaluateVisitor_visitStyleRule_closure12, E._EvaluateVisitor_visitSupportsRule_closure1, E._EvaluateVisitor_visitSupportsRule__closure0, E._EvaluateVisitor_visitSupportsRule_closure2, E._EvaluateVisitor_visitVariableDeclaration_closure2, E._EvaluateVisitor_visitVariableDeclaration_closure3, E._EvaluateVisitor_visitVariableDeclaration_closure4, E._EvaluateVisitor_visitUseRule_closure0, E._EvaluateVisitor_visitWarnRule_closure0, E._EvaluateVisitor_visitWhileRule_closure0, E._EvaluateVisitor_visitWhileRule__closure0, E._EvaluateVisitor_visitBinaryOperationExpression_closure0, E._EvaluateVisitor_visitVariableExpression_closure0, E._EvaluateVisitor_visitListExpression_closure0, E._EvaluateVisitor_visitFunctionExpression_closure1, E._EvaluateVisitor_visitFunctionExpression_closure2, E._EvaluateVisitor__runUserDefinedCallable_closure0, E._EvaluateVisitor__runUserDefinedCallable__closure0, E._EvaluateVisitor__runUserDefinedCallable___closure0, E._EvaluateVisitor__runUserDefinedCallable____closure0, E._EvaluateVisitor__runFunctionCallable_closure0, E._EvaluateVisitor__runBuiltInCallable_closure1, E._EvaluateVisitor__runBuiltInCallable_closure2, E._EvaluateVisitor__evaluateArguments_closure0, E._EvaluateVisitor__evaluateMacroArguments_closure3, E._EvaluateVisitor__evaluateMacroArguments_closure4, E._EvaluateVisitor__evaluateMacroArguments_closure5, E._EvaluateVisitor__evaluateMacroArguments_closure6, E._EvaluateVisitor__addRestMap_closure1, E._EvaluateVisitor__addRestMap_closure2, E._EvaluateVisitor__verifyArguments_closure0, E._EvaluateVisitor_visitStringExpression_closure0, E._EvaluateVisitor_visitCssAtRule_closure1, E._EvaluateVisitor_visitCssAtRule_closure2, E._EvaluateVisitor_visitCssKeyframeBlock_closure1, E._EvaluateVisitor_visitCssKeyframeBlock_closure2, E._EvaluateVisitor_visitCssMediaRule_closure1, E._EvaluateVisitor_visitCssMediaRule__closure0, E._EvaluateVisitor_visitCssMediaRule___closure0, E._EvaluateVisitor_visitCssMediaRule_closure2, E._EvaluateVisitor_visitCssStyleRule_closure1, E._EvaluateVisitor_visitCssStyleRule__closure0, E._EvaluateVisitor_visitCssStyleRule_closure2, E._EvaluateVisitor_visitCssSupportsRule_closure1, E._EvaluateVisitor_visitCssSupportsRule__closure0, E._EvaluateVisitor_visitCssSupportsRule_closure2, E._EvaluateVisitor__performInterpolation_closure0, E._EvaluateVisitor__serialize_closure0, E._EvaluateVisitor__stackTrace_closure0, E._ImportedCssVisitor_visitCssAtRule_closure0, E._ImportedCssVisitor_visitCssMediaRule_closure0, E._ImportedCssVisitor_visitCssStyleRule_closure0, E._ImportedCssVisitor_visitCssSupportsRule_closure0, R._EvaluateVisitor_closure, R._EvaluateVisitor_closure0, R._EvaluateVisitor_closure1, R._EvaluateVisitor_closure2, R._EvaluateVisitor_closure3, R._EvaluateVisitor_closure4, R._EvaluateVisitor_closure5, R._EvaluateVisitor_closure6, R._EvaluateVisitor__closure1, R._EvaluateVisitor_closure7, R._EvaluateVisitor_closure8, R._EvaluateVisitor__closure, R._EvaluateVisitor__closure0, R._EvaluateVisitor_run_closure, R._EvaluateVisitor_runExpression_closure, R._EvaluateVisitor_runExpression__closure, R._EvaluateVisitor_runStatement_closure, R._EvaluateVisitor_runStatement__closure, R._EvaluateVisitor__withWarnCallback_closure, R._EvaluateVisitor__loadModule_closure, R._EvaluateVisitor__loadModule_closure0, R._EvaluateVisitor__execute_closure, R._EvaluateVisitor__combineCss_closure, R._EvaluateVisitor__combineCss_closure0, R._EvaluateVisitor__combineCss_closure1, R._EvaluateVisitor__extendModules_closure, R._EvaluateVisitor__extendModules_closure0, R._EvaluateVisitor__topologicalModules_visitModule, R._EvaluateVisitor_visitAtRootRule_closure, R._EvaluateVisitor_visitAtRootRule_closure0, R._EvaluateVisitor_visitAtRootRule_closure1, R._EvaluateVisitor__scopeForAtRoot_closure, R._EvaluateVisitor__scopeForAtRoot_closure0, R._EvaluateVisitor__scopeForAtRoot_closure1, R._EvaluateVisitor__scopeForAtRoot__closure, R._EvaluateVisitor__scopeForAtRoot_closure2, R._EvaluateVisitor__scopeForAtRoot_closure3, R._EvaluateVisitor__scopeForAtRoot_closure4, R._EvaluateVisitor_visitContentRule_closure, R._EvaluateVisitor_visitDeclaration_closure, R._EvaluateVisitor_visitEachRule_closure, R._EvaluateVisitor_visitEachRule_closure0, R._EvaluateVisitor_visitEachRule_closure1, R._EvaluateVisitor_visitEachRule__closure, R._EvaluateVisitor_visitEachRule___closure, R._EvaluateVisitor_visitExtendRule_closure, R._EvaluateVisitor_visitAtRule_closure, R._EvaluateVisitor_visitAtRule__closure, R._EvaluateVisitor_visitAtRule_closure0, R._EvaluateVisitor_visitForRule_closure, R._EvaluateVisitor_visitForRule_closure0, R._EvaluateVisitor_visitForRule_closure1, R._EvaluateVisitor_visitForRule_closure2, R._EvaluateVisitor_visitForRule_closure3, R._EvaluateVisitor_visitForRule__closure, R._EvaluateVisitor_visitForwardRule_closure, R._EvaluateVisitor_visitForwardRule_closure0, R._EvaluateVisitor__assertConfigurationIsEmpty_closure, R._EvaluateVisitor_visitIfRule_closure, R._EvaluateVisitor_visitIfRule__closure, R._EvaluateVisitor__visitDynamicImport_closure, R._EvaluateVisitor__visitDynamicImport__closure, R._EvaluateVisitor_visitIncludeRule_closure, R._EvaluateVisitor_visitIncludeRule_closure0, R._EvaluateVisitor_visitIncludeRule_closure1, R._EvaluateVisitor_visitIncludeRule__closure, R._EvaluateVisitor_visitIncludeRule___closure, R._EvaluateVisitor_visitIncludeRule____closure, R._EvaluateVisitor_visitMediaRule_closure, R._EvaluateVisitor_visitMediaRule__closure, R._EvaluateVisitor_visitMediaRule___closure, R._EvaluateVisitor_visitMediaRule_closure0, R._EvaluateVisitor__visitMediaQueries_closure, R._EvaluateVisitor_visitStyleRule_closure, R._EvaluateVisitor_visitStyleRule_closure0, R._EvaluateVisitor_visitStyleRule_closure1, R._EvaluateVisitor_visitStyleRule_closure2, R._EvaluateVisitor_visitStyleRule_closure3, R._EvaluateVisitor_visitStyleRule_closure4, R._EvaluateVisitor_visitStyleRule__closure, R._EvaluateVisitor_visitStyleRule_closure5, R._EvaluateVisitor_visitSupportsRule_closure, R._EvaluateVisitor_visitSupportsRule__closure, R._EvaluateVisitor_visitSupportsRule_closure0, R._EvaluateVisitor_visitVariableDeclaration_closure, R._EvaluateVisitor_visitVariableDeclaration_closure0, R._EvaluateVisitor_visitVariableDeclaration_closure1, R._EvaluateVisitor_visitUseRule_closure, R._EvaluateVisitor_visitWarnRule_closure, R._EvaluateVisitor_visitWhileRule_closure, R._EvaluateVisitor_visitWhileRule__closure, R._EvaluateVisitor_visitBinaryOperationExpression_closure, R._EvaluateVisitor_visitVariableExpression_closure, R._EvaluateVisitor_visitListExpression_closure, R._EvaluateVisitor_visitFunctionExpression_closure, R._EvaluateVisitor_visitFunctionExpression_closure0, R._EvaluateVisitor__runUserDefinedCallable_closure, R._EvaluateVisitor__runUserDefinedCallable__closure, R._EvaluateVisitor__runUserDefinedCallable___closure, R._EvaluateVisitor__runUserDefinedCallable____closure, R._EvaluateVisitor__runFunctionCallable_closure, R._EvaluateVisitor__runBuiltInCallable_closure, R._EvaluateVisitor__runBuiltInCallable_closure0, R._EvaluateVisitor__evaluateArguments_closure, R._EvaluateVisitor__evaluateMacroArguments_closure, R._EvaluateVisitor__evaluateMacroArguments_closure0, R._EvaluateVisitor__evaluateMacroArguments_closure1, R._EvaluateVisitor__evaluateMacroArguments_closure2, R._EvaluateVisitor__addRestMap_closure, R._EvaluateVisitor__addRestMap_closure0, R._EvaluateVisitor__verifyArguments_closure, R._EvaluateVisitor_visitStringExpression_closure, R._EvaluateVisitor_visitCssAtRule_closure, R._EvaluateVisitor_visitCssAtRule_closure0, R._EvaluateVisitor_visitCssKeyframeBlock_closure, R._EvaluateVisitor_visitCssKeyframeBlock_closure0, R._EvaluateVisitor_visitCssMediaRule_closure, R._EvaluateVisitor_visitCssMediaRule__closure, R._EvaluateVisitor_visitCssMediaRule___closure, R._EvaluateVisitor_visitCssMediaRule_closure0, R._EvaluateVisitor_visitCssStyleRule_closure, R._EvaluateVisitor_visitCssStyleRule__closure, R._EvaluateVisitor_visitCssStyleRule_closure0, R._EvaluateVisitor_visitCssSupportsRule_closure, R._EvaluateVisitor_visitCssSupportsRule__closure, R._EvaluateVisitor_visitCssSupportsRule_closure0, R._EvaluateVisitor__performInterpolation_closure, R._EvaluateVisitor__serialize_closure, R._EvaluateVisitor__stackTrace_closure, R._ImportedCssVisitor_visitCssAtRule_closure, R._ImportedCssVisitor_visitCssMediaRule_closure, R._ImportedCssVisitor_visitCssStyleRule_closure, R._ImportedCssVisitor_visitCssSupportsRule_closure, N.serialize_closure, N._SerializeVisitor_visitCssComment_closure, N._SerializeVisitor_visitCssAtRule_closure, N._SerializeVisitor_visitCssMediaRule_closure, N._SerializeVisitor_visitCssImport_closure, N._SerializeVisitor_visitCssImport__closure, N._SerializeVisitor_visitCssKeyframeBlock_closure, N._SerializeVisitor_visitCssStyleRule_closure, N._SerializeVisitor_visitCssSupportsRule_closure, N._SerializeVisitor_visitCssDeclaration_closure, N._SerializeVisitor_visitCssDeclaration_closure0, N._SerializeVisitor_visitList_closure, N._SerializeVisitor_visitList_closure0, N._SerializeVisitor_visitList_closure1, N._SerializeVisitor_visitMap_closure, N._SerializeVisitor_visitSelectorList_closure, N._SerializeVisitor__write_closure, N._SerializeVisitor__visitChildren_closure, N.withWarnCallback_closure, T.SingleMapping_SingleMapping$fromEntries_closure, T.SingleMapping_SingleMapping$fromEntries_closure0, T.SingleMapping_SingleMapping$fromEntries_closure1, T.SingleMapping_toJson_closure, T.SingleMapping_toJson_closure0, U.Highlighter_closure, U.Highlighter$__closure, U.Highlighter$___closure, U.Highlighter$__closure0, U.Highlighter__collateLines_closure, U.Highlighter__collateLines_closure0, U.Highlighter__collateLines_closure1, U.Highlighter__collateLines__closure, U.Highlighter_highlight_closure, U.Highlighter_highlight_closure0, U.Highlighter__writeFileStart_closure, U.Highlighter__writeMultilineHighlights_closure, U.Highlighter__writeMultilineHighlights_closure0, U.Highlighter__writeMultilineHighlights_closure1, U.Highlighter__writeMultilineHighlights_closure2, U.Highlighter__writeMultilineHighlights__closure, U.Highlighter__writeMultilineHighlights__closure0, U.Highlighter__writeHighlightedText_closure, U.Highlighter__writeIndicator_closure, U.Highlighter__writeIndicator_closure0, U.Highlighter__writeIndicator_closure1, U.Highlighter__writeSidebar_closure, U._Highlight_closure, U.Chain_Chain$parse_closure, U.Chain_Chain$parse_closure0, U.Chain_Chain$parse_closure1, U.Chain_toTrace_closure, U.Chain_toString_closure0, U.Chain_toString__closure0, U.Chain_toString_closure, U.Chain_toString__closure, A.Frame_Frame$parseVM_closure, A.Frame_Frame$parseV8_closure, A.Frame_Frame$parseV8_closure_parseLocation, A.Frame_Frame$_parseFirefoxEval_closure, A.Frame_Frame$parseFirefox_closure, A.Frame_Frame$parseFriendly_closure, T.LazyTrace_terse_closure, Y.Trace_Trace$from_closure, Y.Trace__parseVM_closure, Y.Trace__parseVM_closure0, Y.Trace$parseV8_closure, Y.Trace$parseV8_closure0, Y.Trace$parseJSCore_closure, Y.Trace$parseJSCore_closure0, Y.Trace$parseFirefox_closure, Y.Trace$parseFirefox_closure0, Y.Trace$parseFriendly_closure, Y.Trace$parseFriendly_closure0, Y.Trace_terse_closure, Y.Trace_foldFrames_closure, Y.Trace_foldFrames_closure0, Y.Trace_toString_closure0, Y.Trace_toString_closure, L._StreamTransformer_bind_closure, L._StreamTransformer_bind__closure, L._StreamTransformer_bind__closure1, L._StreamTransformer_bind__closure0, L._StreamTransformer_bind__closure2, R._debounceAggregate_closure, R._debounceAggregate__closure, R._debounceAggregate_closure0, B.ArgumentDeclaration_verify_closure1, B.ArgumentDeclaration_verify_closure2, S.AsyncBuiltInCallable$mixin_closure0, X._compileStylesheet_closure2, Q.AsyncEnvironment_importForwards_closure3, Q.AsyncEnvironment_importForwards_closure4, Q.AsyncEnvironment_importForwards_closure5, Q.AsyncEnvironment_importForwards_closure6, Q.AsyncEnvironment__getVariableFromGlobalModule_closure0, Q.AsyncEnvironment_setVariable_closure2, Q.AsyncEnvironment_setVariable_closure3, Q.AsyncEnvironment_setVariable_closure4, Q.AsyncEnvironment__getFunctionFromGlobalModule_closure0, Q.AsyncEnvironment__getMixinFromGlobalModule_closure0, Q._EnvironmentModule__EnvironmentModule_closure17, Q._EnvironmentModule__EnvironmentModule_closure18, Q._EnvironmentModule__EnvironmentModule_closure19, Q._EnvironmentModule__EnvironmentModule_closure20, Q._EnvironmentModule__EnvironmentModule_closure21, Q._EnvironmentModule__EnvironmentModule_closure22, E._EvaluateVisitor_closure29, E._EvaluateVisitor_closure30, E._EvaluateVisitor_closure31, E._EvaluateVisitor_closure32, E._EvaluateVisitor_closure33, E._EvaluateVisitor_closure34, E._EvaluateVisitor_closure35, E._EvaluateVisitor_closure36, E._EvaluateVisitor__closure10, E._EvaluateVisitor_closure37, E._EvaluateVisitor_closure38, E._EvaluateVisitor__closure8, E._EvaluateVisitor__closure9, E._EvaluateVisitor_run_closure2, E._EvaluateVisitor__withWarnCallback_closure2, E._EvaluateVisitor__loadModule_closure5, E._EvaluateVisitor__loadModule_closure6, E._EvaluateVisitor__execute_closure2, E._EvaluateVisitor__combineCss_closure8, E._EvaluateVisitor__combineCss_closure9, E._EvaluateVisitor__combineCss_closure10, E._EvaluateVisitor__extendModules_closure5, E._EvaluateVisitor__extendModules_closure6, E._EvaluateVisitor__topologicalModules_visitModule2, E._EvaluateVisitor_visitAtRootRule_closure8, E._EvaluateVisitor_visitAtRootRule_closure9, E._EvaluateVisitor_visitAtRootRule_closure10, E._EvaluateVisitor__scopeForAtRoot_closure17, E._EvaluateVisitor__scopeForAtRoot_closure18, E._EvaluateVisitor__scopeForAtRoot_closure19, E._EvaluateVisitor__scopeForAtRoot__closure2, E._EvaluateVisitor__scopeForAtRoot_closure20, E._EvaluateVisitor__scopeForAtRoot_closure21, E._EvaluateVisitor__scopeForAtRoot_closure22, E._EvaluateVisitor_visitContentRule_closure2, E._EvaluateVisitor_visitDeclaration_closure2, E._EvaluateVisitor_visitEachRule_closure8, E._EvaluateVisitor_visitEachRule_closure9, E._EvaluateVisitor_visitEachRule_closure10, E._EvaluateVisitor_visitEachRule__closure2, E._EvaluateVisitor_visitEachRule___closure2, E._EvaluateVisitor_visitExtendRule_closure2, E._EvaluateVisitor_visitAtRule_closure5, E._EvaluateVisitor_visitAtRule__closure2, E._EvaluateVisitor_visitAtRule_closure6, E._EvaluateVisitor_visitForRule_closure14, E._EvaluateVisitor_visitForRule_closure15, E._EvaluateVisitor_visitForRule_closure16, E._EvaluateVisitor_visitForRule_closure17, E._EvaluateVisitor_visitForRule_closure18, E._EvaluateVisitor_visitForRule__closure2, E._EvaluateVisitor_visitForwardRule_closure5, E._EvaluateVisitor_visitForwardRule_closure6, E._EvaluateVisitor__assertConfigurationIsEmpty_closure2, E._EvaluateVisitor_visitIfRule_closure2, E._EvaluateVisitor_visitIfRule__closure2, E._EvaluateVisitor__visitDynamicImport_closure2, E._EvaluateVisitor__visitDynamicImport__closure2, E._EvaluateVisitor_visitIncludeRule_closure8, E._EvaluateVisitor_visitIncludeRule_closure9, E._EvaluateVisitor_visitIncludeRule_closure10, E._EvaluateVisitor_visitIncludeRule__closure2, E._EvaluateVisitor_visitIncludeRule___closure2, E._EvaluateVisitor_visitIncludeRule____closure2, E._EvaluateVisitor_visitMediaRule_closure5, E._EvaluateVisitor_visitMediaRule__closure2, E._EvaluateVisitor_visitMediaRule___closure2, E._EvaluateVisitor_visitMediaRule_closure6, E._EvaluateVisitor__visitMediaQueries_closure2, E._EvaluateVisitor_visitStyleRule_closure20, E._EvaluateVisitor_visitStyleRule_closure21, E._EvaluateVisitor_visitStyleRule_closure22, E._EvaluateVisitor_visitStyleRule_closure23, E._EvaluateVisitor_visitStyleRule_closure24, E._EvaluateVisitor_visitStyleRule_closure25, E._EvaluateVisitor_visitStyleRule__closure2, E._EvaluateVisitor_visitStyleRule_closure26, E._EvaluateVisitor_visitSupportsRule_closure5, E._EvaluateVisitor_visitSupportsRule__closure2, E._EvaluateVisitor_visitSupportsRule_closure6, E._EvaluateVisitor_visitVariableDeclaration_closure8, E._EvaluateVisitor_visitVariableDeclaration_closure9, E._EvaluateVisitor_visitVariableDeclaration_closure10, E._EvaluateVisitor_visitUseRule_closure2, E._EvaluateVisitor_visitWarnRule_closure2, E._EvaluateVisitor_visitWhileRule_closure2, E._EvaluateVisitor_visitWhileRule__closure2, E._EvaluateVisitor_visitBinaryOperationExpression_closure2, E._EvaluateVisitor_visitVariableExpression_closure2, E._EvaluateVisitor_visitListExpression_closure2, E._EvaluateVisitor_visitFunctionExpression_closure5, E._EvaluateVisitor_visitFunctionExpression_closure6, E._EvaluateVisitor__runUserDefinedCallable_closure2, E._EvaluateVisitor__runUserDefinedCallable__closure2, E._EvaluateVisitor__runUserDefinedCallable___closure2, E._EvaluateVisitor__runUserDefinedCallable____closure2, E._EvaluateVisitor__runFunctionCallable_closure2, E._EvaluateVisitor__runBuiltInCallable_closure5, E._EvaluateVisitor__runBuiltInCallable_closure6, E._EvaluateVisitor__evaluateArguments_closure2, E._EvaluateVisitor__evaluateMacroArguments_closure11, E._EvaluateVisitor__evaluateMacroArguments_closure12, E._EvaluateVisitor__evaluateMacroArguments_closure13, E._EvaluateVisitor__evaluateMacroArguments_closure14, E._EvaluateVisitor__addRestMap_closure5, E._EvaluateVisitor__addRestMap_closure6, E._EvaluateVisitor__verifyArguments_closure2, E._EvaluateVisitor_visitStringExpression_closure2, E._EvaluateVisitor_visitCssAtRule_closure5, E._EvaluateVisitor_visitCssAtRule_closure6, E._EvaluateVisitor_visitCssKeyframeBlock_closure5, E._EvaluateVisitor_visitCssKeyframeBlock_closure6, E._EvaluateVisitor_visitCssMediaRule_closure5, E._EvaluateVisitor_visitCssMediaRule__closure2, E._EvaluateVisitor_visitCssMediaRule___closure2, E._EvaluateVisitor_visitCssMediaRule_closure6, E._EvaluateVisitor_visitCssStyleRule_closure5, E._EvaluateVisitor_visitCssStyleRule__closure2, E._EvaluateVisitor_visitCssStyleRule_closure6, E._EvaluateVisitor_visitCssSupportsRule_closure5, E._EvaluateVisitor_visitCssSupportsRule__closure2, E._EvaluateVisitor_visitCssSupportsRule_closure6, E._EvaluateVisitor__performInterpolation_closure2, E._EvaluateVisitor__serialize_closure2, E._EvaluateVisitor__stackTrace_closure2, E._ImportedCssVisitor_visitCssAtRule_closure2, E._ImportedCssVisitor_visitCssMediaRule_closure2, E._ImportedCssVisitor_visitCssStyleRule_closure2, E._ImportedCssVisitor_visitCssSupportsRule_closure2, O.AsyncImportCache_canonicalize_closure0, O.AsyncImportCache__canonicalize_closure0, O.AsyncImportCache_importCanonical_closure0, O.AsyncImportCache_humanize_closure2, O.AsyncImportCache_humanize_closure3, O.AsyncImportCache_humanize_closure4, V.AtRootQueryParser_parse_closure0, Z.closure263, Z._closure34, Z._closure35, Q.BuiltInCallable$mixin_closure0, K.closure159, K.closure160, K.closure161, K.closure162, K.closure163, K.closure164, K.closure165, K.closure166, K.closure167, K.closure168, K.closure169, K.closure170, K.closure171, K.closure172, K.closure173, K.closure174, K.closure175, K.closure176, K.closure177, K.closure178, K.closure179, K.closure180, K.closure181, K.closure182, K.closure183, K.closure184, K._closure23, K.closure185, K.closure214, K.closure215, K.closure216, K.closure217, K.closure218, K.closure219, K.closure220, K.closure221, K._closure28, K.closure222, K.closure197, K.closure196, K.closure195, K.closure194, K.closure193, K.closure192, K.closure191, K.closure190, K.closure188, K.closure187, K.closure186, K.closure189, K.closure_hexString0, K._updateComponents_getParam0, K._updateComponents_closure0, K._updateComponents_updateValue0, K._updateComponents_updateRgb0, K._functionString_closure0, K._removedColorFunction_closure0, K._removeUnits_closure1, K._removeUnits_closure2, K._parseChannels_closure0, K.closure253, K.closure254, K.closure255, K.closure256, K.closure257, K.closure258, K.closure259, K.closure260, K.closure261, K.closure262, K.SassColor_SassColor$hwb_toRgb0, U._compileStylesheet_closure1, S.ComplexSelector_isInvisible_closure0, X.CompoundSelector_isInvisible_closure0, Q.closure227, V.EachRule_toString_closure0, O.Environment_importForwards_closure3, O.Environment_importForwards_closure4, O.Environment_importForwards_closure5, O.Environment_importForwards_closure6, O.Environment__getVariableFromGlobalModule_closure0, O.Environment_setVariable_closure2, O.Environment_setVariable_closure3, O.Environment_setVariable_closure4, O.Environment__getFunctionFromGlobalModule_closure0, O.Environment__getMixinFromGlobalModule_closure0, O._EnvironmentModule__EnvironmentModule_closure11, O._EnvironmentModule__EnvironmentModule_closure12, O._EnvironmentModule__EnvironmentModule_closure13, O._EnvironmentModule__EnvironmentModule_closure14, O._EnvironmentModule__EnvironmentModule_closure15, O._EnvironmentModule__EnvironmentModule_closure16, R._EvaluateVisitor_closure19, R._EvaluateVisitor_closure20, R._EvaluateVisitor_closure21, R._EvaluateVisitor_closure22, R._EvaluateVisitor_closure23, R._EvaluateVisitor_closure24, R._EvaluateVisitor_closure25, R._EvaluateVisitor_closure26, R._EvaluateVisitor__closure7, R._EvaluateVisitor_closure27, R._EvaluateVisitor_closure28, R._EvaluateVisitor__closure5, R._EvaluateVisitor__closure6, R._EvaluateVisitor_run_closure1, R._EvaluateVisitor__withWarnCallback_closure1, R._EvaluateVisitor__loadModule_closure3, R._EvaluateVisitor__loadModule_closure4, R._EvaluateVisitor__execute_closure1, R._EvaluateVisitor__combineCss_closure5, R._EvaluateVisitor__combineCss_closure6, R._EvaluateVisitor__combineCss_closure7, R._EvaluateVisitor__extendModules_closure3, R._EvaluateVisitor__extendModules_closure4, R._EvaluateVisitor__topologicalModules_visitModule1, R._EvaluateVisitor_visitAtRootRule_closure5, R._EvaluateVisitor_visitAtRootRule_closure6, R._EvaluateVisitor_visitAtRootRule_closure7, R._EvaluateVisitor__scopeForAtRoot_closure11, R._EvaluateVisitor__scopeForAtRoot_closure12, R._EvaluateVisitor__scopeForAtRoot_closure13, R._EvaluateVisitor__scopeForAtRoot__closure1, R._EvaluateVisitor__scopeForAtRoot_closure14, R._EvaluateVisitor__scopeForAtRoot_closure15, R._EvaluateVisitor__scopeForAtRoot_closure16, R._EvaluateVisitor_visitContentRule_closure1, R._EvaluateVisitor_visitDeclaration_closure1, R._EvaluateVisitor_visitEachRule_closure5, R._EvaluateVisitor_visitEachRule_closure6, R._EvaluateVisitor_visitEachRule_closure7, R._EvaluateVisitor_visitEachRule__closure1, R._EvaluateVisitor_visitEachRule___closure1, R._EvaluateVisitor_visitExtendRule_closure1, R._EvaluateVisitor_visitAtRule_closure3, R._EvaluateVisitor_visitAtRule__closure1, R._EvaluateVisitor_visitAtRule_closure4, R._EvaluateVisitor_visitForRule_closure9, R._EvaluateVisitor_visitForRule_closure10, R._EvaluateVisitor_visitForRule_closure11, R._EvaluateVisitor_visitForRule_closure12, R._EvaluateVisitor_visitForRule_closure13, R._EvaluateVisitor_visitForRule__closure1, R._EvaluateVisitor_visitForwardRule_closure3, R._EvaluateVisitor_visitForwardRule_closure4, R._EvaluateVisitor__assertConfigurationIsEmpty_closure1, R._EvaluateVisitor_visitIfRule_closure1, R._EvaluateVisitor_visitIfRule__closure1, R._EvaluateVisitor__visitDynamicImport_closure1, R._EvaluateVisitor__visitDynamicImport__closure1, R._EvaluateVisitor_visitIncludeRule_closure5, R._EvaluateVisitor_visitIncludeRule_closure6, R._EvaluateVisitor_visitIncludeRule_closure7, R._EvaluateVisitor_visitIncludeRule__closure1, R._EvaluateVisitor_visitIncludeRule___closure1, R._EvaluateVisitor_visitIncludeRule____closure1, R._EvaluateVisitor_visitMediaRule_closure3, R._EvaluateVisitor_visitMediaRule__closure1, R._EvaluateVisitor_visitMediaRule___closure1, R._EvaluateVisitor_visitMediaRule_closure4, R._EvaluateVisitor__visitMediaQueries_closure1, R._EvaluateVisitor_visitStyleRule_closure13, R._EvaluateVisitor_visitStyleRule_closure14, R._EvaluateVisitor_visitStyleRule_closure15, R._EvaluateVisitor_visitStyleRule_closure16, R._EvaluateVisitor_visitStyleRule_closure17, R._EvaluateVisitor_visitStyleRule_closure18, R._EvaluateVisitor_visitStyleRule__closure1, R._EvaluateVisitor_visitStyleRule_closure19, R._EvaluateVisitor_visitSupportsRule_closure3, R._EvaluateVisitor_visitSupportsRule__closure1, R._EvaluateVisitor_visitSupportsRule_closure4, R._EvaluateVisitor_visitVariableDeclaration_closure5, R._EvaluateVisitor_visitVariableDeclaration_closure6, R._EvaluateVisitor_visitVariableDeclaration_closure7, R._EvaluateVisitor_visitUseRule_closure1, R._EvaluateVisitor_visitWarnRule_closure1, R._EvaluateVisitor_visitWhileRule_closure1, R._EvaluateVisitor_visitWhileRule__closure1, R._EvaluateVisitor_visitBinaryOperationExpression_closure1, R._EvaluateVisitor_visitVariableExpression_closure1, R._EvaluateVisitor_visitListExpression_closure1, R._EvaluateVisitor_visitFunctionExpression_closure3, R._EvaluateVisitor_visitFunctionExpression_closure4, R._EvaluateVisitor__runUserDefinedCallable_closure1, R._EvaluateVisitor__runUserDefinedCallable__closure1, R._EvaluateVisitor__runUserDefinedCallable___closure1, R._EvaluateVisitor__runUserDefinedCallable____closure1, R._EvaluateVisitor__runFunctionCallable_closure1, R._EvaluateVisitor__runBuiltInCallable_closure3, R._EvaluateVisitor__runBuiltInCallable_closure4, R._EvaluateVisitor__evaluateArguments_closure1, R._EvaluateVisitor__evaluateMacroArguments_closure7, R._EvaluateVisitor__evaluateMacroArguments_closure8, R._EvaluateVisitor__evaluateMacroArguments_closure9, R._EvaluateVisitor__evaluateMacroArguments_closure10, R._EvaluateVisitor__addRestMap_closure3, R._EvaluateVisitor__addRestMap_closure4, R._EvaluateVisitor__verifyArguments_closure1, R._EvaluateVisitor_visitStringExpression_closure1, R._EvaluateVisitor_visitCssAtRule_closure3, R._EvaluateVisitor_visitCssAtRule_closure4, R._EvaluateVisitor_visitCssKeyframeBlock_closure3, R._EvaluateVisitor_visitCssKeyframeBlock_closure4, R._EvaluateVisitor_visitCssMediaRule_closure3, R._EvaluateVisitor_visitCssMediaRule__closure1, R._EvaluateVisitor_visitCssMediaRule___closure1, R._EvaluateVisitor_visitCssMediaRule_closure4, R._EvaluateVisitor_visitCssStyleRule_closure3, R._EvaluateVisitor_visitCssStyleRule__closure1, R._EvaluateVisitor_visitCssStyleRule_closure4, R._EvaluateVisitor_visitCssSupportsRule_closure3, R._EvaluateVisitor_visitCssSupportsRule__closure1, R._EvaluateVisitor_visitCssSupportsRule_closure4, R._EvaluateVisitor__performInterpolation_closure1, R._EvaluateVisitor__serialize_closure1, R._EvaluateVisitor__stackTrace_closure1, R._ImportedCssVisitor_visitCssAtRule_closure1, R._ImportedCssVisitor_visitCssMediaRule_closure1, R._ImportedCssVisitor_visitCssStyleRule_closure1, R._ImportedCssVisitor_visitCssSupportsRule_closure1, F.Extender_extensionsWhereTarget_closure0, F.Extender__registerSelector_closure0, F.Extender_addExtension_closure2, F.Extender_addExtension_closure3, F.Extender_addExtension_closure4, F.Extender__extendExistingExtensions_closure1, F.Extender__extendExistingExtensions_closure2, F.Extender_addExtensions_closure0, F.Extender_addExtensions__closure0, F.Extender_addExtensions___closure1, F.Extender_addExtensions___closure2, F.Extender__extendList_closure0, F.Extender__extendComplex_closure1, F.Extender__extendComplex_closure2, F.Extender__extendComplex__closure1, F.Extender__extendComplex__closure2, F.Extender__extendComplex___closure0, F.Extender__extendCompound_closure5, F.Extender__extendCompound_closure6, F.Extender__extendCompound__closure1, F.Extender__extendCompound__closure2, F.Extender__extendCompound_closure7, F.Extender__extendCompound_closure8, F.Extender__extendCompound_closure9, F.Extender__extendCompound_closure10, F.Extender__extendSimple_withoutPseudo0, F.Extender__extendSimple_closure0, F.Extender__extendPseudo_closure4, F.Extender__extendPseudo_closure5, F.Extender__extendPseudo_closure6, F.Extender__extendPseudo_closure7, F.Extender__extendPseudo_closure8, F.Extender__trim_closure1, F.Extender__trim_closure2, F.Extender_clone_closure0, Y.unifyComplex_closure0, Y._weaveParents_closure6, Y._weaveParents_closure7, Y._weaveParents_closure8, Y._weaveParents__closure4, Y._weaveParents_closure9, Y._weaveParents_closure10, Y._weaveParents__closure3, Y._weaveParents_closure11, Y._weaveParents_closure12, Y._weaveParents__closure2, Y._mustUnify_closure0, Y._mustUnify__closure0, Y.paths_closure0, Y.paths__closure0, Y.paths___closure0, Y._hasRoot_closure0, Y.listIsSuperselector_closure0, Y.listIsSuperselector__closure0, Y._simpleIsSuperselectorOfCompound_closure0, Y._simpleIsSuperselectorOfCompound__closure0, Y._selectorPseudoIsSuperselector_closure6, Y._selectorPseudoIsSuperselector_closure7, Y._selectorPseudoIsSuperselector_closure8, Y._selectorPseudoIsSuperselector_closure9, Y._selectorPseudoIsSuperselector_closure10, Y._selectorPseudoIsSuperselector__closure0, Y._selectorPseudoIsSuperselector___closure1, Y._selectorPseudoIsSuperselector___closure2, Y._selectorPseudoIsSuperselector_closure11, Y._selectorPseudoIsSuperselector_closure12, Y._selectorPseudosNamed_closure0, Y.closure114, N.IDSelector_unify_closure0, V.IfRule_toString_closure0, V.IfClause$__closure0, V.IfClause$___closure0, F.NodeImporter__tryPath_closure, R.ImportCache_canonicalize_closure0, R.ImportCache__canonicalize_closure0, R.ImportCache_importCanonical_closure0, R.ImportCache_humanize_closure2, R.ImportCache_humanize_closure3, R.ImportCache_humanize_closure4, X.Interpolation_toString_closure0, F._realCasePath_helper0, F._realCasePath_helper_closure0, F._realCasePath_helper__closure0, E.KeyframeSelectorParser_parse_closure0, D.ListExpression_toString_closure0, D.closure158, D.closure157, D.closure156, D.closure155, D.closure154, D.closure153, D._closure20, D._closure21, D._closure22, D.closure152, D.closure150, D.closure151, D.SelectorList_isInvisible_closure0, D.SelectorList_asSassList_closure0, D.SelectorList_asSassList__closure0, D.SelectorList_unify_closure0, D.SelectorList_unify__closure0, D.SelectorList_unify___closure0, D.SelectorList_resolveParentSelectors_closure0, D.SelectorList_resolveParentSelectors__closure1, D.SelectorList_resolveParentSelectors__closure2, D.SelectorList__complexContainsParentSelector_closure0, D.SelectorList__complexContainsParentSelector__closure0, D.SelectorList__resolveParentSelectorsCompound_closure2, D.SelectorList__resolveParentSelectorsCompound_closure3, D.SelectorList__resolveParentSelectorsCompound_closure4, D.closure246, D._closure33, D.closure247, D.closure248, D.closure249, D.closure250, D.closure251, D.closure252, D.SassList_isBlank_closure0, A.MapExpression_toString_closure0, A.closure149, A.closure212, A._closure27, A.closure213, A._closure26, A.closure147, A.closure148, A._closure19, A.closure211, A.closure210, A._closure25, A.closure145, A.closure146, A.closure144, A.closure143, A.closure142, A._modify__modifyNestedMap0, A._deepMergeImpl__ensureMutable0, A._deepMergeImpl_closure0, A.closure239, A._closure31, A._closure32, A.closure240, A.closure241, A.closure242, A.closure243, A.closure244, A.closure245, A.SassMap_asList_closure0, K.closure140, K.closure205, K.closure139, K.closure138, K.closure137, K.closure141, K.closure203, K._closure24, K.closure202, K.closure201, K.closure199, K.closure209, K.closure208, K.closure207, K.closure206, K.closure204, K.closure200, K.closure198, K.closure133, K.closure132, K.closure134, K.closure136, K.closure135, K._numberFunction_closure0, F.MediaQueryParser_parse_closure0, Q.closure223, Q.closure224, Q.closure225, Q.closure226, B._readFile_closure0, B.fileExists_closure0, B.dirExists_closure0, B.listDir_closure0, B.listDir__closure1, B.listDir__closure2, B.listDir_closure_list0, B.listDir__list_closure0, B._render_closure, B._render_closure0, B._render_closure1, B._parseFunctions_closure, B._parseFunctions__closure, B._parseFunctions___closure0, B._parseFunctions____closure, B._parseFunctions___closure1, B._parseFunctions__closure0, B._parseFunctions__closure1, B._parseFunctions___closure, B._parseImporter_closure, B._parseImporter__closure, B._parseImporter___closure, B._parseImporter____closure, B._parseImporter___closure0, O.closure238, O._closure29, O._closure30, T.closure232, T.closure233, T.closure234, T.closure235, T.closure236, T.closure237, T._parseNumber_closure, T._parseNumber_closure0, T.SassNumber__coerceOrConvertValue__compatibilityException0, T.SassNumber__coerceOrConvertValue_closure3, T.SassNumber__coerceOrConvertValue_closure4, T.SassNumber__coerceOrConvertValue_closure5, T.SassNumber__coerceOrConvertValue_closure6, T.SassNumber_plus_closure0, T.SassNumber_minus_closure0, T.SassNumber_multiplyUnits_closure3, T.SassNumber_multiplyUnits_closure4, T.SassNumber_multiplyUnits_closure5, T.SassNumber_multiplyUnits_closure6, T.SassNumber__areAnyConvertible_closure0, T.SassNumber__canonicalizeUnitList_closure0, T.SassNumber__canonicalMultiplier_closure0, M.ParentStatement_closure0, M.ParentStatement__closure0, G.Parser__parseIdentifier_closure0, G.Parser_scanIdentChar_matches0, F._PrefixedKeys_iterator_closure0, U.main_printError, U.main_closure, U.SassParser_children_closure0, R._wrapMain_closure, R._wrapMain_closure0, T.closure128, T._closure16, T._closure17, T.closure127, T._closure14, T._closure15, T.__closure0, T.closure126, T.closure125, T.closure124, T.closure131, T.closure130, T._closure18, T.closure129, T.SelectorParser_parse_closure0, T.SelectorParser_parseCompoundSelector_closure0, N.serialize_closure0, N._SerializeVisitor_visitCssComment_closure0, N._SerializeVisitor_visitCssAtRule_closure0, N._SerializeVisitor_visitCssMediaRule_closure0, N._SerializeVisitor_visitCssImport_closure0, N._SerializeVisitor_visitCssImport__closure0, N._SerializeVisitor_visitCssKeyframeBlock_closure0, N._SerializeVisitor_visitCssStyleRule_closure0, N._SerializeVisitor_visitCssSupportsRule_closure0, N._SerializeVisitor_visitCssDeclaration_closure1, N._SerializeVisitor_visitCssDeclaration_closure2, N._SerializeVisitor_visitList_closure2, N._SerializeVisitor_visitList_closure3, N._SerializeVisitor_visitList_closure4, N._SerializeVisitor_visitMap_closure0, N._SerializeVisitor_visitSelectorList_closure0, N._SerializeVisitor__write_closure0, N._SerializeVisitor__visitChildren_closure0, L.SingleUnitSassNumber_multiplyUnits_closure1, L.SingleUnitSassNumber_multiplyUnits_closure2, D.SourceMapBuffer__addEntry_closure0, D.SourceMapBuffer_buildSourceMap_closure0, D.closure123, D.closure122, D.closure118, D.closure117, D.closure116, D.closure115, D.closure121, D.closure120, D.closure119, D.closure228, D.closure229, D.closure230, D.closure231, V.StylesheetParser_parse_closure0, V.StylesheetParser_parse__closure1, V.StylesheetParser_parse__closure2, V.StylesheetParser_parseArgumentDeclaration_closure0, V.StylesheetParser__parseSingleProduction_closure0, V.StylesheetParser_parseSignature_closure, V.StylesheetParser__statement_closure0, V.StylesheetParser_variableDeclarationWithoutNamespace_closure1, V.StylesheetParser_variableDeclarationWithoutNamespace_closure2, V.StylesheetParser__declarationOrBuffer_closure1, V.StylesheetParser__declarationOrBuffer_closure2, V.StylesheetParser__styleRule_closure0, V.StylesheetParser__propertyOrVariableDeclaration_closure1, V.StylesheetParser__propertyOrVariableDeclaration_closure2, V.StylesheetParser__atRootRule_closure1, V.StylesheetParser__atRootRule_closure2, V.StylesheetParser__eachRule_closure0, V.StylesheetParser__functionRule_closure0, V.StylesheetParser__forRule_closure1, V.StylesheetParser__forRule_closure2, V.StylesheetParser__memberList_closure0, V.StylesheetParser__includeRule_closure0, V.StylesheetParser_mediaRule_closure0, V.StylesheetParser__mixinRule_closure0, V.StylesheetParser_mozDocumentRule_closure0, V.StylesheetParser_supportsRule_closure0, V.StylesheetParser__whileRule_closure0, V.StylesheetParser_unknownAtRule_closure0, V.StylesheetParser_expression_resetState0, V.StylesheetParser_expression_resolveOneOperation0, V.StylesheetParser_expression_resolveOperations0, V.StylesheetParser_expression_addSingleExpression0, V.StylesheetParser_expression_addOperator0, V.StylesheetParser_expression_resolveSpaceExpressions0, V.StylesheetParser__expressionUntilComma_closure0, V.StylesheetParser__unicodeRange_closure1, V.StylesheetParser__unicodeRange_closure2, V.StylesheetParser_identifierLike_closure0, V.StylesheetParser__expressionUntilComparison_closure0, V.StylesheetParser__publicIdentifier_closure0, R._UnprefixedKeys_iterator_closure1, R._UnprefixedKeys_iterator_closure2, B.resolveImportPath_closure1, B.resolveImportPath_closure2, B._tryPathAsDirectory_closure0, B._exactlyOne_closure0, B.forwardToString_closure, B.createClass_closure, B.indent_closure0, B.flattenVertically_closure1, B.flattenVertically_closure2, B.longestCommonSubsequence_closure2, B.longestCommonSubsequence_closure3, B.longestCommonSubsequence_closure4, B.longestCommonSubsequence_backtrack0, B.mapAddAll2_closure0, N.withWarnCallback_closure0]);
+    _inherit(H.CastList, H._CastListBase);
+    _inheritMany(P.Error, [H.LateInitializationErrorImpl, P.TypeError, H.JsNoSuchMethodError, H.UnknownJsTypeError, H.RuntimeError, H._Error, P.JsonUnsupportedObjectError, P.AssertionError, P.NullThrownError, P.ArgumentError, P.NoSuchMethodError, P.UnsupportedError, P.UnimplementedError, P.StateError, P.ConcurrentModificationError, P.CyclicInitializationError]);
+    _inherit(P.ListBase, P._ListBase_Object_ListMixin);
+    _inherit(H.UnmodifiableListBase, P.ListBase);
+    _inheritMany(H.UnmodifiableListBase, [H.CodeUnits, P.UnmodifiableListView]);
+    _inheritMany(H.EfficientLengthIterable, [H.ListIterable, H.EmptyIterable, H.LinkedHashMapKeyIterable, P._HashMapKeyIterable, P._MapBaseValueIterable]);
+    _inheritMany(H.ListIterable, [H.SubListIterable, H.MappedListIterable, H.ReversedListIterable, P.ListQueue, P._GeneratorIterable]);
+    _inherit(H.EfficientLengthMappedIterable, H.MappedIterable);
+    _inheritMany(P.Iterator, [H.MappedIterator, H.WhereIterator, H.TakeIterator, H.SkipIterator, H.SkipWhileIterator]);
+    _inherit(H.EfficientLengthTakeIterable, H.TakeIterable);
+    _inherit(H.EfficientLengthSkipIterable, H.SkipIterable);
+    _inherit(H.EfficientLengthFollowedByIterable, H.FollowedByIterable);
+    _inheritMany(P.MapView, [P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, K.PathMap]);
+    _inherit(P.UnmodifiableMapView, P._UnmodifiableMapView_MapView__UnmodifiableMapMixin);
+    _inherit(H.ConstantMapView, P.UnmodifiableMapView);
+    _inherit(H.ConstantStringMap, H.ConstantMap);
+    _inherit(H.ConstantProtoMap, H.ConstantStringMap);
+    _inherit(H.Instantiation1, H.Instantiation);
+    _inherit(H.NullError, P.TypeError);
+    _inheritMany(H.TearOffClosure, [H.StaticClosure, H.BoundClosure]);
+    _inherit(P.MapBase, P.MapMixin);
+    _inheritMany(P.MapBase, [H.JsLinkedHashMap, P._HashMap, P.UnmodifiableMapBase, Z.MergedMapView, Z.MergedMapView0]);
+    _inheritMany(P.IterableBase, [H._AllMatchesIterable, P._SyncStarIterable, O.EmptyUnmodifiableSet, F._PrefixedKeys, R._UnprefixedKeys, F._PrefixedKeys0, R._UnprefixedKeys0]);
+    _inherit(H.NativeTypedArray, H.NativeTypedData);
+    _inheritMany(H.NativeTypedArray, [H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin]);
+    _inherit(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin);
+    _inherit(H.NativeTypedArrayOfDouble, H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin);
+    _inherit(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin);
+    _inherit(H.NativeTypedArrayOfInt, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin);
+    _inheritMany(H.NativeTypedArrayOfDouble, [H.NativeFloat32List, H.NativeFloat64List]);
+    _inheritMany(H.NativeTypedArrayOfInt, [H.NativeInt16List, H.NativeInt32List, H.NativeInt8List, H.NativeUint16List, H.NativeUint32List, H.NativeUint8ClampedList, H.NativeUint8List]);
+    _inherit(H._TypeError, H._Error);
+    _inheritMany(P.Stream, [P._StreamImpl, P._ForwardingStream, Y._CompleterStream]);
+    _inherit(P._ControllerStream, P._StreamImpl);
+    _inherit(P._BroadcastStream, P._ControllerStream);
+    _inheritMany(P._BufferingStreamSubscription, [P._ControllerSubscription, P._ForwardingStreamSubscription]);
+    _inherit(P._BroadcastSubscription, P._ControllerSubscription);
+    _inherit(P._SyncBroadcastStreamController, P._BroadcastStreamController);
+    _inherit(P._AsyncCompleter, P._Completer);
+    _inheritMany(P._StreamController, [P._AsyncStreamController, P._SyncStreamController]);
+    _inherit(P._StreamControllerAddStreamState, P._AddStreamState);
+    _inheritMany(P._DelayedEvent, [P._DelayedData, P._DelayedError]);
+    _inherit(P._StreamImplEvents, P._PendingEvents);
+    _inherit(P._ExpandStream, P._ForwardingStream);
+    _inheritMany(P._Zone, [P._CustomZone, P._RootZone]);
+    _inheritMany(H.JsLinkedHashMap, [P._LinkedIdentityHashMap, P._LinkedCustomHashMap]);
+    _inheritMany(P._SetBase, [P._LinkedHashSet, P._UnmodifiableSet]);
+    _inherit(P._LinkedIdentityHashSet, P._LinkedHashSet);
+    _inheritMany(P.Codec, [P.Encoding, P.Base64Codec, P.JsonCodec]);
+    _inheritMany(P.Encoding, [P.AsciiCodec, P.Utf8Codec]);
+    _inheritMany(P.StreamTransformerBase, [P.Converter, L._StreamTransformer]);
+    _inheritMany(P.Converter, [P._UnicodeSubsetEncoder, P.Base64Encoder, P.JsonEncoder, P.Utf8Encoder, P.Utf8Decoder]);
+    _inherit(P.AsciiEncoder, P._UnicodeSubsetEncoder);
+    _inherit(P._BufferCachingBase64Encoder, P._Base64Encoder);
+    _inherit(P.ByteConversionSink, P.ChunkedConversionSink);
+    _inheritMany(P.ByteConversionSink, [P.ByteConversionSinkBase, P._Utf8StringSinkAdapter, P._Utf8ConversionSink]);
+    _inherit(P._Base64EncoderSink, P.ByteConversionSinkBase);
+    _inheritMany(P._Base64EncoderSink, [P._AsciiBase64EncoderSink, P._Utf8Base64EncoderSink]);
+    _inherit(P.JsonCyclicError, P.JsonUnsupportedObjectError);
+    _inherit(P._JsonStringStringifier, P._JsonStringifier);
+    _inherit(P.StringConversionSinkBase, P.StringConversionSinkMixin);
+    _inheritMany(P.StringConversionSinkBase, [P._StringSinkConversionSink, P._StringAdapterSink]);
+    _inherit(P._StringCallbackSink, P._StringSinkConversionSink);
+    _inheritMany(P.ArgumentError, [P.RangeError, P.IndexError]);
+    _inherit(P._DataUri, P._Uri);
+    _inherit(Z.ArgParserException, P.FormatException);
+    _inherit(Q.QueueList, Q._QueueList_Object_ListMixin);
+    _inherit(Q._CastQueueList, Q.QueueList);
+    _inheritMany(M._DelegatingIterableBase, [M.DelegatingIterable, M._MapKeySet__DelegatingIterableBase_UnmodifiableSetMixin]);
+    _inherit(M.DelegatingSet, M.DelegatingIterable);
+    _inherit(L._UnmodifiableSetView_DelegatingSet_UnmodifiableSetMixin, M.DelegatingSet);
+    _inherit(L.UnmodifiableSetView, L._UnmodifiableSetView_DelegatingSet_UnmodifiableSetMixin);
+    _inherit(M.MapKeySet, M._MapKeySet__DelegatingIterableBase_UnmodifiableSetMixin);
+    _inheritMany(X.NodeJsError, [X.JsAssertionError, X.JsRangeError, X.JsReferenceError, X.JsSyntaxError, X.JsTypeError, X.JsSystemError]);
+    _inheritMany(Y.Socket, [N.TTYReadStream, N.TTYWriteStream]);
+    _inherit(B.InternalStyle, O.Style);
+    _inheritMany(B.InternalStyle, [E.PosixStyle, F.UrlStyle, L.WindowsStyle]);
+    _inherit(B.CssNode, B.AstNode);
+    _inheritMany(B.CssNode, [B.ModifiableCssNode, B.CssParentNode]);
+    _inheritMany(B.ModifiableCssNode, [B.ModifiableCssParentNode, R.ModifiableCssComment, L.ModifiableCssDeclaration, F.ModifiableCssImport]);
+    _inheritMany(B.ModifiableCssParentNode, [U.ModifiableCssAtRule, U.ModifiableCssKeyframeBlock, G.ModifiableCssMediaRule, X.ModifiableCssStyleRule, V.ModifiableCssStylesheet, B.ModifiableCssSupportsRule]);
+    _inherit(V.CssStylesheet, B.CssParentNode);
+    _inheritMany(M.ParentStatement, [V.AtRootRule, U.AtRule, M.CallableDeclaration, L.Declaration, V.EachRule, B.ForRule, G.MediaRule, X.StyleRule, V.Stylesheet, B.SupportsRule, G.WhileRule]);
+    _inheritMany(M.CallableDeclaration, [Y.ContentBlock, M.FunctionRule, T.MixinRule]);
+    _inheritMany(T.Selector, [M.SimpleSelector, S.ComplexSelector, X.CompoundSelector, D.SelectorList]);
+    _inheritMany(M.SimpleSelector, [N.AttributeSelector, X.ClassSelector, N.IDSelector, M.ParentSelector, N.PlaceholderSelector, D.PseudoSelector, F.TypeSelector, N.UniversalSelector]);
+    _inheritMany(G.SourceSpanException, [E.SassException, G.SourceSpanFormatException, E.SassException0]);
+    _inheritMany(E.SassException, [E.MultiSpanSassException, E.SassRuntimeException, E.SassFormatException]);
+    _inherit(E.MultiSpanSassRuntimeException, E.MultiSpanSassException);
+    _inherit(E.MultiSpanSassScriptException, E.SassScriptException);
+    _inherit(A.MergedExtension, S.Extension);
+    _inherit(M.Importer, B.AsyncImporter);
+    _inherit(F.FilesystemImporter, M.Importer);
+    _inheritMany(G.Parser, [V.AtRootQueryParser, V.StylesheetParser, E.KeyframeSelectorParser, F.MediaQueryParser, T.SelectorParser]);
+    _inheritMany(V.StylesheetParser, [L.ScssParser, U.SassParser]);
+    _inherit(Q.CssParser, L.ScssParser);
+    _inheritMany(P.UnmodifiableMapBase, [K.LimitedMapView, F.PrefixedMapView, U.PublicMemberMapView, R.UnprefixedMapView, K.LimitedMapView0, F.PrefixedMapView0, U.PublicMemberMapView0, R.UnprefixedMapView0]);
+    _inheritMany(F.Value, [D.SassList, Z.SassBoolean, K.SassColor, F.SassFunction, A.SassMap, O.SassNull, T.SassNumber, D.SassString]);
+    _inherit(D.SassArgumentList, D.SassList);
+    _inheritMany(T.SassNumber, [S.ComplexSassNumber, L.SingleUnitSassNumber, N.UnitlessSassNumber]);
+    _inherit(F._FindDependenciesVisitor, D.RecursiveStatementVisitor);
+    _inherit(T.SingleMapping, T.Mapping);
+    _inherit(Y.FileLocation, D.SourceLocationMixin);
+    _inheritMany(Y.SourceSpanMixin, [Y._FileSpan, V.SourceSpanBase]);
+    _inherit(X.SourceSpanWithContext, V.SourceSpanBase);
+    _inherit(E.StringScannerException, G.SourceSpanFormatException);
+    _inheritMany(X.StringScanner, [Z.LineScanner, S.SpanScanner]);
+    _inheritMany(F.Value0, [D.SassList0, Z.SassBoolean0, K.SassColor0, T.SassNumber0, F.SassFunction0, A.SassMap0, O.SassNull0, D.SassString0]);
+    _inherit(D.SassArgumentList0, D.SassList0);
+    _inheritMany(G.Parser1, [V.AtRootQueryParser0, V.StylesheetParser0, E.KeyframeSelectorParser0, F.MediaQueryParser0, T.SelectorParser0]);
+    _inheritMany(M.ParentStatement0, [V.AtRootRule0, U.AtRule0, M.CallableDeclaration0, L.Declaration0, V.EachRule0, B.ForRule0, G.MediaRule0, X.StyleRule0, V.Stylesheet0, B.SupportsRule0, G.WhileRule0]);
+    _inherit(B.CssNode0, B.AstNode0);
+    _inheritMany(B.CssNode0, [B.ModifiableCssNode0, B.CssParentNode0]);
+    _inheritMany(B.ModifiableCssNode0, [B.ModifiableCssParentNode0, R.ModifiableCssComment0, L.ModifiableCssDeclaration0, F.ModifiableCssImport0]);
+    _inheritMany(B.ModifiableCssParentNode0, [U.ModifiableCssAtRule0, U.ModifiableCssKeyframeBlock0, G.ModifiableCssMediaRule0, X.ModifiableCssStyleRule0, V.ModifiableCssStylesheet0, B.ModifiableCssSupportsRule0]);
+    _inheritMany(T.Selector0, [M.SimpleSelector0, S.ComplexSelector0, X.CompoundSelector0, D.SelectorList0]);
+    _inheritMany(M.SimpleSelector0, [N.AttributeSelector0, X.ClassSelector0, N.IDSelector0, M.ParentSelector0, N.PlaceholderSelector0, D.PseudoSelector0, F.TypeSelector0, N.UniversalSelector0]);
+    _inheritMany(T.SassNumber0, [S.ComplexSassNumber0, L.SingleUnitSassNumber0, N.UnitlessSassNumber0]);
+    _inheritMany(M.CallableDeclaration0, [Y.ContentBlock0, M.FunctionRule0, T.MixinRule0]);
+    _inheritMany(V.StylesheetParser0, [L.ScssParser0, U.SassParser0]);
+    _inherit(Q.CssParser0, L.ScssParser0);
+    _inheritMany(E.SassException0, [E.MultiSpanSassException0, E.SassRuntimeException0, E.SassFormatException0]);
+    _inherit(E.MultiSpanSassRuntimeException0, E.MultiSpanSassException0);
+    _inherit(E.MultiSpanSassScriptException0, E.SassScriptException0);
+    _inherit(M.Importer0, B.AsyncImporter0);
+    _inherit(F.FilesystemImporter0, M.Importer0);
+    _inherit(A.MergedExtension0, S.Extension0);
+    _inherit(V.CssStylesheet0, B.CssParentNode0);
+    _mixin(H.UnmodifiableListBase, H.UnmodifiableListMixin);
+    _mixin(H.__CastListBase__CastIterableBase_ListMixin, P.ListMixin);
+    _mixin(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, P.ListMixin);
+    _mixin(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, H.FixedLengthListMixin);
+    _mixin(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin, P.ListMixin);
+    _mixin(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, H.FixedLengthListMixin);
+    _mixin(P._AsyncStreamController, P._AsyncStreamControllerDispatch);
+    _mixin(P._SyncStreamController, P._SyncStreamControllerDispatch);
+    _mixin(P.UnmodifiableMapBase, P._UnmodifiableMapMixin);
+    _mixin(P._ListBase_Object_ListMixin, P.ListMixin);
+    _mixin(P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, P._UnmodifiableMapMixin);
+    _mixin(Q._QueueList_Object_ListMixin, P.ListMixin);
+    _mixin(L._UnmodifiableSetView_DelegatingSet_UnmodifiableSetMixin, L.UnmodifiableSetMixin);
+    _mixin(M._MapKeySet__DelegatingIterableBase_UnmodifiableSetMixin, L.UnmodifiableSetMixin);
+  })();
+  var init = {
+    typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},
+    mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List"},
+    mangledNames: {},
+    getTypeFromName: getGlobalFromName,
+    metadata: [],
+    types: ["Null()", "~()", "Future<Null>*()", "Value0*(List<Value0*>*)", "String*(String*)", "Value*(List<Value*>*)", "bool*(String*)", "bool*(CssNode*)", "bool*(CssNode0*)", "SassNumber*(List<Value*>*)", "SassNumber0*(List<Value0*>*)", "int*()", "String*()", "Value*()", "bool*(ComplexSelector0*)", "bool*(ComplexSelector*)", "SassString*(List<Value*>*)", "SassString0*(List<Value0*>*)", "bool*(SimpleSelector*)", "bool*(SimpleSelector0*)", "SassBoolean0*(List<Value0*>*)", "Value0*()", "SassBoolean*(List<Value*>*)", "bool*(Object*)", "bool*(int*)", "SassColor*(List<Value*>*)", "bool(Object?)", "SassList0*(List<Value0*>*)", "SassList*(List<Value*>*)", "SassColor0*(List<Value0*>*)", "Future<Value*>*()", "Future<Value0*>*()", "Future<Null>*(Future<~>*()*)", "FileSpan*()", "Null(~()*)", "bool*()", "SassMap*(List<Value*>*)", "SassMap0*(List<Value0*>*)", "bool*(num*,num*)", "int*(num*)", "List<String*>*()", "String*(Object*)", "SelectorList*()", "@(@)", "SelectorList0*()", "Null(Value0*,Value0*)", "Null(Value*,Value*)", "ValueExpression*(Value*)", "ValueExpression0*(Value0*)", "~(Object*)", "num*(num*,num*)", "bool*(PseudoSelector*)", "Statement0*()", "bool*(Value*)", "Frame*(String*)", "bool*(Value0*)", "~(Object,StackTrace)", "Statement*()", "bool*(PseudoSelector0*)", "Stylesheet*()", "Frame*()", "Value*(Statement*)", "ComplexSelector*(List<ComplexSelectorComponent*>*)", "~(Object?)", "Value*(Value*)", "Null([Object*])", "@()", "Declaration*(List<Statement*>*,FileSpan*)", "~(Value*)", "Declaration0*(List<Statement0*>*,FileSpan*)", "Object*()", "ComplexSelector0*(List<ComplexSelectorComponent0*>*)", "~(String*,bool*)", "Value0*(Statement0*)", "Value0*(Value0*)", "Null(_NodeSassColor*,num*)", "Null(String*,Value0*)", "Future<Value0*>*(Statement0*)", "~(Value0*)", "Future<String*>*(@)", "Null(String*,Value*)", "Future<Value*>*(Statement*)", "Null(Module0<Callable0*>*)", "ComplexSelector*(ComplexSelector*)", "String*(int*)", "Map<ComplexSelector0*,Extension0*>*()", "Map<ComplexSelector*,Extension*>*()", "Null(Value0*)", "Iterable<String*>*(Module<AsyncCallable*>*)", "Iterable<ComplexSelector*>*(ComplexSelector*)", "Callable0*()", "bool*(ComplexSelectorComponent*)", "Iterable<String*>*(Module0<Callable0*>*)", "bool*(ComplexSelectorComponent0*)", "bool*(Module<AsyncCallable*>*)", "int*(_NodeSassColor*)", "Null([@])", "List<ComplexSelectorComponent*>*(List<ComplexSelectorComponent*>*)", "Null(List<Value0*>*)", "ComplexSelector0*(ComplexSelector0*)", "List<CssMediaQuery0*>*()", "Null(Module0<AsyncCallable0*>*)", "bool*(Module0<Callable0*>*)", "Null(List<Value*>*)", "Null(@,@)", "AsyncCallable*()", "~(~())", "String*(@)", "AsyncCallable0*()", "Tuple3<Importer*,Uri*,Uri*>*()", "Null(@)", "bool*(Module0<AsyncCallable0*>*)", "Iterable<String*>*(Module0<AsyncCallable0*>*)", "AtRootQuery*()", "List<CssMediaQuery*>*()", "bool*(_Highlight*)", "Null(Value*)", "Null(Module<Callable*>*)", "Callable*()", "Iterable<String*>*(Module<Callable*>*)", "Iterable<ComplexSelector0*>*(ComplexSelector0*)", "Null(Module<AsyncCallable*>*)", "bool*(Module<Callable*>*)", "List<ComplexSelectorComponent0*>*(List<ComplexSelectorComponent0*>*)", "SourceFile*()", "AtRootQuery0*()", "Future<Null>*(List<Value*>*)", "Module<Callable*>*(Module<Callable*>*)", "Callable*(Module<Callable*>*)", "Null([@])*()", "Iterable<ComplexSelectorComponent*>*(List<List<ComplexSelectorComponent*>*>*)", "bool*(Queue<@>*)", "Frame*(Tuple2<String*,AstNode0*>*)", "Null(@,StackTrace*)", "bool*(Import0*)", "bool*(Statement0*)", "Null(String*,ConfiguredValue0*)", "Map<String*,Callable*>*(Module<Callable*>*)", "Future<SassNumber0*>*()", "Future<@>*()", "Module<AsyncCallable*>*(Module<AsyncCallable*>*)", "num*(String*,num*{assertPercent:bool*,checkPercent:bool*})", "num*(num*,num*,num*)", "int*(int*,num*)", "Iterable<ComplexSelectorComponent0*>*(List<List<ComplexSelectorComponent0*>*>*)", "AsyncCallable*(Module<AsyncCallable*>*)", "bool*(ModifiableCssParentNode0*)", "String*(_NodeSassNumber*)", "bool(Object?,Object?)", "int(Object?)", "List<Extender0*>*()", "bool*(@)", "~(Module0<AsyncCallable0*>*)", "List<Extension0*>*()", "~([Future<~>?])", "num*(num*)", "Future<Value0*>*(List<Value0*>*)", "SelectorList*(Value*)", "SelectorList*(SelectorList*,SelectorList*)", "Map<String*,AsyncCallable*>*(Module<AsyncCallable*>*)", "AtRule0*(List<Statement0*>*,FileSpan*)", "Uri*()", "SassFunction0*(List<Value0*>*)", "List<Extension*>*()", "Null(_NodeSassMap*,int*,Object*)", "~(Module<AsyncCallable*>*)", "AsyncCallable0*(Module0<AsyncCallable0*>*)", "int(@,@)", "Module0<AsyncCallable0*>*(Module0<AsyncCallable0*>*)", "Iterable<String*>*()", "Iterable<String*>*(String*)", "Iterable<String*>*(@)", "DateTime*()", "~(String*[~])", "SassNumber0*()", "Uri*/*()", "Future<Null>*(List<Value0*>*)", "Object*(_NodeSassMap*,int*)", "Null(Object?,Object?)", "bool*(Frame*)", "Trace*()", "~(Uint8List,String,int)", "bool*(Statement*)", "String*(Frame*)", "int*(Frame*)", "Trace*(String*)", "~(Module0<Callable0*>*)", "VariableDeclaration*()", "SassNull0*(int*)", "String*(_NodeSassString*)", "bool*(Import*)", "SassNumber*()", "AtRootRule*(List<Statement*>*,FileSpan*)", "~(Module<Callable*>*)", "Map<String*,Callable0*>*(Module0<Callable0*>*)", "Frame*(Tuple2<String*,AstNode*>*)", "Callable0*(Module0<Callable0*>*)", "Module0<Callable0*>*(Module0<Callable0*>*)", "String(String)", "AtRule*(List<Statement*>*,FileSpan*)", "Null(String*,ConfiguredValue*)", "AtRootRule0*(List<Statement0*>*,FileSpan*)", "Future<SassNumber*>*()", "SelectorList0*(SelectorList0*,SelectorList0*)", "SelectorList0*(Value0*)", "bool*(ModifiableCssParentNode*)", "Object*(@)", "Entry*(Entry*)", "List<int*>*(int*)", "String(int)", "List<Extender*>*()", "num*(num*,String*)", "SassFunction*(List<Value*>*)", "~(@)", "Stylesheet0*()", "Map<String*,AsyncCallable0*>*(Module0<AsyncCallable0*>*)", "Future<EvaluateResult*>*()", "Future<Value*>*(List<Value*>*)", "~(String,int)", "SassScriptException*()", "~(String[@])", "Null(Uri*,StylesheetNode*)", "DateTime*(StylesheetNode*)", "int(int,int)", "Future<Value*>*(Value*)", "~(BinaryOperator*)", "~(Expression*{number:bool*})", "WhileRule*(List<Statement*>*,FileSpan*)", "SupportsRule*(List<Statement*>*,FileSpan*)", "MixinRule*(List<Statement*>*,FileSpan*)", "Future<Value*>*(Expression*)", "MediaRule*(List<Statement*>*,FileSpan*)", "Uint8List(int)", "ContentBlock*(List<Statement*>*,FileSpan*)", "ForRule*(List<Statement*>*,FileSpan*)", "FunctionRule*(List<Statement*>*,FileSpan*)", "EachRule*(List<Statement*>*,FileSpan*)", "EvaluateResult*()", "Uint8List(@,@)", "SassString*(SimpleSelector*)", "StyleRule*(List<Statement*>*,FileSpan*)", "Null(Symbol0,@)", "Value*(Expression*)", "~(CssMediaQuery*)", "UseRule*()", "SourceFile*(int*)", "String*(SourceFile*)", "@(String*,@)", "FileSpan*(int*[int*])", "int*(_Line*)", "ArgumentDeclaration*()", "Uri*(_Line*)", "int*(_Highlight*,_Highlight*)", "List<_Line*>*(List<_Highlight*>*)", "SourceSpanWithContext*()", "String*(String*{color:@})", "VariableDeclaration*(VariableDeclaration*)", "List<Frame*>*(Trace*)", "int*(Trace*)", "NumberExpression*()", "String*(Trace*)", "Expression*({bracketList:bool*,singleEquals:bool*,until:bool*()*})", "Statement*({root:bool*})", "Frame*(String*,String*)", "CompoundSelector*()", "bool*(Option*)", "Set<0^>()<Object?>", "Frame*(Frame*)", "Future<~>*()", "String*(Argument0*)", "String*(BuiltInCallable*)", "~(String*)", "List<Module0<AsyncCallable0*>*>*(int*)", "Value0*(Module0<AsyncCallable0*>*)", "Set<0^>()<Object?>", "Null(String*)", "Map<String*,Value0*>*(Module0<AsyncCallable0*>*)", "Map<String*,AstNode0*>*(Module0<AsyncCallable0*>*)", "Set<0^>()<Object?>", "Uri*(Tuple3<Importer*,Uri*,Uri*>*)", "Null(String*,Option*)", "bool*(Tuple3<Importer*,Uri*,Uri*>*)", "bool(@)", "~(@,StackTrace)", "SassNumber*(Value*)", "Future<@>()", "SassMap*(SassMap*[Value*])", "Future<EvaluateResult0*>*()", "SassMap*(Value*)", "~(Object[StackTrace?])", "bool*(List<Value*>*)", "List<Value*>*(Value*)", "String*(Value*)", "Null(~())", "Future<Value0*>*(Value0*)", "_Future<@>(@)", "~(@[StackTrace*])", "Null(Object,StackTrace)", "~([Object?])", "@(String)", "StackTrace()", "Object()", "bool*(Future<~>*)", "Future<Value0*>*(Expression0*)", "Iterable<ComplexSelectorComponent*>*(Iterable<ComplexSelectorComponent*>*)", "List<ComplexSelectorComponent*>*(List<Iterable<ComplexSelectorComponent*>*>*)", "bool*(List<Iterable<ComplexSelectorComponent*>*>*)", "Future<Tuple3<AsyncImporter0*,Uri*,Uri*>*>*()", "Future<Stylesheet0*>*()", "bool*(Tuple3<AsyncImporter0*,Uri*,Uri*>*)", "Uri*(Tuple3<AsyncImporter0*,Uri*,Uri*>*)", "bool*(Queue<List<ComplexSelectorComponent*>*>*)", "List<ComplexSelectorComponent*>*(List<ComplexSelectorComponent*>*,List<ComplexSelectorComponent*>*)", "Null(String,@)", "Null(SimpleSelector*,Set<ModifiableCssValue<SelectorList*>*>*)", "@(@,String)", "Null(Function*,Function*)", "PseudoSelector*(ComplexSelector*)", "String*(Value0*)", "Object*(Value0*)", "List<ComplexSelector*>*(ComplexSelector*)", "num*(_NodeSassColor*)", "List<Extension*>*(PseudoSelector*)", "String*(_NodeSassColor*)", "List<Extension*>*(SimpleSelector*)", "String*(BuiltInCallable0*)", "List<ComplexSelector*>*(List<ComplexSelector*>*)", "List<Module0<Callable0*>*>*(int*)", "Value0*(Module0<Callable0*>*)", "bool*(List<ComplexSelector*>*)", "List<SimpleSelector*>*(Extension*)", "Map<String*,Value0*>*(Module0<Callable0*>*)", "Map<String*,AstNode0*>*(Module0<Callable0*>*)", "List<ComplexSelector*>*(List<Extension*>*)", "ComplexSelector*(Extension*)", "List<ComplexSelectorComponent*>*(ComplexSelector*)", "Iterable<ComplexSelector*>*(List<ComplexSelector*>*)", "EvaluateResult0*()", "List<ComplexSelector*>*(ComplexSelectorComponent*)", "Extension*()", "Null(ComplexSelector*,Extension*)", "Null(SimpleSelector*,Map<ComplexSelector*,Extension*>*)", "Value0*(Expression0*)", "bool*(Extension0*)", "Set<ModifiableCssValue0<SelectorList0*>*>*()", "Set<ModifiableCssValue<SelectorList*>*>*()", "bool*(Extension*)", "Null(SimpleSelector0*,Map<ComplexSelector0*,Extension0*>*)", "Null(ComplexSelector0*,Extension0*)", "Extension0*()", "WatchEvent*(String*)", "List<ComplexSelector0*>*(ComplexSelectorComponent0*)", "Iterable<ComplexSelector0*>*(List<ComplexSelector0*>*)", "List<ComplexSelectorComponent0*>*(ComplexSelector0*)", "Iterable<WatchEvent*>*(List<WatchEvent*>*)", "ComplexSelector0*(Extension0*)", "List<ComplexSelector0*>*(List<Extension0*>*)", "List<SimpleSelector0*>*(Extension0*)", "bool*(List<ComplexSelector0*>*)", "List<ComplexSelector0*>*(List<ComplexSelector0*>*)", "List<Extension0*>*(SimpleSelector0*)", "List<Extension0*>*(PseudoSelector0*)", "List<ComplexSelector0*>*(ComplexSelector0*)", "PseudoSelector0*(ComplexSelector0*)", "Null(SimpleSelector0*,Set<ModifiableCssValue0<SelectorList0*>*>*)", "Future<~>*(String*)", "List<ComplexSelectorComponent0*>*(List<ComplexSelectorComponent0*>*,List<ComplexSelectorComponent0*>*)", "bool*(Queue<List<ComplexSelectorComponent0*>*>*)", "ArgParser*()", "bool*(List<Iterable<ComplexSelectorComponent0*>*>*)", "List<ComplexSelectorComponent0*>*(List<Iterable<ComplexSelectorComponent0*>*>*)", "Iterable<ComplexSelectorComponent0*>*(Iterable<ComplexSelectorComponent0*>*)", "bool*(String*,String*)", "String*(IfClause0*)", "Map<String*,AstNode*>*(Module<Callable*>*)", "Map<String*,Value*>*(Module<Callable*>*)", "Tuple3<Importer0*,Uri*,Uri*>*()", "Value*(Module<Callable*>*)", "bool*(Tuple3<Importer0*,Uri*,Uri*>*)", "Uri*(Tuple3<Importer0*,Uri*,Uri*>*)", "String*(Expression0*)", "int*(String*)", "List<Value0*>*(Value0*)", "bool*(List<Value0*>*)", "SassList0*(ComplexSelector0*)", "SassString0*(ComplexSelectorComponent0*)", "List<Module<Callable*>*>*(int*)", "Uri*(Tuple3<AsyncImporter*,Uri*,Uri*>*)", "SimpleSelector0*(SimpleSelector0*)", "Null(_NodeSassList*,int*[bool*,SassList0*])", "bool*(Tuple3<AsyncImporter*,Uri*,Uri*>*)", "Object*(_NodeSassList*,int*)", "Null(_NodeSassList*,int*,Object*)", "bool*(_NodeSassList*)", "Null(_NodeSassList*,bool*)", "int*(_NodeSassList*)", "String*(_NodeSassList*)", "String*(Tuple2<Expression0*,Expression0*>*)", "SassMap0*(Value0*)", "SassMap0*(SassMap0*[Value0*])", "Null(_NodeSassMap*,int*[SassMap0*])", "SassNumber0*(int*)", "Future<Stylesheet*>*()", "int*(_NodeSassMap*)", "Future<Tuple3<AsyncImporter*,Uri*,Uri*>*>*()", "String*(_NodeSassMap*)", "SassNumber0*(Value0*)", "Null(RenderResult*)", "Null(Object*,StackTrace*)", "Null(Object*,Object*)", "Map<String*,AstNode*>*(Module<AsyncCallable*>*)", "~([Object*])", "JSFunction0*(JSFunction0*)", "Object*(Object*,String*,String*[Object*])", "Null(Object*)", "Null(_NodeSassNumber*,num*[String*,SassNumber0*])", "num*(_NodeSassNumber*)", "Null(_NodeSassNumber*,num*)", "Map<String*,Value*>*(Module<AsyncCallable*>*)", "Null(_NodeSassNumber*,String*)", "SassScriptException0*()", "~(String*,StackTrace*)", "@(StackTrace)", "Value*(Module<AsyncCallable*>*)", "List<Module<AsyncCallable*>*>*(int*)", "SassString0*(SimpleSelector0*)", "CompoundSelector0*()", "~(CssMediaQuery0*)", "SimpleSelector*(SimpleSelector*)", "Null(_NodeSassString*,String*[SassString0*])", "SassString*(ComplexSelectorComponent*)", "Null(_NodeSassString*,String*)", "Statement0*({root:bool*})", "Null(@,StackTrace)", "NumberExpression0*()", "VariableDeclaration0*(VariableDeclaration0*)", "ArgumentDeclaration0*()", "Tuple2<String*,ArgumentDeclaration0*>*()", "VariableDeclaration0*()", "SassList*(ComplexSelector*)", "StyleRule0*(List<Statement0*>*,FileSpan*)", "@(Object)", "EachRule0*(List<Statement0*>*,FileSpan*)", "FunctionRule0*(List<Statement0*>*,FileSpan*)", "ForRule0*(List<Statement0*>*,FileSpan*)", "ContentBlock0*(List<Statement0*>*,FileSpan*)", "MediaRule0*(List<Statement0*>*,FileSpan*)", "MixinRule0*(List<Statement0*>*,FileSpan*)", "_Future<@>?()", "SupportsRule0*(List<Statement0*>*,FileSpan*)", "WhileRule0*(List<Statement0*>*,FileSpan*)", "~(Expression0*{number:bool*})", "~(BinaryOperator0*)", "Null(String*,Function*)", "String*(IfClause*)", "Null(int,@)", "~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)", "0^(Zone?,ZoneDelegate?,Zone,0^())<Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)<Object?Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)<Object?Object?Object?>", "0^()(Zone,ZoneDelegate,Zone,0^())<Object?>", "0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?Object?>", "0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?Object?Object?>", "AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)", "~(Zone?,ZoneDelegate?,Zone,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))", "~(Zone,ZoneDelegate,Zone,String)", "~(String)", "Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map<Object?,Object?>?)", "String*(Tuple2<Expression*,Expression*>*)", "String*(Expression*)", "0^(0^,0^)<num>", "~(Object*,StackTrace*,EventSink<0^*>*)<Object*>", "List<0^*>*(0^*,List<0^*>*)<Object*>", "~(RenderOptions*,~(Object*,RenderResult*)*)", "RenderResult*(RenderOptions*)", "Future<~>*(List<String*>*)", "String*(Argument*)", "Null(_NodeSassColor*,num*[num*,num*,num*,SassColor0*])"],
+    interceptorsByTag: null,
+    leafTags: null,
+    arrayRti: typeof Symbol == "function" && typeof Symbol() == "symbol" ? Symbol("$ti") : "$ti"
+  };
+  H._Universe_addRules(init.typeUniverse, JSON.parse('{"_Exports":"JavaScriptObject","Util":"JavaScriptObject","NodeJsError":"JavaScriptObject","JsAssertionError":"JavaScriptObject","JsRangeError":"JavaScriptObject","JsReferenceError":"JavaScriptObject","JsSyntaxError":"JavaScriptObject","JsTypeError":"JavaScriptObject","JsSystemError":"JavaScriptObject","JsError":"JavaScriptObject","Promise":"JavaScriptObject","Date":"JavaScriptObject","Atomics":"JavaScriptObject","Exports":"JavaScriptObject","JSFunction0":"JavaScriptObject","RenderContext":"JavaScriptObject","RenderContextOptions":"JavaScriptObject","RenderOptions":"JavaScriptObject","RenderResult":"JavaScriptObject","RenderResultStats":"JavaScriptObject","Types":"JavaScriptObject","_PropertyDescriptor0":"JavaScriptObject","ConsoleModule":"JavaScriptObject","Console":"JavaScriptObject","Modules":"JavaScriptObject","Module1":"JavaScriptObject","Process":"JavaScriptObject","EventEmitter":"JavaScriptObject","Readable":"JavaScriptObject","Writable":"JavaScriptObject","NetServer":"JavaScriptObject","FSWatcher":"JavaScriptObject","Duplex":"JavaScriptObject","ReadStream":"JavaScriptObject","WriteStream":"JavaScriptObject","Transform":"JavaScriptObject","Socket":"JavaScriptObject","TTYReadStream":"JavaScriptObject","TTYWriteStream":"JavaScriptObject","CPUUsage":"JavaScriptObject","Release":"JavaScriptObject","BufferModule":"JavaScriptObject","BufferConstants":"JavaScriptObject","Buffer":"JavaScriptObject","Immediate":"JavaScriptObject","Timeout":"JavaScriptObject","FiberClass":"JavaScriptObject","Fiber":"JavaScriptObject","_NodeSassColor":"JavaScriptObject","_NodeSassList":"JavaScriptObject","_NodeSassMap":"JavaScriptObject","_NodeSassNumber":"JavaScriptObject","_NodeSassString":"JavaScriptObject","StreamModule":"JavaScriptObject","WritableOptions":"JavaScriptObject","ReadableOptions":"JavaScriptObject","Net":"JavaScriptObject","NetAddress":"JavaScriptObject","TTY":"JavaScriptObject","FS":"JavaScriptObject","FSConstants":"JavaScriptObject","ReadStreamOptions":"JavaScriptObject","WriteStreamOptions":"JavaScriptObject","Stats":"JavaScriptObject","Chokidar":"JavaScriptObject","ChokidarOptions":"JavaScriptObject","ChokidarWatcher":"JavaScriptObject","Chokidar0":"JavaScriptObject","ChokidarOptions0":"JavaScriptObject","ChokidarWatcher0":"JavaScriptObject","NodeImporterResult0":"JavaScriptObject","Stdin":"JavaScriptObject","Stdout":"JavaScriptObject","ReadlineModule":"JavaScriptObject","ReadlineOptions":"JavaScriptObject","ReadlineInterface":"JavaScriptObject","JSFunction":"JavaScriptObject","NodeImporterResult":"JavaScriptObject","_PropertyDescriptor":"JavaScriptObject","PlainJavaScriptObject":"JavaScriptObject","UnknownJavaScriptObject":"JavaScriptObject","JavaScriptFunction":"JavaScriptObject","JSBool":{"bool":[]},"JSNull":{"Null":[]},"JavaScriptObject":{"Function":[],"JsSystemError":[],"_NodeSassColor":[],"JSFunction0":[],"NodeImporterResult0":[],"_NodeSassList":[],"_NodeSassMap":[],"_NodeSassNumber":[],"RenderOptions":[],"RenderResult":[],"_NodeSassString":[]},"JSArray":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"]},"JSDouble":{"double":[],"num":[],"Comparable":["num"]},"JSString":{"String":[],"Comparable":["String"]},"_CastIterableBase":{"Iterable":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListMixin":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListMixin":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2","ListMixin.E":"2"},"CastSet":{"Set":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"CastQueue":{"Queue":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"LateInitializationErrorImpl":{"Error":[]},"CodeUnits":{"ListMixin":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListMixin.E":"int"},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListIterable.E":"2","Iterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"ExpandIterable":{"Iterable":["2"],"Iterable.E":"2"},"TakeIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthTakeIterable":{"TakeIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipWhileIterable":{"Iterable":["1"],"Iterable.E":"1"},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"FollowedByIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthFollowedByIterable":{"FollowedByIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"WhereTypeIterable":{"Iterable":["1"],"Iterable.E":"1"},"UnmodifiableListBase":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"Symbol":{"Symbol0":[]},"ConstantMapView":{"UnmodifiableMapView":["1","2"],"Map":["1","2"]},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"ConstantProtoMap":{"ConstantStringMap":["1","2"],"ConstantMap":["1","2"],"Map":["1","2"]},"_ConstantMapKeyIterable":{"Iterable":["1"],"Iterable.E":"1"},"Instantiation":{"Function":[]},"Instantiation1":{"Function":[]},"NullError":{"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"NullThrownFromJavaScriptException":{"Exception":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"RuntimeError":{"Error":[]},"JsLinkedHashMap":{"MapMixin":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"LinkedHashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"]},"NativeTypedArrayOfDouble":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"NativeTypedArrayOfInt":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"NativeFloat32List":{"NativeTypedArrayOfDouble":[],"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"ListMixin.E":"double"},"NativeFloat64List":{"NativeTypedArrayOfDouble":[],"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"ListMixin.E":"double"},"NativeInt16List":{"NativeTypedArrayOfInt":[],"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListMixin.E":"int"},"NativeInt32List":{"NativeTypedArrayOfInt":[],"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListMixin.E":"int"},"NativeInt8List":{"NativeTypedArrayOfInt":[],"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListMixin.E":"int"},"NativeUint16List":{"NativeTypedArrayOfInt":[],"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListMixin.E":"int"},"NativeUint32List":{"NativeTypedArrayOfInt":[],"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListMixin.E":"int"},"NativeUint8ClampedList":{"NativeTypedArrayOfInt":[],"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListMixin.E":"int"},"NativeUint8List":{"NativeTypedArrayOfInt":[],"ListMixin":["int"],"Uint8List":[],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListMixin.E":"int"},"_Error":{"Error":[]},"_TypeError":{"Error":[]},"_SyncStarIterable":{"Iterable":["1"],"Iterable.E":"1"},"_BroadcastStream":{"_ControllerStream":["1"],"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_BroadcastSubscription":{"_ControllerSubscription":["1"],"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_BufferingStreamSubscription.T":"1"},"_BroadcastStreamController":{"EventSink":["1"]},"_SyncBroadcastStreamController":{"_BroadcastStreamController":["1"],"EventSink":["1"]},"_AsyncCompleter":{"_Completer":["1"]},"_Future":{"Future":["1"]},"_StreamController":{"EventSink":["1"]},"_AsyncStreamController":{"_StreamController":["1"],"EventSink":["1"]},"_SyncStreamController":{"_StreamController":["1"],"EventSink":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_BufferingStreamSubscription.T":"1"},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DoneStreamSubscription":{"StreamSubscription":["1"]},"_ForwardingStream":{"Stream":["2"]},"_ForwardingStreamSubscription":{"_BufferingStreamSubscription":["2"],"StreamSubscription":["2"],"_BufferingStreamSubscription.T":"2"},"_ExpandStream":{"_ForwardingStream":["1","2"],"Stream":["2"],"Stream.T":"2"},"AsyncError":{"Error":[]},"_ZoneSpecification":{"ZoneSpecification":[]},"_ZoneDelegate":{"ZoneDelegate":[]},"_Zone":{"Zone":[]},"_CustomZone":{"Zone":[]},"_RootZone":{"Zone":[]},"Queue":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"_HashMap":{"MapMixin":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_LinkedIdentityHashMap":{"JsLinkedHashMap":["1","2"],"MapMixin":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_LinkedCustomHashMap":{"JsLinkedHashMap":["1","2"],"MapMixin":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_LinkedHashSet":{"_SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_LinkedIdentityHashSet":{"_LinkedHashSet":["1"],"_SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"UnmodifiableListView":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListMixin.E":"1"},"IterableBase":{"Iterable":["1"]},"ListBase":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"MapMixin":["1","2"],"Map":["1","2"]},"MapMixin":{"Map":["1","2"]},"UnmodifiableMapBase":{"MapMixin":["1","2"],"Map":["1","2"]},"_MapBaseValueIterable":{"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"Map":["1","2"]},"ListQueue":{"ListIterable":["1"],"Queue":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_SetBase":{"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_UnmodifiableSet":{"_SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"AsciiCodec":{"Codec":["String","List<int>"]},"_UnicodeSubsetEncoder":{"Converter":["String","List<int>"]},"AsciiEncoder":{"Converter":["String","List<int>"]},"Base64Codec":{"Codec":["List<int>","String"]},"Base64Encoder":{"Converter":["List<int>","String"]},"Encoding":{"Codec":["String","List<int>"]},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"]},"JsonEncoder":{"Converter":["Object?","String"]},"StringConversionSinkBase":{"StringConversionSink":[]},"StringConversionSinkMixin":{"StringConversionSink":[]},"_StringSinkConversionSink":{"StringConversionSink":[]},"_StringCallbackSink":{"StringConversionSink":[]},"_StringAdapterSink":{"StringConversionSink":[]},"Utf8Codec":{"Codec":["String","List<int>"]},"Utf8Encoder":{"Converter":["String","List<int>"]},"Utf8Decoder":{"Converter":["List<int>","String"]},"double":{"num":[],"Comparable":["num"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExpMatch":{"Match":[]},"Set":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Comparable":["String"]},"DateTime":{"Comparable":["DateTime"]},"Duration":{"Comparable":["Duration"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"NullThrownError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"RangeError":[],"Error":[]},"NoSuchMethodError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"CyclicInitializationError":{"Error":[]},"_Exception":{"Exception":[]},"FormatException":{"Exception":[]},"_GeneratorIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_StringStackTrace":{"StackTrace":[]},"Runes":{"Iterable":["int"],"Iterable.E":"int"},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"ArgParserException":{"FormatException":[],"Exception":[]},"ErrorResult":{"Result":["Null"]},"ValueResult":{"Result":["1*"]},"_CompleterStream":{"Stream":["1*"],"Stream.T":"1*"},"_NextRequest":{"_EventRequest":["1*"]},"EmptyUnmodifiableSet":{"Set":["1*"],"EfficientLengthIterable":["1*"],"Iterable":["1*"],"Iterable.E":"1*"},"QueueList":{"ListMixin":["1*"],"List":["1*"],"Queue":["1*"],"EfficientLengthIterable":["1*"],"Iterable":["1*"],"ListMixin.E":"1*","QueueList.E":"1"},"_CastQueueList":{"QueueList":["2*"],"ListMixin":["2*"],"List":["2*"],"Queue":["2*"],"EfficientLengthIterable":["2*"],"Iterable":["2*"],"ListMixin.E":"2*","QueueList.E":"2*"},"UnmodifiableSetView":{"DelegatingSet":["1*"],"Set":["1*"],"EfficientLengthIterable":["1*"],"Iterable":["1*"],"DelegatingSet.E":"1*"},"_DelegatingIterableBase":{"Iterable":["1*"]},"DelegatingIterable":{"Iterable":["1*"]},"DelegatingSet":{"Set":["1*"],"EfficientLengthIterable":["1*"],"Iterable":["1*"],"DelegatingSet.E":"1"},"MapKeySet":{"Set":["1*"],"EfficientLengthIterable":["1*"],"Iterable":["1*"]},"PathException":{"Exception":[]},"PathMap":{"Map":["String*","1*"]},"ModifiableCssAtRule":{"ModifiableCssParentNode":[],"CssAtRule":[],"ModifiableCssNode":[],"CssParentNode":[],"CssNode":[],"AstNode":[]},"ModifiableCssComment":{"ModifiableCssNode":[],"CssComment":[],"CssNode":[],"AstNode":[]},"ModifiableCssDeclaration":{"ModifiableCssNode":[],"CssNode":[],"AstNode":[]},"ModifiableCssImport":{"ModifiableCssNode":[],"CssImport":[],"CssNode":[],"AstNode":[]},"ModifiableCssKeyframeBlock":{"ModifiableCssParentNode":[],"ModifiableCssNode":[],"CssParentNode":[],"CssNode":[],"AstNode":[]},"ModifiableCssMediaRule":{"ModifiableCssParentNode":[],"CssMediaRule":[],"ModifiableCssNode":[],"CssParentNode":[],"CssNode":[],"AstNode":[]},"ModifiableCssNode":{"CssNode":[],"AstNode":[]},"ModifiableCssParentNode":{"ModifiableCssNode":[],"CssParentNode":[],"CssNode":[],"AstNode":[]},"ModifiableCssStyleRule":{"ModifiableCssParentNode":[],"CssStyleRule":[],"ModifiableCssNode":[],"CssParentNode":[],"CssNode":[],"AstNode":[]},"ModifiableCssStylesheet":{"ModifiableCssParentNode":[],"CssStylesheet":[],"ModifiableCssNode":[],"CssParentNode":[],"CssNode":[],"AstNode":[]},"ModifiableCssSupportsRule":{"ModifiableCssParentNode":[],"CssSupportsRule":[],"ModifiableCssNode":[],"CssParentNode":[],"CssNode":[],"AstNode":[]},"ModifiableCssValue":{"CssValue":["1*"],"AstNode":[]},"CssNode":{"AstNode":[]},"CssParentNode":{"CssNode":[],"AstNode":[]},"CssStylesheet":{"CssParentNode":[],"CssNode":[],"AstNode":[]},"CssValue":{"AstNode":[]},"_FakeAstNode":{"AstNode":[]},"Argument":{"AstNode":[]},"ArgumentDeclaration":{"AstNode":[]},"ArgumentInvocation":{"AstNode":[]},"ConfiguredVariable":{"AstNode":[]},"BinaryOperationExpression":{"Expression":[],"AstNode":[]},"BooleanExpression":{"Expression":[],"AstNode":[]},"ColorExpression":{"Expression":[],"AstNode":[]},"FunctionExpression":{"Expression":[],"AstNode":[]},"IfExpression":{"Expression":[],"AstNode":[]},"ListExpression":{"Expression":[],"AstNode":[]},"MapExpression":{"Expression":[],"AstNode":[]},"NullExpression":{"Expression":[],"AstNode":[]},"NumberExpression":{"Expression":[],"AstNode":[]},"ParenthesizedExpression":{"Expression":[],"AstNode":[]},"SelectorExpression":{"Expression":[],"AstNode":[]},"StringExpression":{"Expression":[],"AstNode":[]},"UnaryOperationExpression":{"Expression":[],"AstNode":[]},"ValueExpression":{"Expression":[],"AstNode":[]},"VariableExpression":{"Expression":[],"AstNode":[]},"DynamicImport":{"Import":[],"AstNode":[]},"StaticImport":{"Import":[],"AstNode":[]},"Interpolation":{"AstNode":[]},"AtRootRule":{"Statement":[],"AstNode":[]},"AtRule":{"Statement":[],"AstNode":[]},"CallableDeclaration":{"Statement":[],"AstNode":[]},"ContentBlock":{"Statement":[],"AstNode":[]},"ContentRule":{"Statement":[],"AstNode":[]},"DebugRule":{"Statement":[],"AstNode":[]},"Declaration":{"Statement":[],"AstNode":[]},"EachRule":{"Statement":[],"AstNode":[]},"ErrorRule":{"Statement":[],"AstNode":[]},"ExtendRule":{"Statement":[],"AstNode":[]},"ForRule":{"Statement":[],"AstNode":[]},"ForwardRule":{"Statement":[],"AstNode":[]},"FunctionRule":{"Statement":[],"AstNode":[]},"IfRule":{"Statement":[],"AstNode":[]},"ImportRule":{"Statement":[],"AstNode":[]},"IncludeRule":{"Statement":[],"AstNode":[]},"LoudComment":{"Statement":[],"AstNode":[]},"MediaRule":{"Statement":[],"AstNode":[]},"MixinRule":{"Statement":[],"AstNode":[]},"ParentStatement":{"Statement":[],"AstNode":[]},"ReturnRule":{"Statement":[],"AstNode":[]},"SilentComment":{"Statement":[],"AstNode":[]},"StyleRule":{"Statement":[],"AstNode":[]},"Stylesheet":{"Statement":[],"AstNode":[]},"SupportsRule":{"Statement":[],"AstNode":[]},"UseRule":{"Statement":[],"AstNode":[]},"VariableDeclaration":{"Statement":[],"AstNode":[]},"WarnRule":{"Statement":[],"AstNode":[]},"WhileRule":{"Statement":[],"AstNode":[]},"SupportsAnything":{"AstNode":[]},"SupportsDeclaration":{"AstNode":[]},"SupportsFunction":{"AstNode":[]},"SupportsInterpolation":{"AstNode":[]},"SupportsNegation":{"AstNode":[]},"SupportsOperation":{"AstNode":[]},"AttributeSelector":{"SimpleSelector":[]},"ClassSelector":{"SimpleSelector":[]},"Combinator":{"ComplexSelectorComponent":[]},"CompoundSelector":{"ComplexSelectorComponent":[]},"IDSelector":{"SimpleSelector":[]},"ParentSelector":{"SimpleSelector":[]},"PlaceholderSelector":{"SimpleSelector":[]},"PseudoSelector":{"SimpleSelector":[]},"TypeSelector":{"SimpleSelector":[]},"UniversalSelector":{"SimpleSelector":[]},"_EnvironmentModule0":{"Module":["AsyncCallable*"]},"AsyncBuiltInCallable":{"AsyncCallable":[]},"BuiltInCallable":{"Callable":[],"AsyncBuiltInCallable":[],"AsyncCallable":[]},"PlainCssCallable":{"Callable":[],"AsyncCallable":[]},"UserDefinedCallable":{"Callable":[],"AsyncCallable":[]},"_EnvironmentModule":{"Module":["Callable*"]},"SassException":{"Exception":[]},"MultiSpanSassException":{"Exception":[]},"SassRuntimeException":{"Exception":[]},"MultiSpanSassRuntimeException":{"SassRuntimeException":[],"Exception":[]},"SassFormatException":{"SourceSpanFormatException":[],"FormatException":[],"Exception":[]},"UsageException":{"Exception":[]},"EmptyExtender":{"Extender":[]},"MergedExtension":{"Extension":[]},"Importer":{"AsyncImporter":[]},"FilesystemImporter":{"Importer":[],"AsyncImporter":[]},"BuiltInModule":{"Module":["1*"]},"ForwardedModuleView":{"Module":["1*"]},"ShadowedModuleView":{"Module":["1*"]},"LimitedMapView":{"MapMixin":["1*","2*"],"Map":["1*","2*"],"MapMixin.K":"1*","MapMixin.V":"2*"},"MergedMapView":{"MapMixin":["1*","2*"],"Map":["1*","2*"],"MapMixin.K":"1*","MapMixin.V":"2*"},"NoSourceMapBuffer0":{"StringBuffer":[]},"PrefixedMapView":{"MapMixin":["String*","1*"],"Map":["String*","1*"],"MapMixin.K":"String*","MapMixin.V":"1*"},"_PrefixedKeys":{"Iterable":["String*"],"Iterable.E":"String*"},"PublicMemberMapView":{"MapMixin":["String*","1*"],"Map":["String*","1*"],"MapMixin.K":"String*","MapMixin.V":"1*"},"SourceMapBuffer0":{"StringBuffer":[]},"UnprefixedMapView":{"MapMixin":["String*","1*"],"Map":["String*","1*"],"MapMixin.K":"String*","MapMixin.V":"1*"},"_UnprefixedKeys":{"Iterable":["String*"],"Iterable.E":"String*"},"SassArgumentList":{"SassList":[],"Value":[]},"SassBoolean":{"Value":[]},"SassColor":{"Value":[]},"SassFunction":{"Value":[]},"SassList":{"Value":[]},"SassMap":{"Value":[]},"SassNull":{"Value":[]},"SassNumber":{"Value":[]},"ComplexSassNumber":{"SassNumber":[],"Value":[]},"SingleUnitSassNumber":{"SassNumber":[],"Value":[]},"UnitlessSassNumber":{"SassNumber":[],"Value":[]},"SassString":{"Value":[]},"Entry":{"Comparable":["Entry*"]},"FileSpan":{"SourceSpanWithContext":[],"SourceSpan":[],"Comparable":["SourceSpan*"]},"FileLocation":{"SourceLocation":[],"Comparable":["SourceLocation*"]},"_FileSpan":{"FileSpan":[],"SourceSpanWithContext":[],"SourceSpan":[],"Comparable":["SourceSpan*"]},"SourceLocation":{"Comparable":["SourceLocation*"]},"SourceLocationMixin":{"SourceLocation":[],"Comparable":["SourceLocation*"]},"SourceSpan":{"Comparable":["SourceSpan*"]},"SourceSpanBase":{"SourceSpan":[],"Comparable":["SourceSpan*"]},"SourceSpanException":{"Exception":[]},"SourceSpanFormatException":{"FormatException":[],"Exception":[]},"SourceSpanMixin":{"SourceSpan":[],"Comparable":["SourceSpan*"]},"SourceSpanWithContext":{"SourceSpan":[],"Comparable":["SourceSpan*"]},"Chain":{"StackTrace":[]},"LazyTrace":{"Trace":[],"StackTrace":[]},"Trace":{"StackTrace":[]},"UnparsedFrame":{"Frame":[]},"StringScannerException":{"SourceSpanFormatException":[],"FormatException":[],"Exception":[]},"SupportsAnything0":{"AstNode0":[]},"Argument0":{"AstNode0":[]},"ArgumentDeclaration0":{"AstNode0":[]},"ArgumentInvocation0":{"AstNode0":[]},"SassArgumentList0":{"SassList0":[],"Value0":[]},"AsyncBuiltInCallable0":{"AsyncCallable0":[]},"_EnvironmentModule2":{"Module0":["AsyncCallable0*"]},"AtRootRule0":{"Statement0":[],"AstNode0":[]},"ModifiableCssAtRule0":{"ModifiableCssParentNode0":[],"CssAtRule0":[],"ModifiableCssNode0":[],"CssParentNode0":[],"CssNode0":[],"AstNode0":[]},"AtRule0":{"Statement0":[],"AstNode0":[]},"AttributeSelector0":{"SimpleSelector0":[]},"BinaryOperationExpression0":{"Expression0":[],"AstNode0":[]},"BooleanExpression0":{"Expression0":[],"AstNode0":[]},"SassBoolean0":{"Value0":[]},"BuiltInCallable0":{"Callable0":[],"AsyncBuiltInCallable0":[],"AsyncCallable0":[]},"BuiltInModule0":{"Module0":["1*"]},"CallableDeclaration0":{"Statement0":[],"AstNode0":[]},"ClassSelector0":{"SimpleSelector0":[]},"ColorExpression0":{"Expression0":[],"AstNode0":[]},"SassColor0":{"Value0":[]},"ModifiableCssComment0":{"ModifiableCssNode0":[],"CssComment0":[],"CssNode0":[],"AstNode0":[]},"ComplexSassNumber0":{"SassNumber0":[],"Value0":[]},"Combinator0":{"ComplexSelectorComponent0":[]},"CompoundSelector0":{"ComplexSelectorComponent0":[]},"ConfiguredVariable0":{"AstNode0":[]},"ContentBlock0":{"Statement0":[],"AstNode0":[]},"ContentRule0":{"Statement0":[],"AstNode0":[]},"DebugRule0":{"Statement0":[],"AstNode0":[]},"ModifiableCssDeclaration0":{"ModifiableCssNode0":[],"CssNode0":[],"AstNode0":[]},"Declaration0":{"Statement0":[],"AstNode0":[]},"SupportsDeclaration0":{"AstNode0":[]},"DynamicImport0":{"Import0":[],"AstNode0":[]},"EachRule0":{"Statement0":[],"AstNode0":[]},"EmptyExtender0":{"Extender0":[]},"_EnvironmentModule1":{"Module0":["Callable0*"]},"ErrorRule0":{"Statement0":[],"AstNode0":[]},"SassException0":{"Exception":[]},"MultiSpanSassException0":{"Exception":[]},"SassRuntimeException0":{"Exception":[]},"MultiSpanSassRuntimeException0":{"SassRuntimeException0":[],"Exception":[]},"SassFormatException0":{"SourceSpanFormatException":[],"FormatException":[],"Exception":[]},"ExtendRule0":{"Statement0":[],"AstNode0":[]},"FilesystemImporter0":{"Importer0":[],"AsyncImporter0":[]},"ForRule0":{"Statement0":[],"AstNode0":[]},"ForwardRule0":{"Statement0":[],"AstNode0":[]},"ForwardedModuleView0":{"Module0":["1*"]},"FunctionExpression0":{"Expression0":[],"AstNode0":[]},"SupportsFunction0":{"AstNode0":[]},"SassFunction0":{"Value0":[]},"FunctionRule0":{"Statement0":[],"AstNode0":[]},"IDSelector0":{"SimpleSelector0":[]},"IfExpression0":{"Expression0":[],"AstNode0":[]},"IfRule0":{"Statement0":[],"AstNode0":[]},"ModifiableCssImport0":{"ModifiableCssNode0":[],"CssImport0":[],"CssNode0":[],"AstNode0":[]},"ImportRule0":{"Statement0":[],"AstNode0":[]},"Importer0":{"AsyncImporter0":[]},"IncludeRule0":{"Statement0":[],"AstNode0":[]},"Interpolation0":{"AstNode0":[]},"SupportsInterpolation0":{"AstNode0":[]},"ModifiableCssKeyframeBlock0":{"ModifiableCssParentNode0":[],"ModifiableCssNode0":[],"CssParentNode0":[],"CssNode0":[],"AstNode0":[]},"LimitedMapView0":{"MapMixin":["1*","2*"],"Map":["1*","2*"],"MapMixin.K":"1*","MapMixin.V":"2*"},"ListExpression0":{"Expression0":[],"AstNode0":[]},"SassList0":{"Value0":[]},"LoudComment0":{"Statement0":[],"AstNode0":[]},"MapExpression0":{"Expression0":[],"AstNode0":[]},"SassMap0":{"Value0":[]},"ModifiableCssMediaRule0":{"ModifiableCssParentNode0":[],"CssMediaRule0":[],"ModifiableCssNode0":[],"CssParentNode0":[],"CssNode0":[],"AstNode0":[]},"MediaRule0":{"Statement0":[],"AstNode0":[]},"MergedExtension0":{"Extension0":[]},"MergedMapView0":{"MapMixin":["1*","2*"],"Map":["1*","2*"],"MapMixin.K":"1*","MapMixin.V":"2*"},"MixinRule0":{"Statement0":[],"AstNode0":[]},"SupportsNegation0":{"AstNode0":[]},"NoSourceMapBuffer":{"StringBuffer":[]},"_FakeAstNode0":{"AstNode0":[]},"CssNode0":{"AstNode0":[]},"CssParentNode0":{"CssNode0":[],"AstNode0":[]},"ModifiableCssNode0":{"CssNode0":[],"AstNode0":[]},"ModifiableCssParentNode0":{"ModifiableCssNode0":[],"CssParentNode0":[],"CssNode0":[],"AstNode0":[]},"NullExpression0":{"Expression0":[],"AstNode0":[]},"SassNull0":{"Value0":[]},"NumberExpression0":{"Expression0":[],"AstNode0":[]},"SassNumber0":{"Value0":[]},"SupportsOperation0":{"AstNode0":[]},"ParentSelector0":{"SimpleSelector0":[]},"ParentStatement0":{"Statement0":[],"AstNode0":[]},"ParenthesizedExpression0":{"Expression0":[],"AstNode0":[]},"PlaceholderSelector0":{"SimpleSelector0":[]},"PlainCssCallable0":{"Callable0":[],"AsyncCallable0":[]},"PrefixedMapView0":{"MapMixin":["String*","1*"],"Map":["String*","1*"],"MapMixin.K":"String*","MapMixin.V":"1*"},"_PrefixedKeys0":{"Iterable":["String*"],"Iterable.E":"String*"},"PseudoSelector0":{"SimpleSelector0":[]},"PublicMemberMapView0":{"MapMixin":["String*","1*"],"Map":["String*","1*"],"MapMixin.K":"String*","MapMixin.V":"1*"},"ReturnRule0":{"Statement0":[],"AstNode0":[]},"SelectorExpression0":{"Expression0":[],"AstNode0":[]},"ShadowedModuleView0":{"Module0":["1*"]},"SilentComment0":{"Statement0":[],"AstNode0":[]},"SingleUnitSassNumber0":{"SassNumber0":[],"Value0":[]},"SourceMapBuffer":{"StringBuffer":[]},"StaticImport0":{"Import0":[],"AstNode0":[]},"StringExpression0":{"Expression0":[],"AstNode0":[]},"SassString0":{"Value0":[]},"ModifiableCssStyleRule0":{"ModifiableCssParentNode0":[],"CssStyleRule0":[],"ModifiableCssNode0":[],"CssParentNode0":[],"CssNode0":[],"AstNode0":[]},"StyleRule0":{"Statement0":[],"AstNode0":[]},"CssStylesheet0":{"CssParentNode0":[],"CssNode0":[],"AstNode0":[]},"ModifiableCssStylesheet0":{"ModifiableCssParentNode0":[],"CssStylesheet0":[],"ModifiableCssNode0":[],"CssParentNode0":[],"CssNode0":[],"AstNode0":[]},"Stylesheet0":{"Statement0":[],"AstNode0":[]},"ModifiableCssSupportsRule0":{"ModifiableCssParentNode0":[],"CssSupportsRule0":[],"ModifiableCssNode0":[],"CssParentNode0":[],"CssNode0":[],"AstNode0":[]},"SupportsRule0":{"Statement0":[],"AstNode0":[]},"TypeSelector0":{"SimpleSelector0":[]},"UnaryOperationExpression0":{"Expression0":[],"AstNode0":[]},"UnitlessSassNumber0":{"SassNumber0":[],"Value0":[]},"UniversalSelector0":{"SimpleSelector0":[]},"UnprefixedMapView0":{"MapMixin":["String*","1*"],"Map":["String*","1*"],"MapMixin.K":"String*","MapMixin.V":"1*"},"_UnprefixedKeys0":{"Iterable":["String*"],"Iterable.E":"String*"},"UseRule0":{"Statement0":[],"AstNode0":[]},"UserDefinedCallable0":{"Callable0":[],"AsyncCallable0":[]},"CssValue0":{"AstNode0":[]},"ValueExpression0":{"Expression0":[],"AstNode0":[]},"ModifiableCssValue0":{"CssValue0":["1*"],"AstNode0":[]},"VariableExpression0":{"Expression0":[],"AstNode0":[]},"VariableDeclaration0":{"Statement0":[],"AstNode0":[]},"WarnRule0":{"Statement0":[],"AstNode0":[]},"WhileRule0":{"Statement0":[],"AstNode0":[]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Expression":{"AstNode":[]},"Import":{"AstNode":[]},"SassNode":{"AstNode":[]},"Statement":{"AstNode":[]},"SupportsCondition":{"AstNode":[]},"Callable":{"AsyncCallable":[]},"Callable0":{"AsyncCallable0":[]},"Expression0":{"AstNode0":[]},"Import0":{"AstNode0":[]},"SassNode0":{"AstNode0":[]},"Statement0":{"AstNode0":[]},"SupportsCondition0":{"AstNode0":[]}}'));
+  H._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"ArrayIterator":1,"ListIterator":1,"MappedIterator":2,"WhereIterator":1,"ExpandIterator":2,"TakeIterator":1,"SkipIterator":1,"SkipWhileIterator":1,"EmptyIterator":1,"FollowedByIterator":1,"FixedLengthListMixin":1,"UnmodifiableListMixin":1,"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"LinkedHashMapKeyIterator":1,"NativeTypedArray":1,"EventSink":1,"_SyncStarIterator":1,"StreamTransformerBase":2,"_SyncStreamControllerDispatch":1,"_AsyncStreamControllerDispatch":1,"_AddStreamState":1,"_StreamControllerAddStreamState":1,"_DelayedEvent":1,"_DelayedData":1,"_PendingEvents":1,"_StreamImplEvents":1,"_StreamIterator":1,"_ZoneFunction":1,"Queue":1,"_HashMapKeyIterator":1,"_LinkedHashSetIterator":1,"IterableBase":1,"ListBase":1,"MapBase":2,"UnmodifiableMapBase":2,"_MapBaseValueIterator":2,"_UnmodifiableMapMixin":2,"MapView":2,"_ListQueueIterator":1,"_ListBase_Object_ListMixin":1,"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":2,"ChunkedConversionSink":1,"_StringSinkConversionSink":1,"Iterator":1,"_EventRequest":1,"DefaultEquality":1,"IterableEquality":1,"ListEquality":1,"MapEquality":2,"_QueueList_Object_ListMixin":1,"UnmodifiableSetMixin":1,"_UnmodifiableSetView_DelegatingSet_UnmodifiableSetMixin":1,"_DelegatingIterableBase":1,"DelegatingIterable":1,"_MapKeySet__DelegatingIterableBase_UnmodifiableSetMixin":1,"RecursiveStatementVisitor":1}'));
+  var string$ = {
+    x0a_BUG_: "\n\nBUG: This should include a source span!",
+    x0aYou_m: "\nYou may not @extend the same selector from within different media queries.",
+    x20in_in: " in interpolation here.\nIt may end up represented as ",
+    x20is_as: " is asynchronous.\nThis is probably caused by a bug in a Sass plugin.",
+    x20is_av: " is available from multiple global modules.",
+    x20is_no: " is not a valid selector: it must be a string,\na list of strings, or a list of lists of strings.",
+    x20must_: " must not be greater than the number of characters in the file, ",
+    x20to_co: " to color.opacity() is deprecated.\n\nRecommendation: ",
+    x20was_a: ' was already loaded, so it can\'t be configured using "with".',
+    x20was_n: " was not declared with !default in the @used module.",
+    x20was_p: " was passed both by position and by name.",
+    x21globa: "!global isn't allowed for variables in other modules.",
+    x22x26__ma: '"&" may only used at the beginning of a compound selector.',
+    x22x29__If: "\").\nIf you really want to use the color value here, use '",
+    x22packa: '"package:" URLs aren\'t supported on this platform.',
+    x24css_a: "$css and $module may not both be passed at once.",
+    x24list1: "$list1, $list2, $separator: auto, $bracketed: auto",
+    x24selec: "$selectors: At least one selector must be passed.",
+    x24separ: '$separator: Must be "space", "comma", or "auto".',
+    x28__isn: "() isn't in the sass:color module.\n\nRecommendation: color.adjust(",
+    x29x0a_Mor: ")\n\nMore info: https://sass-lang.com/documentation/functions/color#",
+    x29x20is_d: ") is deprecated.\n\nTo preserve current behavior: $",
+    x29x20to_cg: ") to color.grayscale() is deprecated.\n\nRecommendation: ",
+    x29x20to_ci: ") to color.invert() is deprecated.\n\nRecommendation: ",
+    x2c_whici: ", which is currently (incorrectly) converted to ",
+    x2c_whicw: ', which will likely produce invalid CSS.\nAlways quote color names when using them as strings or map keys (for example, "',
+    x2e_Rela: ".\nRelative canonical URLs are deprecated and will eventually be disallowed.\n",
+    x3d_____: "===== asynchronous gap ===========================\n",
+    x40_moz_: "@-moz-document is deprecated and support will be removed from Sass in a future\nrelase. For details, see http://bit.ly/moz-document.\n",
+    x40conte: "@content is only allowed within mixin declarations.",
+    x40elsei: '@elseif is deprecated and will not be supported in future Sass versions.\nUse "@else if" instead.',
+    x40exten: "@extend may only be used within style rules.",
+    x40forwa: "@forward rules must be written before any other rules.",
+    x40funct: "@function if($condition, $if-true, $if-false) {",
+    x40use_r: "@use rules must be written before any other rules.",
+    A_list: "A list with more than one element must have an explicit separator.",
+    ABCDEF: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
+    As_of_C: "As of Dart Sass 2.0.0, !global assignments won't be able to\ndeclare new variables. Consider adding `",
+    As_of_S: "As of Dart Sass 2.0.0, !global assignments won't be able to\ndeclare new variables. Since this assignment is at the root of the stylesheet,\nthe !global flag is unnecessary and can safely be removed.",
+    At_rul: "At-rules may not be used within nested declarations.",
+    Broadc: "Broadcast stream controllers do not support pause callbacks",
+    Cannoteff: "Cannot extract a file path from a URI with a fragment component",
+    Cannotefq: "Cannot extract a file path from a URI with a query component",
+    Cannoten: "Cannot extract a non-Windows file path from a file URI with an authority",
+    Cannotf: "Cannot fire new event. Controller is already firing an event",
+    Could_: 'Could not find an option with short name "-',
+    Custom: "Custom functions may not return Dart's null.",
+    Declarm: "Declarations may only be used within style rules.",
+    Declarw: 'Declarations whose names begin with "--" must have StringExpression values (was `',
+    Either: "Either options.data or options.file must be set.",
+    Entrie: "Entries may not be removed from MergedMapView.",
+    Evalua: "Evaluation handles @include and its content block together.",
+    Expect: "Expected variable, mixin, or function name",
+    Functi: "Functions may not be declared in control directives.",
+    HSL_pa: "HSL parameters may not be passed along with HWB parameters.",
+    If_par: "If parsedAsCustomProperty is true, value must contain a SassString (was `",
+    In_Sas: 'In Sass, "&&" means two copies of the parent selector. You probably want to use "and" instead.',
+    Indent: "Indenting at the beginning of the document is illegal.",
+    Interpn: "Interpolation isn't allowed in namespaces.",
+    Interpp: "Interpolation isn't allowed in plain CSS.",
+    It_s_n: "It's not clear which file to import. Found:\n",
+    May_on: "May only contains Strings or Expressions.",
+    Media_: "Media rules may not be used within nested declarations.",
+    Mixinsb: "Mixins may not be declared in control directives.",
+    Mixinscf: "Mixins may not contain function declarations.",
+    Mixinscm: "Mixins may not contain mixin declarations.",
+    Module: "Module loop: this module is already being loaded.",
+    Nested: "Nested declarations aren't allowed in plain CSS.",
+    New_en: "New entries may not be added to MergedMapView.",
+    NoSour: "NoSourceMapBuffer.buildSourceMap() is not supported.",
+    Only_oa: "Only one argument may be passed to the plain-CSS invert() function.",
+    Only_op: "Only one positional argument is allowed. All other arguments must be passed by name.",
+    Other_: "Other modules' members can't be defined with !global.",
+    Passin: "Passing a string to call() is deprecated and will be illegal\nin Dart Sass 2.0.0. Use call(get-function(",
+    Placeh: "Placeholder selectors aren't allowed here.",
+    Plain_: "Plain CSS functions don't support keyword arguments.",
+    Positi: "Positional arguments must come before keyword arguments.",
+    Privat: "Private members can't be accessed from outside their modules.",
+    RGB_pa: "RGB parameters may not be passed along with ",
+    Sass_v: "Sass variables aren't allowed in plain CSS.",
+    Silent: "Silent comments aren't allowed in plain CSS.",
+    Soon__: "Soon, it will instead be correctly converted to ",
+    Style_: "Style rules may not be used within nested declarations.",
+    Suppor: "Supports rules may not be used within nested declarations.",
+    The_Ex: "The Extender and CssStylesheet passed to cloneCssStylesheet() must come from the same compilation.",
+    The_gi: "The given LineScannerState was not returned by this LineScanner.",
+    The_pa: "The parent selector isn't allowed in plain CSS.",
+    The_sa: "The same variable may only be configured once.",
+    The_ta: 'The target selector was not found.\nUse "@extend ',
+    There_: "There's already a module with namespace \"",
+    This_d: 'This declaration has no argument named "$',
+    This_f: "This function isn't allowed in plain CSS.",
+    This_ma: 'This module and the new module both define a variable named "$',
+    This_mw: 'This module was already loaded, so it can\'t be configured using "with".',
+    This_s: "This selector doesn't have any properties and won't be rendered.",
+    This_v: "This variable was not declared with !default in the @used module.",
+    Top_le: 'Top-level selectors may not contain the parent selector "&".',
+    Using_: "Using color.alpha() for a Microsoft filter is deprecated.\n\nRecommendation: ",
+    Variab_: "Variable keyword argument map must have string keys.\n",
+    Variabs: "Variable keyword arguments must be a map (was ",
+    You_ma: "You may not @extend selectors across media queries.",
+    You_pr: "You probably don't mean to use the color value ",
+    x60_inst: "` instead.\nSee http://bit.ly/ExtendCompound for details.\n",
+    addExt: "addExtensions() can't be called for a const Extender.",
+    compou: "compound selectors may no longer be extended.\nConsider `@extend ",
+    conten: "content-exists() may only be called within a mixin.",
+    must_b: "must be a UniversalSelector or a TypeSelector",
+    parsed: 'parsedAsCustomProperty must be false if name doesn\'t begin with "--".',
+    semico: "semicolons aren't allowed in the indented syntax.",
+    warn__: "warn() may only be called within a custom function or importer callback."
+  };
+  var type$ = (function rtii() {
+    var findType = H.findType;
+    return {
+      $env_1_1_legacy_String: findType("@<String*>"),
+      Comparable_dynamic: findType("Comparable<@>"),
+      ConstantMapView_Symbol_dynamic: findType("ConstantMapView<Symbol0,@>"),
+      ConstantStringMap_of_legacy_String_and_legacy_num: findType("ConstantStringMap<String*,num*>"),
+      CssValue_legacy_List_legacy_String: findType("CssValue<List<String*>*>"),
+      CssValue_legacy_List_legacy_String_2: findType("CssValue0<List<String*>*>"),
+      CssValue_legacy_String: findType("CssValue<String*>"),
+      CssValue_legacy_String_2: findType("CssValue0<String*>"),
+      CssValue_legacy_Value: findType("CssValue<Value*>"),
+      CssValue_legacy_Value_2: findType("CssValue0<Value0*>"),
+      EfficientLengthIterable_dynamic: findType("EfficientLengthIterable<@>"),
+      Error: findType("Error"),
+      FixedLengthListBuilder_legacy_ModifiableCssNode: findType("FixedLengthListBuilder<ModifiableCssNode*>"),
+      FixedLengthListBuilder_legacy_ModifiableCssNode_2: findType("FixedLengthListBuilder0<ModifiableCssNode0*>"),
+      Function: findType("Function"),
+      Future_dynamic: findType("Future<@>"),
+      Future_void: findType("Future<~>"),
+      JSArray_String: findType("JSArray<String>"),
+      JSArray_dynamic: findType("JSArray<@>"),
+      JSArray_int: findType("JSArray<int>"),
+      JSArray_legacy_Argument: findType("JSArray<Argument*>"),
+      JSArray_legacy_Argument_2: findType("JSArray<Argument0*>"),
+      JSArray_legacy_AstNode: findType("JSArray<AstNode*>"),
+      JSArray_legacy_AstNode_2: findType("JSArray<AstNode0*>"),
+      JSArray_legacy_AsyncBuiltInCallable: findType("JSArray<AsyncBuiltInCallable*>"),
+      JSArray_legacy_AsyncBuiltInCallable_2: findType("JSArray<AsyncBuiltInCallable0*>"),
+      JSArray_legacy_AsyncCallable: findType("JSArray<AsyncCallable0*>"),
+      JSArray_legacy_AsyncCallable_2: findType("JSArray<AsyncCallable*>"),
+      JSArray_legacy_AsyncImporter: findType("JSArray<AsyncImporter*>"),
+      JSArray_legacy_BinaryOperator: findType("JSArray<BinaryOperator*>"),
+      JSArray_legacy_BinaryOperator_2: findType("JSArray<BinaryOperator0*>"),
+      JSArray_legacy_BuiltInCallable: findType("JSArray<BuiltInCallable*>"),
+      JSArray_legacy_BuiltInCallable_2: findType("JSArray<BuiltInCallable0*>"),
+      JSArray_legacy_BuiltInModule_legacy_AsyncBuiltInCallable: findType("JSArray<BuiltInModule<AsyncBuiltInCallable*>*>"),
+      JSArray_legacy_BuiltInModule_legacy_AsyncBuiltInCallable_2: findType("JSArray<BuiltInModule0<AsyncBuiltInCallable0*>*>"),
+      JSArray_legacy_BuiltInModule_legacy_BuiltInCallable: findType("JSArray<BuiltInModule<BuiltInCallable*>*>"),
+      JSArray_legacy_BuiltInModule_legacy_BuiltInCallable_2: findType("JSArray<BuiltInModule0<BuiltInCallable0*>*>"),
+      JSArray_legacy_Callable: findType("JSArray<Callable*>"),
+      JSArray_legacy_Callable_2: findType("JSArray<Callable0*>"),
+      JSArray_legacy_Combinator: findType("JSArray<Combinator*>"),
+      JSArray_legacy_Combinator_2: findType("JSArray<Combinator0*>"),
+      JSArray_legacy_ComplexSelector: findType("JSArray<ComplexSelector*>"),
+      JSArray_legacy_ComplexSelectorComponent: findType("JSArray<ComplexSelectorComponent*>"),
+      JSArray_legacy_ComplexSelectorComponent_2: findType("JSArray<ComplexSelectorComponent0*>"),
+      JSArray_legacy_ComplexSelector_2: findType("JSArray<ComplexSelector0*>"),
+      JSArray_legacy_CompoundSelector: findType("JSArray<CompoundSelector*>"),
+      JSArray_legacy_CompoundSelector_2: findType("JSArray<CompoundSelector0*>"),
+      JSArray_legacy_ConfiguredVariable: findType("JSArray<ConfiguredVariable*>"),
+      JSArray_legacy_ConfiguredVariable_2: findType("JSArray<ConfiguredVariable0*>"),
+      JSArray_legacy_CssMediaQuery: findType("JSArray<CssMediaQuery*>"),
+      JSArray_legacy_CssMediaQuery_2: findType("JSArray<CssMediaQuery0*>"),
+      JSArray_legacy_CssNode: findType("JSArray<CssNode*>"),
+      JSArray_legacy_CssNode_2: findType("JSArray<CssNode0*>"),
+      JSArray_legacy_Entry: findType("JSArray<Entry*>"),
+      JSArray_legacy_Expression: findType("JSArray<Expression*>"),
+      JSArray_legacy_Expression_2: findType("JSArray<Expression0*>"),
+      JSArray_legacy_Extender: findType("JSArray<Extender*>"),
+      JSArray_legacy_Extender_2: findType("JSArray<Extender0*>"),
+      JSArray_legacy_Extension: findType("JSArray<Extension*>"),
+      JSArray_legacy_Extension_2: findType("JSArray<Extension0*>"),
+      JSArray_legacy_ForwardRule: findType("JSArray<ForwardRule*>"),
+      JSArray_legacy_ForwardRule_2: findType("JSArray<ForwardRule0*>"),
+      JSArray_legacy_Frame: findType("JSArray<Frame*>"),
+      JSArray_legacy_IfClause: findType("JSArray<IfClause*>"),
+      JSArray_legacy_IfClause_2: findType("JSArray<IfClause0*>"),
+      JSArray_legacy_Import: findType("JSArray<Import*>"),
+      JSArray_legacy_Import_2: findType("JSArray<Import0*>"),
+      JSArray_legacy_Importer: findType("JSArray<Importer*>"),
+      JSArray_legacy_Iterable_legacy_ComplexSelectorComponent: findType("JSArray<Iterable<ComplexSelectorComponent*>*>"),
+      JSArray_legacy_Iterable_legacy_ComplexSelectorComponent_2: findType("JSArray<Iterable<ComplexSelectorComponent0*>*>"),
+      JSArray_legacy_JSFunction: findType("JSArray<JSFunction0*>"),
+      JSArray_legacy_List_legacy_ComplexSelectorComponent: findType("JSArray<List<ComplexSelectorComponent*>*>"),
+      JSArray_legacy_List_legacy_ComplexSelectorComponent_2: findType("JSArray<List<ComplexSelectorComponent0*>*>"),
+      JSArray_legacy_List_legacy_Extension: findType("JSArray<List<Extension*>*>"),
+      JSArray_legacy_List_legacy_Extension_2: findType("JSArray<List<Extension0*>*>"),
+      JSArray_legacy_List_legacy_Iterable_legacy_ComplexSelectorComponent: findType("JSArray<List<Iterable<ComplexSelectorComponent*>*>*>"),
+      JSArray_legacy_List_legacy_Iterable_legacy_ComplexSelectorComponent_2: findType("JSArray<List<Iterable<ComplexSelectorComponent0*>*>*>"),
+      JSArray_legacy_Map_of_legacy_String_and_legacy_AstNode: findType("JSArray<Map<String*,AstNode*>*>"),
+      JSArray_legacy_Map_of_legacy_String_and_legacy_AstNode_2: findType("JSArray<Map<String*,AstNode0*>*>"),
+      JSArray_legacy_Map_of_legacy_String_and_legacy_AsyncCallable: findType("JSArray<Map<String*,AsyncCallable*>*>"),
+      JSArray_legacy_Map_of_legacy_String_and_legacy_AsyncCallable_2: findType("JSArray<Map<String*,AsyncCallable0*>*>"),
+      JSArray_legacy_Map_of_legacy_String_and_legacy_Callable: findType("JSArray<Map<String*,Callable*>*>"),
+      JSArray_legacy_Map_of_legacy_String_and_legacy_Callable_2: findType("JSArray<Map<String*,Callable0*>*>"),
+      JSArray_legacy_Map_of_legacy_String_and_legacy_Value: findType("JSArray<Map<String*,Value*>*>"),
+      JSArray_legacy_Map_of_legacy_String_and_legacy_Value_2: findType("JSArray<Map<String*,Value0*>*>"),
+      JSArray_legacy_ModifiableCssImport: findType("JSArray<ModifiableCssImport*>"),
+      JSArray_legacy_ModifiableCssImport_2: findType("JSArray<ModifiableCssImport0*>"),
+      JSArray_legacy_ModifiableCssNode: findType("JSArray<ModifiableCssNode*>"),
+      JSArray_legacy_ModifiableCssNode_2: findType("JSArray<ModifiableCssNode0*>"),
+      JSArray_legacy_ModifiableCssParentNode: findType("JSArray<ModifiableCssParentNode*>"),
+      JSArray_legacy_ModifiableCssParentNode_2: findType("JSArray<ModifiableCssParentNode0*>"),
+      JSArray_legacy_Module_legacy_AsyncCallable: findType("JSArray<Module<AsyncCallable*>*>"),
+      JSArray_legacy_Module_legacy_AsyncCallable_2: findType("JSArray<Module0<AsyncCallable0*>*>"),
+      JSArray_legacy_Module_legacy_Callable: findType("JSArray<Module<Callable*>*>"),
+      JSArray_legacy_Module_legacy_Callable_2: findType("JSArray<Module0<Callable0*>*>"),
+      JSArray_legacy_Object: findType("JSArray<Object*>"),
+      JSArray_legacy_PseudoSelector: findType("JSArray<PseudoSelector*>"),
+      JSArray_legacy_PseudoSelector_2: findType("JSArray<PseudoSelector0*>"),
+      JSArray_legacy_SassList: findType("JSArray<SassList*>"),
+      JSArray_legacy_SassList_2: findType("JSArray<SassList0*>"),
+      JSArray_legacy_SimpleSelector: findType("JSArray<SimpleSelector*>"),
+      JSArray_legacy_SimpleSelector_2: findType("JSArray<SimpleSelector0*>"),
+      JSArray_legacy_Statement: findType("JSArray<Statement*>"),
+      JSArray_legacy_Statement_2: findType("JSArray<Statement0*>"),
+      JSArray_legacy_String: findType("JSArray<String*>"),
+      JSArray_legacy_StylesheetNode: findType("JSArray<StylesheetNode*>"),
+      JSArray_legacy_TargetEntry: findType("JSArray<TargetEntry*>"),
+      JSArray_legacy_TargetLineEntry: findType("JSArray<TargetLineEntry*>"),
+      JSArray_legacy_Trace: findType("JSArray<Trace*>"),
+      JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value: findType("JSArray<Tuple2<ArgumentDeclaration*,Value*(List<Value*>*)*>*>"),
+      JSArray_legacy_Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2: findType("JSArray<Tuple2<ArgumentDeclaration0*,Value0*(List<Value0*>*)*>*>"),
+      JSArray_legacy_Tuple2_of_legacy_Expression_and_legacy_Expression: findType("JSArray<Tuple2<Expression*,Expression*>*>"),
+      JSArray_legacy_Tuple2_of_legacy_Expression_and_legacy_Expression_2: findType("JSArray<Tuple2<Expression0*,Expression0*>*>"),
+      JSArray_legacy_Tuple2_of_legacy_String_and_legacy_AstNode: findType("JSArray<Tuple2<String*,AstNode*>*>"),
+      JSArray_legacy_Tuple2_of_legacy_String_and_legacy_AstNode_2: findType("JSArray<Tuple2<String*,AstNode0*>*>"),
+      JSArray_legacy_Uri: findType("JSArray<Uri*>"),
+      JSArray_legacy_UseRule: findType("JSArray<UseRule*>"),
+      JSArray_legacy_UseRule_2: findType("JSArray<UseRule0*>"),
+      JSArray_legacy_Value: findType("JSArray<Value*>"),
+      JSArray_legacy_Value_2: findType("JSArray<Value0*>"),
+      JSArray_legacy__Highlight: findType("JSArray<_Highlight*>"),
+      JSArray_legacy__Line: findType("JSArray<_Line*>"),
+      JSArray_legacy_bool: findType("JSArray<bool*>"),
+      JSArray_legacy_int: findType("JSArray<int*>"),
+      JSNull: findType("JSNull"),
+      JavaScriptFunction: findType("JavaScriptFunction"),
+      JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
+      JsLinkedHashMap_Symbol_dynamic: findType("JsLinkedHashMap<Symbol0,@>"),
+      LimitedMapView_of_legacy_String_and_legacy_ConfiguredValue: findType("LimitedMapView<String*,ConfiguredValue*>"),
+      LimitedMapView_of_legacy_String_and_legacy_ConfiguredValue_2: findType("LimitedMapView0<String*,ConfiguredValue0*>"),
+      List_dynamic: findType("List<@>"),
+      MapKeySet_legacy_Object: findType("MapKeySet<Object*>"),
+      MapKeySet_legacy_SimpleSelector: findType("MapKeySet<SimpleSelector*>"),
+      MapKeySet_legacy_SimpleSelector_2: findType("MapKeySet<SimpleSelector0*>"),
+      MapKeySet_legacy_String: findType("MapKeySet<String*>"),
+      Map_dynamic_dynamic: findType("Map<@,@>"),
+      MappedIterable_of_String_and_legacy_Frame: findType("MappedIterable<String,Frame*>"),
+      MappedListIterable_String_dynamic: findType("MappedListIterable<String,@>"),
+      MappedListIterable_of_String_and_legacy_String: findType("MappedListIterable<String,String*>"),
+      MappedListIterable_of_String_and_legacy_Trace: findType("MappedListIterable<String,Trace*>"),
+      MappedListIterable_of_legacy_Frame_and_legacy_Frame: findType("MappedListIterable<Frame*,Frame*>"),
+      MappedListIterable_of_legacy_String_and_legacy_Future_void: findType("MappedListIterable<String*,Future<~>*>"),
+      ModifiableCssValue_legacy_SelectorList: findType("ModifiableCssValue<SelectorList*>"),
+      ModifiableCssValue_legacy_SelectorList_2: findType("ModifiableCssValue0<SelectorList0*>"),
+      NativeTypedArrayOfDouble: findType("NativeTypedArrayOfDouble"),
+      NativeTypedArrayOfInt: findType("NativeTypedArrayOfInt"),
+      NativeUint8List: findType("NativeUint8List"),
+      Null: findType("Null"),
+      Object: findType("Object"),
+      PathMap_legacy_ChangeType: findType("PathMap<ChangeType*>"),
+      PathMap_legacy_String: findType("PathMap<String*>"),
+      ReversedListIterable_legacy_Combinator: findType("ReversedListIterable<Combinator*>"),
+      ReversedListIterable_legacy_Combinator_2: findType("ReversedListIterable<Combinator0*>"),
+      ReversedListIterable_legacy_Frame: findType("ReversedListIterable<Frame*>"),
+      StackTrace: findType("StackTrace"),
+      StreamCompleter_legacy_WatchEvent: findType("StreamCompleter<WatchEvent*>"),
+      StreamGroup_legacy_WatchEvent: findType("StreamGroup<WatchEvent*>"),
+      StreamQueue_legacy_String: findType("StreamQueue<String*>"),
+      String: findType("String"),
+      StringBuffer: findType("StringBuffer"),
+      StringConversionSink: findType("StringConversionSink"),
+      Timer: findType("Timer"),
+      Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_FutureOr_legacy_Value_Function_legacy_List_legacy_Value: findType("Tuple2<ArgumentDeclaration*,Value*/*(List<Value*>*)*>"),
+      Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_FutureOr_legacy_Value_Function_legacy_List_legacy_Value_2: findType("Tuple2<ArgumentDeclaration0*,Value0*/*(List<Value0*>*)*>"),
+      Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value: findType("Tuple2<ArgumentDeclaration*,Value*(List<Value*>*)*>"),
+      Tuple2_of_legacy_ArgumentDeclaration_and_legacy_legacy_Value_Function_legacy_List_legacy_Value_2: findType("Tuple2<ArgumentDeclaration0*,Value0*(List<Value0*>*)*>"),
+      Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet: findType("Tuple2<AsyncImporter*,Stylesheet*>"),
+      Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet_2: findType("Tuple2<AsyncImporter0*,Stylesheet0*>"),
+      Tuple2_of_legacy_Expression_and_legacy_Expression: findType("Tuple2<Expression*,Expression*>"),
+      Tuple2_of_legacy_Expression_and_legacy_Expression_2: findType("Tuple2<Expression0*,Expression0*>"),
+      Tuple2_of_legacy_Extender_and_legacy_Map_of_legacy_CssValue_legacy_SelectorList_and_legacy_ModifiableCssValue_legacy_SelectorList: findType("Tuple2<Extender*,Map<CssValue<SelectorList*>*,ModifiableCssValue<SelectorList*>*>*>"),
+      Tuple2_of_legacy_Extender_and_legacy_Map_of_legacy_CssValue_legacy_SelectorList_and_legacy_ModifiableCssValue_legacy_SelectorList_2: findType("Tuple2<Extender0*,Map<CssValue0<SelectorList0*>*,ModifiableCssValue0<SelectorList0*>*>*>"),
+      Tuple2_of_legacy_Importer_and_legacy_Stylesheet: findType("Tuple2<Importer*,Stylesheet*>"),
+      Tuple2_of_legacy_Importer_and_legacy_Stylesheet_2: findType("Tuple2<Importer0*,Stylesheet0*>"),
+      Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression: findType("Tuple2<List<Expression*>*,Map<String*,Expression*>*>"),
+      Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2: findType("Tuple2<List<Expression0*>*,Map<String*,Expression0*>*>"),
+      Tuple2_of_legacy_List_legacy_Uri_and_legacy_List_legacy_Uri: findType("Tuple2<List<Uri*>*,List<Uri*>*>"),
+      Tuple2_of_legacy_Map_of_legacy_Uri_and_legacy_StylesheetNode_and_legacy_Map_of_legacy_Uri_and_legacy_StylesheetNode: findType("Tuple2<Map<Uri*,StylesheetNode*>*,Map<Uri*,StylesheetNode*>*>"),
+      Tuple2_of_legacy_ModifiableCssStylesheet_and_legacy_Extender: findType("Tuple2<ModifiableCssStylesheet*,Extender*>"),
+      Tuple2_of_legacy_ModifiableCssStylesheet_and_legacy_Extender_2: findType("Tuple2<ModifiableCssStylesheet0*,Extender0*>"),
+      Tuple2_of_legacy_SassNumber_and_legacy_SassNumber: findType("Tuple2<SassNumber*,SassNumber*>"),
+      Tuple2_of_legacy_SassNumber_and_legacy_SassNumber_2: findType("Tuple2<SassNumber0*,SassNumber0*>"),
+      Tuple2_of_legacy_Set_legacy_String_and_legacy_Set_legacy_String: findType("Tuple2<Set<String*>*,Set<String*>*>"),
+      Tuple2_of_legacy_String_and_legacy_ArgumentDeclaration: findType("Tuple2<String*,ArgumentDeclaration0*>"),
+      Tuple2_of_legacy_String_and_legacy_AstNode: findType("Tuple2<String*,AstNode*>"),
+      Tuple2_of_legacy_String_and_legacy_AstNode_2: findType("Tuple2<String*,AstNode0*>"),
+      Tuple2_of_legacy_String_and_legacy_String: findType("Tuple2<String*,String*>"),
+      Tuple2_of_legacy_SupportsCondition_and_legacy_Interpolation: findType("Tuple2<SupportsCondition*,Interpolation*>"),
+      Tuple2_of_legacy_SupportsCondition_and_legacy_Interpolation_2: findType("Tuple2<SupportsCondition0*,Interpolation0*>"),
+      Tuple2_of_legacy_Uri_and_legacy_bool: findType("Tuple2<Uri*,bool*>"),
+      Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri: findType("Tuple3<AsyncImporter*,Uri*,Uri*>"),
+      Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri_2: findType("Tuple3<AsyncImporter0*,Uri*,Uri*>"),
+      Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri: findType("Tuple3<Importer*,Uri*,Uri*>"),
+      Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri_2: findType("Tuple3<Importer0*,Uri*,Uri*>"),
+      Uint8List: findType("Uint8List"),
+      UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
+      UnmodifiableListView_legacy_CssNode: findType("UnmodifiableListView<CssNode*>"),
+      UnmodifiableListView_legacy_CssNode_2: findType("UnmodifiableListView<CssNode0*>"),
+      UnmodifiableListView_legacy_ForwardRule: findType("UnmodifiableListView<ForwardRule*>"),
+      UnmodifiableListView_legacy_ForwardRule_2: findType("UnmodifiableListView<ForwardRule0*>"),
+      UnmodifiableListView_legacy_ModifiableCssNode: findType("UnmodifiableListView<ModifiableCssNode*>"),
+      UnmodifiableListView_legacy_ModifiableCssNode_2: findType("UnmodifiableListView<ModifiableCssNode0*>"),
+      UnmodifiableListView_legacy_String: findType("UnmodifiableListView<String*>"),
+      UnmodifiableListView_legacy_UseRule: findType("UnmodifiableListView<UseRule*>"),
+      UnmodifiableListView_legacy_UseRule_2: findType("UnmodifiableListView<UseRule0*>"),
+      UnmodifiableMapView_of_legacy_String_and_legacy_ArgParser: findType("UnmodifiableMapView<String*,ArgParser*>"),
+      UnmodifiableMapView_of_legacy_String_and_legacy_ConfiguredValue: findType("UnmodifiableMapView<String*,ConfiguredValue*>"),
+      UnmodifiableMapView_of_legacy_String_and_legacy_ConfiguredValue_2: findType("UnmodifiableMapView<String*,ConfiguredValue0*>"),
+      UnmodifiableMapView_of_legacy_String_and_legacy_Option: findType("UnmodifiableMapView<String*,Option*>"),
+      UnmodifiableMapView_of_legacy_String_and_legacy_SourceFile: findType("UnmodifiableMapView<String*,SourceFile*>"),
+      UnmodifiableMapView_of_legacy_String_and_legacy_String: findType("UnmodifiableMapView<String*,String*>"),
+      UnmodifiableMapView_of_legacy_String_and_legacy_Value: findType("UnmodifiableMapView<String*,Value*>"),
+      UnmodifiableMapView_of_legacy_String_and_legacy_Value_2: findType("UnmodifiableMapView<String*,Value0*>"),
+      UnmodifiableMapView_of_legacy_Uri_and_legacy_StylesheetNode: findType("UnmodifiableMapView<Uri*,StylesheetNode*>"),
+      UnmodifiableSetView_legacy_String: findType("UnmodifiableSetView<String*>"),
+      UnmodifiableSetView_legacy_StylesheetNode: findType("UnmodifiableSetView<StylesheetNode*>"),
+      UnprefixedMapView_legacy_ConfiguredValue: findType("UnprefixedMapView<ConfiguredValue*>"),
+      UnprefixedMapView_legacy_ConfiguredValue_2: findType("UnprefixedMapView0<ConfiguredValue0*>"),
+      Uri: findType("Uri"),
+      UserDefinedCallable_legacy_AsyncEnvironment: findType("UserDefinedCallable<AsyncEnvironment*>"),
+      UserDefinedCallable_legacy_AsyncEnvironment_2: findType("UserDefinedCallable0<AsyncEnvironment0*>"),
+      UserDefinedCallable_legacy_Environment: findType("UserDefinedCallable<Environment*>"),
+      UserDefinedCallable_legacy_Environment_2: findType("UserDefinedCallable0<Environment0*>"),
+      WhereIterable_String: findType("WhereIterable<String>"),
+      WhereIterable_legacy_List_legacy_Iterable_legacy_ComplexSelectorComponent: findType("WhereIterable<List<Iterable<ComplexSelectorComponent*>*>*>"),
+      WhereIterable_legacy_List_legacy_Iterable_legacy_ComplexSelectorComponent_2: findType("WhereIterable<List<Iterable<ComplexSelectorComponent0*>*>*>"),
+      WhereIterable_legacy_String: findType("WhereIterable<String*>"),
+      WhereTypeIterable_legacy_PseudoSelector: findType("WhereTypeIterable<PseudoSelector*>"),
+      WhereTypeIterable_legacy_PseudoSelector_2: findType("WhereTypeIterable<PseudoSelector0*>"),
+      _AsyncCompleter_legacy_Object: findType("_AsyncCompleter<Object*>"),
+      _AsyncCompleter_legacy_Stream_legacy_WatchEvent: findType("_AsyncCompleter<Stream<WatchEvent*>*>"),
+      _AsyncCompleter_legacy_String: findType("_AsyncCompleter<String*>"),
+      _CompleterStream_legacy_WatchEvent: findType("_CompleterStream<WatchEvent*>"),
+      _Future_bool: findType("_Future<bool>"),
+      _Future_dynamic: findType("_Future<@>"),
+      _Future_int: findType("_Future<int>"),
+      _Future_legacy_Object: findType("_Future<Object*>"),
+      _Future_legacy_Stream_legacy_WatchEvent: findType("_Future<Stream<WatchEvent*>*>"),
+      _Future_legacy_String: findType("_Future<String*>"),
+      _Future_void: findType("_Future<~>"),
+      _LinkedIdentityHashSet_legacy_ComplexSelector: findType("_LinkedIdentityHashSet<ComplexSelector*>"),
+      _LinkedIdentityHashSet_legacy_ComplexSelector_2: findType("_LinkedIdentityHashSet<ComplexSelector0*>"),
+      _LinkedIdentityHashSet_legacy_Extension: findType("_LinkedIdentityHashSet<Extension*>"),
+      _LinkedIdentityHashSet_legacy_Extension_2: findType("_LinkedIdentityHashSet<Extension0*>"),
+      bool: findType("bool"),
+      double: findType("double"),
+      dynamic: findType("@"),
+      dynamic_Function_Object: findType("@(Object)"),
+      dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
+      int: findType("int"),
+      legacy_ArgParser: findType("ArgParser*"),
+      legacy_Argument: findType("Argument*"),
+      legacy_ArgumentDeclaration: findType("ArgumentDeclaration*"),
+      legacy_ArgumentDeclaration_2: findType("ArgumentDeclaration0*"),
+      legacy_Argument_2: findType("Argument0*"),
+      legacy_AstNode: findType("AstNode*"),
+      legacy_AstNode_2: findType("AstNode0*"),
+      legacy_AsyncBuiltInCallable: findType("AsyncBuiltInCallable*"),
+      legacy_AsyncBuiltInCallable_2: findType("AsyncBuiltInCallable0*"),
+      legacy_AsyncCallable: findType("AsyncCallable*"),
+      legacy_AsyncCallable_2: findType("AsyncCallable0*"),
+      legacy_BuiltInCallable: findType("BuiltInCallable*"),
+      legacy_BuiltInCallable_2: findType("BuiltInCallable0*"),
+      legacy_Callable: findType("Callable*"),
+      legacy_Callable_2: findType("Callable0*"),
+      legacy_ChangeType: findType("ChangeType*"),
+      legacy_Combinator: findType("Combinator*"),
+      legacy_Combinator_2: findType("Combinator0*"),
+      legacy_Comparable_dynamic: findType("Comparable<@>*"),
+      legacy_CompileResult: findType("CompileResult*"),
+      legacy_CompileResult_2: findType("CompileResult0*"),
+      legacy_ComplexSelector: findType("ComplexSelector*"),
+      legacy_ComplexSelectorComponent: findType("ComplexSelectorComponent*"),
+      legacy_ComplexSelectorComponent_2: findType("ComplexSelectorComponent0*"),
+      legacy_ComplexSelector_2: findType("ComplexSelector0*"),
+      legacy_CompoundSelector: findType("CompoundSelector*"),
+      legacy_CompoundSelector_2: findType("CompoundSelector0*"),
+      legacy_Configuration: findType("Configuration*"),
+      legacy_Configuration_2: findType("Configuration0*"),
+      legacy_ConfiguredValue: findType("ConfiguredValue*"),
+      legacy_ConfiguredValue_2: findType("ConfiguredValue0*"),
+      legacy_ConfiguredVariable: findType("ConfiguredVariable*"),
+      legacy_ConfiguredVariable_2: findType("ConfiguredVariable0*"),
+      legacy_CssAtRule: findType("CssAtRule*"),
+      legacy_CssAtRule_2: findType("CssAtRule0*"),
+      legacy_CssComment: findType("CssComment*"),
+      legacy_CssComment_2: findType("CssComment0*"),
+      legacy_CssImport: findType("CssImport*"),
+      legacy_CssImport_2: findType("CssImport0*"),
+      legacy_CssMediaQuery: findType("CssMediaQuery*"),
+      legacy_CssMediaQuery_2: findType("CssMediaQuery0*"),
+      legacy_CssMediaRule: findType("CssMediaRule*"),
+      legacy_CssMediaRule_2: findType("CssMediaRule0*"),
+      legacy_CssParentNode: findType("CssParentNode*"),
+      legacy_CssParentNode_2: findType("CssParentNode0*"),
+      legacy_CssStyleRule: findType("CssStyleRule*"),
+      legacy_CssStyleRule_2: findType("CssStyleRule0*"),
+      legacy_CssStylesheet: findType("CssStylesheet*"),
+      legacy_CssStylesheet_2: findType("CssStylesheet0*"),
+      legacy_CssSupportsRule: findType("CssSupportsRule*"),
+      legacy_CssSupportsRule_2: findType("CssSupportsRule0*"),
+      legacy_CssValue_legacy_SelectorList: findType("CssValue<SelectorList*>*"),
+      legacy_CssValue_legacy_SelectorList_2: findType("CssValue0<SelectorList0*>*"),
+      legacy_CssValue_legacy_String: findType("CssValue<String*>*"),
+      legacy_CssValue_legacy_String_2: findType("CssValue0<String*>*"),
+      legacy_DateTime: findType("DateTime*"),
+      legacy_EvaluateResult: findType("EvaluateResult*"),
+      legacy_EvaluateResult_2: findType("EvaluateResult0*"),
+      legacy_Exception: findType("Exception*"),
+      legacy_Expression: findType("Expression*"),
+      legacy_Expression_2: findType("Expression0*"),
+      legacy_Extension: findType("Extension*"),
+      legacy_Extension_2: findType("Extension0*"),
+      legacy_FileLocation: findType("FileLocation*"),
+      legacy_FileSpan: findType("FileSpan*"),
+      legacy_FormatException: findType("FormatException*"),
+      legacy_Frame: findType("Frame*"),
+      legacy_Function: findType("Function*"),
+      legacy_FutureOr_legacy_EvaluateResult: findType("EvaluateResult*/*"),
+      legacy_FutureOr_legacy_EvaluateResult_2: findType("EvaluateResult0*/*"),
+      legacy_Future_dynamic: findType("Future<@>*"),
+      legacy_Future_void: findType("Future<~>*"),
+      legacy_IfClause: findType("IfClause*"),
+      legacy_IfClause_2: findType("IfClause0*"),
+      legacy_Import: findType("Import*"),
+      legacy_Import_2: findType("Import0*"),
+      legacy_ImporterResult: findType("ImporterResult0*"),
+      legacy_ImporterResult_2: findType("ImporterResult*"),
+      legacy_Interpolation: findType("Interpolation*"),
+      legacy_InterpolationBuffer: findType("InterpolationBuffer*"),
+      legacy_InterpolationBuffer_2: findType("InterpolationBuffer0*"),
+      legacy_Interpolation_2: findType("Interpolation0*"),
+      legacy_Iterable_legacy_ComplexSelectorComponent: findType("Iterable<ComplexSelectorComponent*>*"),
+      legacy_Iterable_legacy_ComplexSelectorComponent_2: findType("Iterable<ComplexSelectorComponent0*>*"),
+      legacy_JSFunction: findType("JSFunction0*"),
+      legacy_JsSystemError: findType("JsSystemError*"),
+      legacy_List_dynamic: findType("List<@>*"),
+      legacy_List_legacy_ComplexSelector: findType("List<ComplexSelector*>*"),
+      legacy_List_legacy_ComplexSelectorComponent: findType("List<ComplexSelectorComponent*>*"),
+      legacy_List_legacy_ComplexSelectorComponent_2: findType("List<ComplexSelectorComponent0*>*"),
+      legacy_List_legacy_ComplexSelector_2: findType("List<ComplexSelector0*>*"),
+      legacy_List_legacy_CssMediaQuery: findType("List<CssMediaQuery*>*"),
+      legacy_List_legacy_CssMediaQuery_2: findType("List<CssMediaQuery0*>*"),
+      legacy_List_legacy_Extender: findType("List<Extender*>*"),
+      legacy_List_legacy_Extender_2: findType("List<Extender0*>*"),
+      legacy_List_legacy_Extension: findType("List<Extension*>*"),
+      legacy_List_legacy_Extension_2: findType("List<Extension0*>*"),
+      legacy_List_legacy_List_legacy_ComplexSelectorComponent: findType("List<List<ComplexSelectorComponent*>*>*"),
+      legacy_List_legacy_List_legacy_ComplexSelectorComponent_2: findType("List<List<ComplexSelectorComponent0*>*>*"),
+      legacy_List_legacy_Module_legacy_AsyncCallable: findType("List<Module<AsyncCallable*>*>*"),
+      legacy_List_legacy_Module_legacy_AsyncCallable_2: findType("List<Module0<AsyncCallable0*>*>*"),
+      legacy_List_legacy_Module_legacy_Callable: findType("List<Module<Callable*>*>*"),
+      legacy_List_legacy_Module_legacy_Callable_2: findType("List<Module0<Callable0*>*>*"),
+      legacy_List_legacy_Object: findType("List<Object*>*"),
+      legacy_List_legacy_String: findType("List<String*>*"),
+      legacy_List_legacy_Value: findType("List<Value*>*"),
+      legacy_List_legacy_Value_2: findType("List<Value0*>*"),
+      legacy_List_legacy_WatchEvent: findType("List<WatchEvent*>*"),
+      legacy_List_legacy_int: findType("List<int*>*"),
+      legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension: findType("Map<ComplexSelector*,Extension*>*"),
+      legacy_Map_of_legacy_ComplexSelector_and_legacy_Extension_2: findType("Map<ComplexSelector0*,Extension0*>*"),
+      legacy_MediaQuerySuccessfulMergeResult: findType("MediaQuerySuccessfulMergeResult*"),
+      legacy_MediaQuerySuccessfulMergeResult_2: findType("MediaQuerySuccessfulMergeResult0*"),
+      legacy_MixinRule: findType("MixinRule*"),
+      legacy_MixinRule_2: findType("MixinRule0*"),
+      legacy_ModifiableCssAtRule: findType("ModifiableCssAtRule*"),
+      legacy_ModifiableCssAtRule_2: findType("ModifiableCssAtRule0*"),
+      legacy_ModifiableCssKeyframeBlock: findType("ModifiableCssKeyframeBlock*"),
+      legacy_ModifiableCssKeyframeBlock_2: findType("ModifiableCssKeyframeBlock0*"),
+      legacy_ModifiableCssMediaRule: findType("ModifiableCssMediaRule*"),
+      legacy_ModifiableCssMediaRule_2: findType("ModifiableCssMediaRule0*"),
+      legacy_ModifiableCssParentNode: findType("ModifiableCssParentNode*"),
+      legacy_ModifiableCssParentNode_2: findType("ModifiableCssParentNode0*"),
+      legacy_ModifiableCssStyleRule: findType("ModifiableCssStyleRule*"),
+      legacy_ModifiableCssStyleRule_2: findType("ModifiableCssStyleRule0*"),
+      legacy_ModifiableCssSupportsRule: findType("ModifiableCssSupportsRule*"),
+      legacy_ModifiableCssSupportsRule_2: findType("ModifiableCssSupportsRule0*"),
+      legacy_ModifiableCssValue_legacy_SelectorList: findType("ModifiableCssValue<SelectorList*>*"),
+      legacy_ModifiableCssValue_legacy_SelectorList_2: findType("ModifiableCssValue0<SelectorList0*>*"),
+      legacy_Module_legacy_AsyncCallable: findType("Module<AsyncCallable*>*"),
+      legacy_Module_legacy_AsyncCallable_2: findType("Module0<AsyncCallable0*>*"),
+      legacy_Module_legacy_Callable: findType("Module<Callable*>*"),
+      legacy_Module_legacy_Callable_2: findType("Module0<Callable0*>*"),
+      legacy_Never: findType("0&*"),
+      legacy_NodeImporterResult: findType("NodeImporterResult0*"),
+      legacy_Object: findType("Object*"),
+      legacy_Option: findType("Option*"),
+      legacy_ParentSelector: findType("ParentSelector*"),
+      legacy_ParentSelector_2: findType("ParentSelector0*"),
+      legacy_PseudoSelector: findType("PseudoSelector*"),
+      legacy_PseudoSelector_2: findType("PseudoSelector0*"),
+      legacy_RangeError: findType("RangeError*"),
+      legacy_RenderResult: findType("RenderResult*"),
+      legacy_Result_legacy_String: findType("Result<String*>*"),
+      legacy_SassArgumentList: findType("SassArgumentList*"),
+      legacy_SassArgumentList_2: findType("SassArgumentList0*"),
+      legacy_SassBoolean: findType("SassBoolean*"),
+      legacy_SassBoolean_2: findType("SassBoolean0*"),
+      legacy_SassColor: findType("SassColor*"),
+      legacy_SassColor_2: findType("SassColor0*"),
+      legacy_SassList: findType("SassList*"),
+      legacy_SassList_2: findType("SassList0*"),
+      legacy_SassMap: findType("SassMap*"),
+      legacy_SassMap_2: findType("SassMap0*"),
+      legacy_SassNull: findType("SassNull*"),
+      legacy_SassNull_2: findType("SassNull0*"),
+      legacy_SassNumber: findType("SassNumber*"),
+      legacy_SassNumber_2: findType("SassNumber0*"),
+      legacy_SassRuntimeException: findType("SassRuntimeException*"),
+      legacy_SassRuntimeException_2: findType("SassRuntimeException0*"),
+      legacy_SassString: findType("SassString*"),
+      legacy_SassString_2: findType("SassString0*"),
+      legacy_Set_legacy_ModifiableCssValue_legacy_SelectorList: findType("Set<ModifiableCssValue<SelectorList*>*>*"),
+      legacy_Set_legacy_ModifiableCssValue_legacy_SelectorList_2: findType("Set<ModifiableCssValue0<SelectorList0*>*>*"),
+      legacy_SimpleSelector: findType("SimpleSelector*"),
+      legacy_SimpleSelector_2: findType("SimpleSelector0*"),
+      legacy_SourceFile: findType("SourceFile*"),
+      legacy_SourceLocation: findType("SourceLocation*"),
+      legacy_SourceSpan: findType("SourceSpan*"),
+      legacy_SourceSpanFormatException: findType("SourceSpanFormatException*"),
+      legacy_SourceSpanWithContext: findType("SourceSpanWithContext*"),
+      legacy_Statement: findType("Statement*"),
+      legacy_Statement_2: findType("Statement0*"),
+      legacy_StaticImport: findType("StaticImport*"),
+      legacy_StaticImport_2: findType("StaticImport0*"),
+      legacy_StreamSubscription_legacy_WatchEvent: findType("StreamSubscription<WatchEvent*>*"),
+      legacy_Stream_legacy_WatchEvent: findType("Stream<WatchEvent*>*"),
+      legacy_String: findType("String*"),
+      legacy_Stylesheet: findType("Stylesheet0*"),
+      legacy_StylesheetNode: findType("StylesheetNode*"),
+      legacy_Stylesheet_2: findType("Stylesheet*"),
+      legacy_Trace: findType("Trace*"),
+      legacy_Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet: findType("Tuple2<AsyncImporter*,Stylesheet*>*"),
+      legacy_Tuple2_of_legacy_AsyncImporter_and_legacy_Stylesheet_2: findType("Tuple2<AsyncImporter0*,Stylesheet0*>*"),
+      legacy_Tuple2_of_legacy_Expression_and_legacy_Expression: findType("Tuple2<Expression*,Expression*>*"),
+      legacy_Tuple2_of_legacy_Expression_and_legacy_Expression_2: findType("Tuple2<Expression0*,Expression0*>*"),
+      legacy_Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression: findType("Tuple2<List<Expression*>*,Map<String*,Expression*>*>*"),
+      legacy_Tuple2_of_legacy_List_legacy_Expression_and_legacy_Map_of_legacy_String_and_legacy_Expression_2: findType("Tuple2<List<Expression0*>*,Map<String*,Expression0*>*>*"),
+      legacy_Tuple2_of_legacy_String_and_legacy_String: findType("Tuple2<String*,String*>*"),
+      legacy_Tuple2_of_legacy_Uri_and_legacy_bool: findType("Tuple2<Uri*,bool*>*"),
+      legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri: findType("Tuple3<AsyncImporter0*,Uri*,Uri*>*"),
+      legacy_Tuple3_of_legacy_AsyncImporter_and_legacy_Uri_and_legacy_Uri_2: findType("Tuple3<AsyncImporter*,Uri*,Uri*>*"),
+      legacy_Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri: findType("Tuple3<Importer*,Uri*,Uri*>*"),
+      legacy_Tuple3_of_legacy_Importer_and_legacy_Uri_and_legacy_Uri_2: findType("Tuple3<Importer0*,Uri*,Uri*>*"),
+      legacy_Uri: findType("Uri*"),
+      legacy_UseRule: findType("UseRule*"),
+      legacy_UserDefinedCallable_legacy_AsyncEnvironment: findType("UserDefinedCallable<AsyncEnvironment*>*"),
+      legacy_UserDefinedCallable_legacy_AsyncEnvironment_2: findType("UserDefinedCallable0<AsyncEnvironment0*>*"),
+      legacy_UserDefinedCallable_legacy_Environment: findType("UserDefinedCallable<Environment*>*"),
+      legacy_UserDefinedCallable_legacy_Environment_2: findType("UserDefinedCallable0<Environment0*>*"),
+      legacy_Value: findType("Value*"),
+      legacy_Value_2: findType("Value0*"),
+      legacy_VariableDeclaration: findType("VariableDeclaration*"),
+      legacy_VariableDeclaration_2: findType("VariableDeclaration0*"),
+      legacy_WatchEvent: findType("WatchEvent*"),
+      legacy__ArgumentResults: findType("_ArgumentResults0*"),
+      legacy__ArgumentResults_2: findType("_ArgumentResults2*"),
+      legacy__EventRequest_dynamic: findType("_EventRequest<@>*"),
+      legacy__Highlight: findType("_Highlight*"),
+      legacy__MapEntry: findType("_MapEntry*"),
+      legacy_bool: findType("bool*"),
+      legacy_int: findType("int*"),
+      legacy_legacy_Object_Function: findType("Object*()*"),
+      legacy_legacy_Value_Function_legacy_List_legacy_Value: findType("Value*(List<Value*>*)*"),
+      legacy_legacy_Value_Function_legacy_List_legacy_Value_2: findType("Value0*(List<Value0*>*)*"),
+      nullable_Future_Null: findType("Future<Null>?"),
+      nullable_Object: findType("Object?"),
+      num: findType("num"),
+      void: findType("~"),
+      void_Function_Object: findType("~(Object)"),
+      void_Function_Object_StackTrace: findType("~(Object,StackTrace)")
+    };
+  })();
+  (function constants() {
+    var makeConstList = hunkHelpers.makeConstList;
+    C.Interceptor_methods = J.Interceptor.prototype;
+    C.JSArray_methods = J.JSArray.prototype;
+    C.JSBool_methods = J.JSBool.prototype;
+    C.JSDouble_methods = J.JSDouble.prototype;
+    C.JSInt_methods = J.JSInt.prototype;
+    C.JSNull_methods = J.JSNull.prototype;
+    C.JSNumber_methods = J.JSNumber.prototype;
+    C.JSString_methods = J.JSString.prototype;
+    C.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
+    C.NativeUint32List_methods = H.NativeUint32List.prototype;
+    C.NativeUint8List_methods = H.NativeUint8List.prototype;
+    C.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
+    C.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
+    C.AsciiEncoder_127 = new P.AsciiEncoder(127);
+    C.C_EmptyUnmodifiableSet1 = new O.EmptyUnmodifiableSet(H.findType("EmptyUnmodifiableSet<String*>"));
+    C.AtRootQuery_UsS = new V.AtRootQuery(false, C.C_EmptyUnmodifiableSet1, false, true);
+    C.AtRootQuery_UsS0 = new V.AtRootQuery0(false, C.C_EmptyUnmodifiableSet1, false, true);
+    C.AttributeOperator_4L5 = new N.AttributeOperator("^=");
+    C.AttributeOperator_4L50 = new N.AttributeOperator0("^=");
+    C.AttributeOperator_AuK = new N.AttributeOperator("|=");
+    C.AttributeOperator_AuK0 = new N.AttributeOperator0("|=");
+    C.AttributeOperator_fz1 = new N.AttributeOperator("~=");
+    C.AttributeOperator_fz10 = new N.AttributeOperator0("~=");
+    C.AttributeOperator_gqZ = new N.AttributeOperator("*=");
+    C.AttributeOperator_gqZ0 = new N.AttributeOperator0("*=");
+    C.AttributeOperator_mOX = new N.AttributeOperator("$=");
+    C.AttributeOperator_mOX0 = new N.AttributeOperator0("$=");
+    C.AttributeOperator_sEs = new N.AttributeOperator("=");
+    C.AttributeOperator_sEs0 = new N.AttributeOperator0("=");
+    C.BinaryOperator_1da = new V.BinaryOperator("greater than or equals", ">=", 4);
+    C.BinaryOperator_1da0 = new V.BinaryOperator0("greater than or equals", ">=", 4);
+    C.BinaryOperator_2ad = new V.BinaryOperator("modulo", "%", 6);
+    C.BinaryOperator_2ad0 = new V.BinaryOperator0("modulo", "%", 6);
+    C.BinaryOperator_33h = new V.BinaryOperator("less than or equals", "<=", 4);
+    C.BinaryOperator_33h0 = new V.BinaryOperator0("less than or equals", "<=", 4);
+    C.BinaryOperator_8qt = new V.BinaryOperator("less than", "<", 4);
+    C.BinaryOperator_8qt0 = new V.BinaryOperator0("less than", "<", 4);
+    C.BinaryOperator_AcR = new V.BinaryOperator("greater than", ">", 4);
+    C.BinaryOperator_AcR0 = new V.BinaryOperator("plus", "+", 5);
+    C.BinaryOperator_AcR1 = new V.BinaryOperator0("greater than", ">", 4);
+    C.BinaryOperator_AcR2 = new V.BinaryOperator0("plus", "+", 5);
+    C.BinaryOperator_O1M = new V.BinaryOperator("times", "*", 6);
+    C.BinaryOperator_O1M0 = new V.BinaryOperator0("times", "*", 6);
+    C.BinaryOperator_RTB = new V.BinaryOperator("divided by", "/", 6);
+    C.BinaryOperator_RTB0 = new V.BinaryOperator0("divided by", "/", 6);
+    C.BinaryOperator_YlX = new V.BinaryOperator("equals", "==", 3);
+    C.BinaryOperator_YlX0 = new V.BinaryOperator0("equals", "==", 3);
+    C.BinaryOperator_and_and_2 = new V.BinaryOperator("and", "and", 2);
+    C.BinaryOperator_and_and_20 = new V.BinaryOperator0("and", "and", 2);
+    C.BinaryOperator_i5H = new V.BinaryOperator("not equals", "!=", 3);
+    C.BinaryOperator_i5H0 = new V.BinaryOperator0("not equals", "!=", 3);
+    C.BinaryOperator_iyO = new V.BinaryOperator("minus", "-", 5);
+    C.BinaryOperator_iyO0 = new V.BinaryOperator0("minus", "-", 5);
+    C.BinaryOperator_kjl = new V.BinaryOperator("single equals", "=", 0);
+    C.BinaryOperator_kjl0 = new V.BinaryOperator0("single equals", "=", 0);
+    C.BinaryOperator_or_or_1 = new V.BinaryOperator("or", "or", 1);
+    C.BinaryOperator_or_or_10 = new V.BinaryOperator0("or", "or", 1);
+    C.C_AsciiCodec = new P.AsciiCodec();
+    C.C_AsciiGlyphSet = new A.AsciiGlyphSet();
+    C.C_Base64Encoder = new P.Base64Encoder();
+    C.C_Base64Codec = new P.Base64Codec();
+    C.C_DefaultEquality = new U.DefaultEquality();
+    C.C_EmptyExtender = new T.EmptyExtender();
+    C.C_EmptyExtender0 = new T.EmptyExtender0();
+    C.C_EmptyIterator = new H.EmptyIterator();
+    C.C_EmptyUnmodifiableSet = new O.EmptyUnmodifiableSet(H.findType("EmptyUnmodifiableSet<SimpleSelector*>"));
+    C.C_EmptyUnmodifiableSet0 = new O.EmptyUnmodifiableSet(H.findType("EmptyUnmodifiableSet<SimpleSelector0*>"));
+    C.C_IterableEquality = new U.IterableEquality();
+    C.C_JS_CONST = function getTagFallback(o) {
+  var s = Object.prototype.toString.call(o);
+  return s.substring(8, s.length - 1);
+};
+    C.C_JS_CONST0 = function() {
+  var toStringFunction = Object.prototype.toString;
+  function getTag(o) {
+    var s = toStringFunction.call(o);
+    return s.substring(8, s.length - 1);
+  }
+  function getUnknownTag(object, tag) {
+    if (/^HTML[A-Z].*Element$/.test(tag)) {
+      var name = toStringFunction.call(object);
+      if (name == "[object Object]") return null;
+      return "HTMLElement";
+    }
+  }
+  function getUnknownTagGenericBrowser(object, tag) {
+    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
+    return getUnknownTag(object, tag);
+  }
+  function prototypeForTag(tag) {
+    if (typeof window == "undefined") return null;
+    if (typeof window[tag] == "undefined") return null;
+    var constructor = window[tag];
+    if (typeof constructor != "function") return null;
+    return constructor.prototype;
+  }
+  function discriminator(tag) { return null; }
+  var isBrowser = typeof navigator == "object";
+  return {
+    getTag: getTag,
+    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
+    prototypeForTag: prototypeForTag,
+    discriminator: discriminator };
+};
+    C.C_JS_CONST6 = function(getTagFallback) {
+  return function(hooks) {
+    if (typeof navigator != "object") return hooks;
+    var ua = navigator.userAgent;
+    if (ua.indexOf("DumpRenderTree") >= 0) return hooks;
+    if (ua.indexOf("Chrome") >= 0) {
+      function confirm(p) {
+        return typeof window == "object" && window[p] && window[p].name == p;
+      }
+      if (confirm("Window") && confirm("HTMLElement")) return hooks;
+    }
+    hooks.getTag = getTagFallback;
+  };
+};
+    C.C_JS_CONST1 = function(hooks) {
+  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
+  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
+};
+    C.C_JS_CONST2 = function(hooks) {
+  var getTag = hooks.getTag;
+  var prototypeForTag = hooks.prototypeForTag;
+  function getTagFixed(o) {
+    var tag = getTag(o);
+    if (tag == "Document") {
+      if (!!o.xmlVersion) return "!Document";
+      return "!HTMLDocument";
+    }
+    return tag;
+  }
+  function prototypeForTagFixed(tag) {
+    if (tag == "Document") return null;
+    return prototypeForTag(tag);
+  }
+  hooks.getTag = getTagFixed;
+  hooks.prototypeForTag = prototypeForTagFixed;
+};
+    C.C_JS_CONST5 = function(hooks) {
+  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
+  if (userAgent.indexOf("Firefox") == -1) return hooks;
+  var getTag = hooks.getTag;
+  var quickMap = {
+    "BeforeUnloadEvent": "Event",
+    "DataTransfer": "Clipboard",
+    "GeoGeolocation": "Geolocation",
+    "Location": "!Location",
+    "WorkerMessageEvent": "MessageEvent",
+    "XMLDocument": "!Document"};
+  function getTagFirefox(o) {
+    var tag = getTag(o);
+    return quickMap[tag] || tag;
+  }
+  hooks.getTag = getTagFirefox;
+};
+    C.C_JS_CONST4 = function(hooks) {
+  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
+  if (userAgent.indexOf("Trident/") == -1) return hooks;
+  var getTag = hooks.getTag;
+  var quickMap = {
+    "BeforeUnloadEvent": "Event",
+    "DataTransfer": "Clipboard",
+    "HTMLDDElement": "HTMLElement",
+    "HTMLDTElement": "HTMLElement",
+    "HTMLPhraseElement": "HTMLElement",
+    "Position": "Geoposition"
+  };
+  function getTagIE(o) {
+    var tag = getTag(o);
+    var newTag = quickMap[tag];
+    if (newTag) return newTag;
+    if (tag == "Object") {
+      if (window.DataView && (o instanceof window.DataView)) return "DataView";
+    }
+    return tag;
+  }
+  function prototypeForTagIE(tag) {
+    var constructor = window[tag];
+    if (constructor == null) return null;
+    return constructor.prototype;
+  }
+  hooks.getTag = getTagIE;
+  hooks.prototypeForTag = prototypeForTagIE;
+};
+    C.C_JS_CONST3 = function(hooks) { return hooks; }
+;
+    C.C_JsonCodec = new P.JsonCodec();
+    C.C_LineFeed = new N.LineFeed();
+    C.C_ListEquality = new U.ListEquality();
+    C.C_MapEquality = new U.MapEquality();
+    C.C_OutOfMemoryError = new P.OutOfMemoryError();
+    C.C_SassNull0 = new O.SassNull();
+    C.C_SassNull = new O.SassNull0();
+    C.C_StderrLogger = new S.StderrLogger0();
+    C.C_UnicodeGlyphSet = new K.UnicodeGlyphSet();
+    C.C_Utf8Codec = new P.Utf8Codec();
+    C.C_Utf8Encoder = new P.Utf8Encoder();
+    C.C__DelayedDone = new P._DelayedDone();
+    C.C__JSRandom = new P._JSRandom();
+    C.C__Required = new H._Required();
+    C.C__RootZone = new P._RootZone();
+    C.ChangeType_add = new E.ChangeType("add");
+    C.ChangeType_modify = new E.ChangeType("modify");
+    C.ChangeType_remove = new E.ChangeType("remove");
+    C.Combinator_CzM = new S.Combinator("~");
+    C.Combinator_CzM0 = new S.Combinator0("~");
+    C.Combinator_sgq = new S.Combinator(">");
+    C.Combinator_sgq0 = new S.Combinator0(">");
+    C.Combinator_uzg = new S.Combinator("+");
+    C.Combinator_uzg0 = new S.Combinator0("+");
+    C.List_empty = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_String);
+    C.Map_empty12 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,ConfiguredValue*>"));
+    C.Configuration_Map_empty_null_true = new A.Configuration(C.Map_empty12, null, true);
+    C.Map_empty13 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,ConfiguredValue0*>"));
+    C.Configuration_Map_empty_null_true0 = new A.Configuration0(C.Map_empty13, null, true);
+    C.Duration_0 = new P.Duration(0);
+    C.ExtendMode_allTargets = new L.ExtendMode("allTargets");
+    C.ExtendMode_allTargets0 = new L.ExtendMode0("allTargets");
+    C.ExtendMode_normal = new L.ExtendMode("normal");
+    C.ExtendMode_normal0 = new L.ExtendMode0("normal");
+    C.ExtendMode_replace = new L.ExtendMode("replace");
+    C.ExtendMode_replace0 = new L.ExtendMode0("replace");
+    C.JsonEncoder_null = new P.JsonEncoder(null);
+    C.LineFeed_D6m = new N.LineFeed0("lf", "\n");
+    C.LineFeed_Mss = new N.LineFeed0("crlf", "\r\n");
+    C.LineFeed_a1Y = new N.LineFeed0("lfcr", "\n\r");
+    C.LineFeed_kMT = new N.LineFeed0("cr", "\r");
+    C.ListSeparator_comma = new D.ListSeparator("comma");
+    C.ListSeparator_comma0 = new D.ListSeparator0("comma");
+    C.ListSeparator_space = new D.ListSeparator("space");
+    C.ListSeparator_space0 = new D.ListSeparator0("space");
+    C.ListSeparator_undecided = new D.ListSeparator("undecided");
+    C.ListSeparator_undecided0 = new D.ListSeparator0("undecided");
+    C.List_2Vk = H.setRuntimeTypeInfo(makeConstList([0, 0, 32776, 33792, 1, 10240, 0, 0]), type$.JSArray_legacy_int);
+    C.List_CVk = H.setRuntimeTypeInfo(makeConstList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431]), type$.JSArray_legacy_int);
+    C.List_JYB = H.setRuntimeTypeInfo(makeConstList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]), type$.JSArray_legacy_int);
+    C.List_empty9 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<Null>"));
+    C.List_empty22 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_dynamic);
+    C.List_empty8 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Argument);
+    C.List_empty20 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Argument_2);
+    C.List_empty21 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_AsyncCallable);
+    C.List_empty23 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<AsyncImporter0*>"));
+    C.List_empty4 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_ComplexSelector);
+    C.List_empty15 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_ComplexSelector_2);
+    C.List_empty6 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_ConfiguredVariable);
+    C.List_empty18 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_ConfiguredVariable_2);
+    C.List_empty0 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_CssNode);
+    C.List_empty12 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_CssNode_2);
+    C.List_empty7 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Expression);
+    C.List_empty19 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Expression_2);
+    C.List_empty2 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Extension);
+    C.List_empty13 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Extension_2);
+    C.List_empty10 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Importer);
+    C.List_empty17 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<Importer0*>"));
+    C.List_empty3 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<Module<Null>*>"));
+    C.List_empty14 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<Module0<Null>*>"));
+    C.List_empty11 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Statement);
+    C.List_empty5 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Value);
+    C.List_empty16 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Value_2);
+    C.List_empty1 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_int);
+    C.List_gRj = H.setRuntimeTypeInfo(makeConstList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
+    C.List_nxB = H.setRuntimeTypeInfo(makeConstList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
+    C.List_qFt = H.setRuntimeTypeInfo(makeConstList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767]), type$.JSArray_legacy_int);
+    C.List_qNA = H.setRuntimeTypeInfo(makeConstList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
+    C.List_qg40 = H.setRuntimeTypeInfo(makeConstList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_legacy_int);
+    C.List_qg4 = H.setRuntimeTypeInfo(makeConstList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_legacy_int);
+    C.List_K2O = H.setRuntimeTypeInfo(makeConstList(["in", "cm", "pc", "mm", "q", "pt", "px", "deg", "grad", "rad", "turn", "s", "ms", "Hz", "kHz", "dpi", "dpcm", "dppx"]), type$.JSArray_legacy_String);
+    C.List_aha = H.setRuntimeTypeInfo(makeConstList(["in", "cm", "pc", "mm", "q", "pt", "px"]), type$.JSArray_legacy_String);
+    C.Map_ahsJO = new H.ConstantStringMap(7, {in: 1, cm: 0.39370078740157477, pc: 0.16666666666666666, mm: 0.03937007874015748, q: 0.00984251968503937, pt: 0.013888888888888888, px: 0.010416666666666666}, C.List_aha, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_ahM6L = new H.ConstantStringMap(7, {in: 2.54, cm: 1, pc: 0.42333333333333334, mm: 0.1, q: 0.025, pt: 0.035277777777777776, px: 0.026458333333333334}, C.List_aha, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_ahNsa = new H.ConstantStringMap(7, {in: 6, cm: 2.3622047244094486, pc: 1, mm: 0.2362204724409449, q: 0.05905511811023623, pt: 0.08333333333333333, px: 0.0625}, C.List_aha, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_ahPSt = new H.ConstantStringMap(7, {in: 25.4, cm: 10, pc: 4.233333333333333, mm: 1, q: 0.25, pt: 0.35277777777777775, px: 0.26458333333333334}, C.List_aha, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_ahgya = new H.ConstantStringMap(7, {in: 101.6, cm: 40, pc: 16.933333333333334, mm: 4, q: 1, pt: 1.411111111111111, px: 1.0583333333333333}, C.List_aha, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_ahGvh = new H.ConstantStringMap(7, {in: 72, cm: 28.346456692913385, pc: 12, mm: 2.834645669291339, q: 0.7086614173228347, pt: 1, px: 0.75}, C.List_aha, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_ahkuc = new H.ConstantStringMap(7, {in: 96, cm: 37.79527559055118, pc: 16, mm: 3.7795275590551185, q: 0.9448818897637796, pt: 1.3333333333333333, px: 1}, C.List_aha, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.List_deg_grad_rad_turn = H.setRuntimeTypeInfo(makeConstList(["deg", "grad", "rad", "turn"]), type$.JSArray_legacy_String);
+    C.Map_EGyvr = new H.ConstantStringMap(4, {deg: 1, grad: 0.9, rad: 57.29577951308232, turn: 360}, C.List_deg_grad_rad_turn, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_EGfqB = new H.ConstantStringMap(4, {deg: 1.1111111111111112, grad: 1, rad: 63.66197723675813, turn: 400}, C.List_deg_grad_rad_turn, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_EGswR = new H.ConstantStringMap(4, {deg: 0.017453292519943295, grad: 0.015707963267948967, rad: 1, turn: 6.283185307179586}, C.List_deg_grad_rad_turn, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_EGY2F = new H.ConstantStringMap(4, {deg: 0.002777777777777778, grad: 0.0025, rad: 0.15915494309189535, turn: 1}, C.List_deg_grad_rad_turn, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.List_s_ms = H.setRuntimeTypeInfo(makeConstList(["s", "ms"]), type$.JSArray_legacy_String);
+    C.Map_ma2bi = new H.ConstantStringMap(2, {s: 1, ms: 0.001}, C.List_s_ms, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_maDht = new H.ConstantStringMap(2, {s: 1000, ms: 1}, C.List_s_ms, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.List_Hz_kHz = H.setRuntimeTypeInfo(makeConstList(["Hz", "kHz"]), type$.JSArray_legacy_String);
+    C.Map_0IpUe = new H.ConstantStringMap(2, {Hz: 1, kHz: 1000}, C.List_Hz_kHz, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_0IVs0 = new H.ConstantStringMap(2, {Hz: 0.001, kHz: 1}, C.List_Hz_kHz, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.List_dpi_dpcm_dppx = H.setRuntimeTypeInfo(makeConstList(["dpi", "dpcm", "dppx"]), type$.JSArray_legacy_String);
+    C.Map_H2OWd = new H.ConstantStringMap(3, {dpi: 1, dpcm: 2.54, dppx: 96}, C.List_dpi_dpcm_dppx, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_H24em = new H.ConstantStringMap(3, {dpi: 0.39370078740157477, dpcm: 1, dppx: 37.79527559055118}, C.List_dpi_dpcm_dppx, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_H25Om = new H.ConstantStringMap(3, {dpi: 0.010416666666666666, dpcm: 0.026458333333333334, dppx: 1}, C.List_dpi_dpcm_dppx, type$.ConstantStringMap_of_legacy_String_and_legacy_num);
+    C.Map_K2BWj = new H.ConstantStringMap(18, {in: C.Map_ahsJO, cm: C.Map_ahM6L, pc: C.Map_ahNsa, mm: C.Map_ahPSt, q: C.Map_ahgya, pt: C.Map_ahGvh, px: C.Map_ahkuc, deg: C.Map_EGyvr, grad: C.Map_EGfqB, rad: C.Map_EGswR, turn: C.Map_EGY2F, s: C.Map_ma2bi, ms: C.Map_maDht, Hz: C.Map_0IpUe, kHz: C.Map_0IVs0, dpi: C.Map_H2OWd, dpcm: C.Map_H24em, dppx: C.Map_H25Om}, C.List_K2O, H.findType("ConstantStringMap<String*,Map<String*,num*>*>"));
+    C.List_U8g = H.setRuntimeTypeInfo(makeConstList(["length", "angle", "time", "frequency", "pixel density"]), type$.JSArray_legacy_String);
+    C.Map_U8AHF = new H.ConstantStringMap(5, {length: C.List_aha, angle: C.List_deg_grad_rad_turn, time: C.List_s_ms, frequency: C.List_Hz_kHz, "pixel density": C.List_dpi_dpcm_dppx}, C.List_U8g, H.findType("ConstantStringMap<String*,List<String*>*>"));
+    C.Map_empty1 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,AstNode*>"));
+    C.Map_empty7 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,AstNode0*>"));
+    C.Map_empty3 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,Expression*>"));
+    C.Map_empty9 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,Expression0*>"));
+    C.Map_empty4 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,Module<AsyncCallable*>*>"));
+    C.Map_empty0 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,Module<Callable*>*>"));
+    C.Map_empty11 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,Module0<AsyncCallable0*>*>"));
+    C.Map_empty6 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,Module0<Callable0*>*>"));
+    C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,SourceFile*>"));
+    C.Map_empty5 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,String*>"));
+    C.Map_empty2 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,Value*>"));
+    C.Map_empty8 = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<String*,Value0*>"));
+    C.List_empty24 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<Symbol0*>"));
+    C.Map_empty10 = new H.ConstantStringMap(0, {}, C.List_empty24, H.findType("ConstantStringMap<Symbol0*,@>"));
+    C.OptionType_YwU = new G.OptionType("OptionType.single");
+    C.OptionType_nMZ = new G.OptionType("OptionType.flag");
+    C.OptionType_qyr = new G.OptionType("OptionType.multiple");
+    C.OutputStyle_compressed = new N.OutputStyle("compressed");
+    C.OutputStyle_compressed0 = new N.OutputStyle0("compressed");
+    C.OutputStyle_expanded0 = new N.OutputStyle("expanded");
+    C.OutputStyle_expanded = new N.OutputStyle0("expanded");
+    C.SassBoolean_false0 = new Z.SassBoolean(false);
+    C.SassBoolean_false = new Z.SassBoolean0(false);
+    C.SassBoolean_true0 = new Z.SassBoolean(true);
+    C.SassBoolean_true = new Z.SassBoolean0(true);
+    C.SassList_lmy = new D.SassList(C.List_empty5, C.ListSeparator_comma, false);
+    C.SassList_lmy0 = new D.SassList0(C.List_empty16, C.ListSeparator_comma0, false);
+    C.Map_empty14 = new H.ConstantStringMap(0, {}, C.List_empty5, H.findType("ConstantStringMap<Value*,Value*>"));
+    C.SassMap_Map_empty = new A.SassMap(C.Map_empty14);
+    C.Map_empty15 = new H.ConstantStringMap(0, {}, C.List_empty16, H.findType("ConstantStringMap<Value0*,Value0*>"));
+    C.SassMap_Map_empty0 = new A.SassMap0(C.Map_empty15);
+    C.List_empty25 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Module_legacy_AsyncCallable);
+    C.Map_empty16 = new H.ConstantStringMap(0, {}, C.List_empty25, H.findType("ConstantStringMap<Module<AsyncCallable*>*,Null>"));
+    C.Set_empty0 = new P._UnmodifiableSet(C.Map_empty16, H.findType("_UnmodifiableSet<Module<AsyncCallable*>*>"));
+    C.List_empty26 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Module_legacy_Callable);
+    C.Map_empty17 = new H.ConstantStringMap(0, {}, C.List_empty26, H.findType("ConstantStringMap<Module<Callable*>*,Null>"));
+    C.Set_empty = new P._UnmodifiableSet(C.Map_empty17, H.findType("_UnmodifiableSet<Module<Callable*>*>"));
+    C.List_empty27 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Module_legacy_AsyncCallable_2);
+    C.Map_empty18 = new H.ConstantStringMap(0, {}, C.List_empty27, H.findType("ConstantStringMap<Module0<AsyncCallable0*>*,Null>"));
+    C.Set_empty3 = new P._UnmodifiableSet(C.Map_empty18, H.findType("_UnmodifiableSet<Module0<AsyncCallable0*>*>"));
+    C.List_empty28 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_Module_legacy_Callable_2);
+    C.Map_empty19 = new H.ConstantStringMap(0, {}, C.List_empty28, H.findType("ConstantStringMap<Module0<Callable0*>*,Null>"));
+    C.Set_empty2 = new P._UnmodifiableSet(C.Map_empty19, H.findType("_UnmodifiableSet<Module0<Callable0*>*>"));
+    C.List_empty29 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_StylesheetNode);
+    C.Map_empty20 = new H.ConstantStringMap(0, {}, C.List_empty29, H.findType("ConstantStringMap<StylesheetNode*,Null>"));
+    C.Set_empty1 = new P._UnmodifiableSet(C.Map_empty20, H.findType("_UnmodifiableSet<StylesheetNode*>"));
+    C.StderrLogger_false = new S.StderrLogger(false);
+    C.Symbol__warn = new H.Symbol("_warn");
+    C.Symbol_call = new H.Symbol("call");
+    C.Syntax_CSS = new M.Syntax("CSS");
+    C.Syntax_CSS0 = new M.Syntax0("CSS");
+    C.Syntax_SCSS = new M.Syntax("SCSS");
+    C.Syntax_SCSS0 = new M.Syntax0("SCSS");
+    C.Syntax_Sass = new M.Syntax("Sass");
+    C.Syntax_Sass0 = new M.Syntax0("Sass");
+    C.List_empty30 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<CssValue<SelectorList*>*>"));
+    C.Map_empty21 = new H.ConstantStringMap(0, {}, C.List_empty30, H.findType("ConstantStringMap<CssValue<SelectorList*>*,ModifiableCssValue<SelectorList*>*>"));
+    C.Tuple2_EmptyExtender_Map_empty = new S.Tuple2(C.C_EmptyExtender, C.Map_empty21, type$.Tuple2_of_legacy_Extender_and_legacy_Map_of_legacy_CssValue_legacy_SelectorList_and_legacy_ModifiableCssValue_legacy_SelectorList);
+    C.List_empty31 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<CssValue0<SelectorList0*>*>"));
+    C.Map_empty22 = new H.ConstantStringMap(0, {}, C.List_empty31, H.findType("ConstantStringMap<CssValue0<SelectorList0*>*,ModifiableCssValue0<SelectorList0*>*>"));
+    C.Tuple2_EmptyExtender_Map_empty0 = new S.Tuple2(C.C_EmptyExtender0, C.Map_empty22, type$.Tuple2_of_legacy_Extender_and_legacy_Map_of_legacy_CssValue_legacy_SelectorList_and_legacy_ModifiableCssValue_legacy_SelectorList_2);
+    C.Type_Null_Yyn = H.typeLiteral("Null");
+    C.UnaryOperator_U4G = new X.UnaryOperator("minus", "-");
+    C.UnaryOperator_U4G0 = new X.UnaryOperator0("minus", "-");
+    C.UnaryOperator_j2w = new X.UnaryOperator("plus", "+");
+    C.UnaryOperator_j2w0 = new X.UnaryOperator0("plus", "+");
+    C.UnaryOperator_not_not = new X.UnaryOperator("not", "not");
+    C.UnaryOperator_not_not0 = new X.UnaryOperator0("not", "not");
+    C.UnaryOperator_zDx = new X.UnaryOperator("divide", "/");
+    C.UnaryOperator_zDx0 = new X.UnaryOperator0("divide", "/");
+    C.Utf8Decoder_false = new P.Utf8Decoder(false);
+    C._IterationMarker_null_2 = new P._IterationMarker(null, 2);
+    C._PathDirection_8Gl = new M._PathDirection("at root");
+    C._PathDirection_988 = new M._PathDirection("below root");
+    C._PathDirection_FIw = new M._PathDirection("reaches root");
+    C._PathDirection_ZGD = new M._PathDirection("above root");
+    C._PathRelation_different = new M._PathRelation("different");
+    C._PathRelation_equal = new M._PathRelation("equal");
+    C._PathRelation_inconclusive = new M._PathRelation("inconclusive");
+    C._PathRelation_within = new M._PathRelation("within");
+    C._RegisterBinaryZoneFunction_kGu = new P._RegisterBinaryZoneFunction(C.C__RootZone, P.async___rootRegisterBinaryCallback$closure());
+    C._RegisterNullaryZoneFunction__RootZone__rootRegisterCallback = new P._RegisterNullaryZoneFunction(C.C__RootZone, P.async___rootRegisterCallback$closure());
+    C._RegisterUnaryZoneFunction_Bqo = new P._RegisterUnaryZoneFunction(C.C__RootZone, P.async___rootRegisterUnaryCallback$closure());
+    C._RunBinaryZoneFunction__RootZone__rootRunBinary = new P._RunBinaryZoneFunction(C.C__RootZone, P.async___rootRunBinary$closure());
+    C._RunNullaryZoneFunction__RootZone__rootRun = new P._RunNullaryZoneFunction(C.C__RootZone, P.async___rootRun$closure());
+    C._RunUnaryZoneFunction__RootZone__rootRunUnary = new P._RunUnaryZoneFunction(C.C__RootZone, P.async___rootRunUnary$closure());
+    C._SingletonCssMediaQueryMergeResult_empty = new F._SingletonCssMediaQueryMergeResult("empty");
+    C._SingletonCssMediaQueryMergeResult_empty0 = new F._SingletonCssMediaQueryMergeResult0("empty");
+    C._SingletonCssMediaQueryMergeResult_unrepresentable = new F._SingletonCssMediaQueryMergeResult("unrepresentable");
+    C._SingletonCssMediaQueryMergeResult_unrepresentable0 = new F._SingletonCssMediaQueryMergeResult0("unrepresentable");
+    C._StreamGroupState_canceled = new L._StreamGroupState("canceled");
+    C._StreamGroupState_dormant = new L._StreamGroupState("dormant");
+    C._StreamGroupState_listening = new L._StreamGroupState("listening");
+    C._StreamGroupState_paused = new L._StreamGroupState("paused");
+    C._StringStackTrace_3uE = new P._StringStackTrace("");
+    C._ZoneFunction_3bB = new P._ZoneFunction(C.C__RootZone, P.async___rootCreatePeriodicTimer$closure());
+    C._ZoneFunction_NMc = new P._ZoneFunction(C.C__RootZone, P.async___rootHandleUncaughtError$closure());
+    C._ZoneFunction__RootZone__rootCreateTimer = new P._ZoneFunction(C.C__RootZone, P.async___rootCreateTimer$closure());
+    C._ZoneFunction__RootZone__rootErrorCallback = new P._ZoneFunction(C.C__RootZone, P.async___rootErrorCallback$closure());
+    C._ZoneFunction__RootZone__rootFork = new P._ZoneFunction(C.C__RootZone, P.async___rootFork$closure());
+    C._ZoneFunction__RootZone__rootPrint = new P._ZoneFunction(C.C__RootZone, P.async___rootPrint$closure());
+    C._ZoneFunction__RootZone__rootScheduleMicrotask = new P._ZoneFunction(C.C__RootZone, P.async___rootScheduleMicrotask$closure());
+    C._ZoneSpecification_ALf = new P._ZoneSpecification(null, null, null, null, null, null, null, null, null, null, null, null, null);
+  })();
+  (function staticFields() {
+    $._JS_INTEROP_INTERCEPTOR_TAG = null;
+    $.printToZone = null;
+    $.Closure_functionCounter = 0;
+    $.BoundClosure_selfFieldNameCache = null;
+    $.BoundClosure_receiverFieldNameCache = null;
+    $.getTagFunction = null;
+    $.alternateTagFunction = null;
+    $.prototypeForTagFunction = null;
+    $.dispatchRecordsForInstanceTags = null;
+    $.interceptorsForUncacheableTags = null;
+    $.initNativeDispatchFlag = null;
+    $._nextCallback = null;
+    $._lastCallback = null;
+    $._lastPriorityCallback = null;
+    $._isInCallbackLoop = false;
+    $.Zone__current = C.C__RootZone;
+    $._RootZone__rootDelegate = null;
+    $._toStringVisiting = H.setRuntimeTypeInfo([], H.findType("JSArray<Object>"));
+    $._fs = null;
+    $._currentUriBase = null;
+    $._current = null;
+    $._subselectorPseudos = P.LinkedHashSet_LinkedHashSet$_literal(["matches", "any", "nth-child", "nth-last-child"], type$.legacy_String);
+    $._features = P.LinkedHashSet_LinkedHashSet$_literal(["global-variable-shadowing", "extend-selector-pseudoclass", "units-level-3", "at-error", "custom-property"], type$.legacy_String);
+    $._inImportRule = false;
+    $._realCaseCache = function() {
+      var t1 = type$.legacy_String;
+      return P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+    }();
+    $._selectorPseudoClasses = P.LinkedHashSet_LinkedHashSet$_literal(["not", "matches", "current", "any", "has", "host", "host-context"], type$.legacy_String);
+    $._selectorPseudoElements = P.LinkedHashSet_LinkedHashSet$_literal(["slotted"], type$.legacy_String);
+    $._glyphs = C.C_UnicodeGlyphSet;
+    $._subselectorPseudos0 = P.LinkedHashSet_LinkedHashSet$_literal(["matches", "any", "nth-child", "nth-last-child"], type$.legacy_String);
+    $._realCaseCache0 = function() {
+      var t1 = type$.legacy_String;
+      return P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+    }();
+    $._features0 = P.LinkedHashSet_LinkedHashSet$_literal(["global-variable-shadowing", "extend-selector-pseudoclass", "units-level-3", "at-error", "custom-property"], type$.legacy_String);
+    $._selectorPseudoClasses0 = P.LinkedHashSet_LinkedHashSet$_literal(["not", "matches", "current", "any", "has", "host", "host-context"], type$.legacy_String);
+    $._selectorPseudoElements0 = P.LinkedHashSet_LinkedHashSet$_literal(["slotted"], type$.legacy_String);
+    $._inImportRule0 = false;
+  })();
+  (function lazyInitializers() {
+    var _lazy = hunkHelpers.lazy,
+      _lazyOld = hunkHelpers.lazyOld;
+    _lazy($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", function() {
+      return H.getIsolateAffinityTag("_$dart_dartClosure");
+    });
+    _lazy($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({
+        toString: function() {
+          return "$receiver$";
+        }
+      }));
+    });
+    _lazy($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", function() {
+      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null,
+        toString: function() {
+          return "$receiver$";
+        }
+      }));
+    });
+    _lazy($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
+    });
+    _lazy($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(function() {
+        var $argumentsExpr$ = '$arguments$';
+        try {
+          null.$method$($argumentsExpr$);
+        } catch (e) {
+          return e.message;
+        }
+      }());
+    });
+    _lazy($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
+    });
+    _lazy($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(function() {
+        var $argumentsExpr$ = '$arguments$';
+        try {
+          (void 0).$method$($argumentsExpr$);
+        } catch (e) {
+          return e.message;
+        }
+      }());
+    });
+    _lazy($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
+    });
+    _lazy($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(function() {
+        try {
+          null.$method$;
+        } catch (e) {
+          return e.message;
+        }
+      }());
+    });
+    _lazy($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
+    });
+    _lazy($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
+      return H.TypeErrorDecoder_extractPattern(function() {
+        try {
+          (void 0).$method$;
+        } catch (e) {
+          return e.message;
+        }
+      }());
+    });
+    _lazy($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", function() {
+      return P._AsyncRun__initializeScheduleImmediate();
+    });
+    _lazy($, "Future__nullFuture", "$get$Future__nullFuture", function() {
+      return P._Future$zoneValue(null, C.C__RootZone, type$.Null);
+    });
+    _lazy($, "Future__falseFuture", "$get$Future__falseFuture", function() {
+      return P._Future$zoneValue(false, C.C__RootZone, type$.bool);
+    });
+    _lazy($, "_RootZone__rootMap", "$get$_RootZone__rootMap", function() {
+      var t1 = type$.dynamic;
+      return P.HashMap_HashMap(t1, t1);
+    });
+    _lazy($, "Utf8Decoder__decoder", "$get$Utf8Decoder__decoder", function() {
+      return new P.Utf8Decoder_closure().call$0();
+    });
+    _lazy($, "Utf8Decoder__decoderNonfatal", "$get$Utf8Decoder__decoderNonfatal", function() {
+      return new P.Utf8Decoder_closure0().call$0();
+    });
+    _lazy($, "_Base64Decoder__inverseAlphabet", "$get$_Base64Decoder__inverseAlphabet", function() {
+      return H.NativeInt8List__create1(H._ensureNativeList(H.setRuntimeTypeInfo([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -1, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2], type$.JSArray_int)));
+    });
+    _lazy($, "_Uri__isWindowsCached", "$get$_Uri__isWindowsCached", function() {
+      return typeof process != "undefined" && Object.prototype.toString.call(process) == "[object process]" && process.platform == "win32";
+    });
+    _lazy($, "_Uri__needsNoEncoding", "$get$_Uri__needsNoEncoding", function() {
+      return P.RegExp_RegExp("^[\\-\\.0-9A-Z_a-z~]*$", false);
+    });
+    _lazy($, "_hasErrorStackProperty", "$get$_hasErrorStackProperty", function() {
+      return new Error().stack != void 0;
+    });
+    _lazy($, "_scannerTables", "$get$_scannerTables", function() {
+      return P._createTables();
+    });
+    _lazyOld($, "Option__invalidChars", "$get$Option__invalidChars", function() {
+      return P.RegExp_RegExp("[ \\t\\r\\n\"'\\\\/]", false);
+    });
+    _lazyOld($, "alwaysValid", "$get$alwaysValid", function() {
+      return new Q.closure113();
+    });
+    _lazyOld($, "readline", "$get$readline", function() {
+      return self.readline;
+    });
+    _lazyOld($, "windows", "$get$windows", function() {
+      return M.Context_Context($.$get$Style_windows());
+    });
+    _lazyOld($, "url", "$get$url", function() {
+      return M.Context_Context($.$get$Style_url());
+    });
+    _lazyOld($, "context", "$get$context", function() {
+      return new M.Context($.$get$Style_platform(), null);
+    });
+    _lazyOld($, "Style_posix", "$get$Style_posix", function() {
+      return new E.PosixStyle(P.RegExp_RegExp("/", false), P.RegExp_RegExp("[^/]$", false), P.RegExp_RegExp("^/", false));
+    });
+    _lazyOld($, "Style_windows", "$get$Style_windows", function() {
+      return new L.WindowsStyle(P.RegExp_RegExp("[/\\\\]", false), P.RegExp_RegExp("[^/\\\\]$", false), P.RegExp_RegExp("^(\\\\\\\\[^\\\\]+\\\\[^\\\\/]+|[a-zA-Z]:[/\\\\])", false), P.RegExp_RegExp("^[/\\\\](?![/\\\\])", false));
+    });
+    _lazyOld($, "Style_url", "$get$Style_url", function() {
+      return new F.UrlStyle(P.RegExp_RegExp("/", false), P.RegExp_RegExp("(^[a-zA-Z][-+.a-zA-Z\\d]*://|[^/])$", false), P.RegExp_RegExp("[a-zA-Z][-+.a-zA-Z\\d]*://[^/]*", false), P.RegExp_RegExp("^/", false));
+    });
+    _lazyOld($, "Style_platform", "$get$Style_platform", function() {
+      return O.Style__getPlatformStyle();
+    });
+    _lazyOld($, "IfExpression_declaration", "$get$IfExpression_declaration", function() {
+      return B.ArgumentDeclaration_ArgumentDeclaration$parse(string$.x40funct, null);
+    });
+    _lazyOld($, "colorsByName", "$get$colorsByName", function() {
+      var _null = null;
+      return P.LinkedHashMap_LinkedHashMap$_literal(["yellowgreen", K.SassColor$rgb(154, 205, 50, _null, _null), "yellow", K.SassColor$rgb(255, 255, 0, _null, _null), "whitesmoke", K.SassColor$rgb(245, 245, 245, _null, _null), "white", K.SassColor$rgb(255, 255, 255, _null, _null), "wheat", K.SassColor$rgb(245, 222, 179, _null, _null), "violet", K.SassColor$rgb(238, 130, 238, _null, _null), "turquoise", K.SassColor$rgb(64, 224, 208, _null, _null), "transparent", K.SassColor$rgb(0, 0, 0, 0, _null), "tomato", K.SassColor$rgb(255, 99, 71, _null, _null), "thistle", K.SassColor$rgb(216, 191, 216, _null, _null), "teal", K.SassColor$rgb(0, 128, 128, _null, _null), "tan", K.SassColor$rgb(210, 180, 140, _null, _null), "steelblue", K.SassColor$rgb(70, 130, 180, _null, _null), "springgreen", K.SassColor$rgb(0, 255, 127, _null, _null), "snow", K.SassColor$rgb(255, 250, 250, _null, _null), "slategrey", K.SassColor$rgb(112, 128, 144, _null, _null), "slategray", K.SassColor$rgb(112, 128, 144, _null, _null), "slateblue", K.SassColor$rgb(106, 90, 205, _null, _null), "skyblue", K.SassColor$rgb(135, 206, 235, _null, _null), "silver", K.SassColor$rgb(192, 192, 192, _null, _null), "sienna", K.SassColor$rgb(160, 82, 45, _null, _null), "seashell", K.SassColor$rgb(255, 245, 238, _null, _null), "seagreen", K.SassColor$rgb(46, 139, 87, _null, _null), "sandybrown", K.SassColor$rgb(244, 164, 96, _null, _null), "salmon", K.SassColor$rgb(250, 128, 114, _null, _null), "saddlebrown", K.SassColor$rgb(139, 69, 19, _null, _null), "royalblue", K.SassColor$rgb(65, 105, 225, _null, _null), "rosybrown", K.SassColor$rgb(188, 143, 143, _null, _null), "red", K.SassColor$rgb(255, 0, 0, _null, _null), "rebeccapurple", K.SassColor$rgb(102, 51, 153, _null, _null), "purple", K.SassColor$rgb(128, 0, 128, _null, _null), "powderblue", K.SassColor$rgb(176, 224, 230, _null, _null), "plum", K.SassColor$rgb(221, 160, 221, _null, _null), "pink", K.SassColor$rgb(255, 192, 203, _null, _null), "peru", K.SassColor$rgb(205, 133, 63, _null, _null), "peachpuff", K.SassColor$rgb(255, 218, 185, _null, _null), "papayawhip", K.SassColor$rgb(255, 239, 213, _null, _null), "palevioletred", K.SassColor$rgb(219, 112, 147, _null, _null), "paleturquoise", K.SassColor$rgb(175, 238, 238, _null, _null), "palegreen", K.SassColor$rgb(152, 251, 152, _null, _null), "palegoldenrod", K.SassColor$rgb(238, 232, 170, _null, _null), "orchid", K.SassColor$rgb(218, 112, 214, _null, _null), "orangered", K.SassColor$rgb(255, 69, 0, _null, _null), "orange", K.SassColor$rgb(255, 165, 0, _null, _null), "olivedrab", K.SassColor$rgb(107, 142, 35, _null, _null), "olive", K.SassColor$rgb(128, 128, 0, _null, _null), "oldlace", K.SassColor$rgb(253, 245, 230, _null, _null), "navy", K.SassColor$rgb(0, 0, 128, _null, _null), "navajowhite", K.SassColor$rgb(255, 222, 173, _null, _null), "moccasin", K.SassColor$rgb(255, 228, 181, _null, _null), "mistyrose", K.SassColor$rgb(255, 228, 225, _null, _null), "mintcream", K.SassColor$rgb(245, 255, 250, _null, _null), "midnightblue", K.SassColor$rgb(25, 25, 112, _null, _null), "mediumvioletred", K.SassColor$rgb(199, 21, 133, _null, _null), "mediumturquoise", K.SassColor$rgb(72, 209, 204, _null, _null), "mediumspringgreen", K.SassColor$rgb(0, 250, 154, _null, _null), "mediumslateblue", K.SassColor$rgb(123, 104, 238, _null, _null), "mediumseagreen", K.SassColor$rgb(60, 179, 113, _null, _null), "mediumpurple", K.SassColor$rgb(147, 112, 219, _null, _null), "mediumorchid", K.SassColor$rgb(186, 85, 211, _null, _null), "mediumblue", K.SassColor$rgb(0, 0, 205, _null, _null), "mediumaquamarine", K.SassColor$rgb(102, 205, 170, _null, _null), "maroon", K.SassColor$rgb(128, 0, 0, _null, _null), "magenta", K.SassColor$rgb(255, 0, 255, _null, _null), "linen", K.SassColor$rgb(250, 240, 230, _null, _null), "limegreen", K.SassColor$rgb(50, 205, 50, _null, _null), "lime", K.SassColor$rgb(0, 255, 0, _null, _null), "lightyellow", K.SassColor$rgb(255, 255, 224, _null, _null), "lightsteelblue", K.SassColor$rgb(176, 196, 222, _null, _null), "lightslategrey", K.SassColor$rgb(119, 136, 153, _null, _null), "lightslategray", K.SassColor$rgb(119, 136, 153, _null, _null), "lightskyblue", K.SassColor$rgb(135, 206, 250, _null, _null), "lightseagreen", K.SassColor$rgb(32, 178, 170, _null, _null), "lightsalmon", K.SassColor$rgb(255, 160, 122, _null, _null), "lightpink", K.SassColor$rgb(255, 182, 193, _null, _null), "lightgrey", K.SassColor$rgb(211, 211, 211, _null, _null), "lightgreen", K.SassColor$rgb(144, 238, 144, _null, _null), "lightgray", K.SassColor$rgb(211, 211, 211, _null, _null), "lightgoldenrodyellow", K.SassColor$rgb(250, 250, 210, _null, _null), "lightcyan", K.SassColor$rgb(224, 255, 255, _null, _null), "lightcoral", K.SassColor$rgb(240, 128, 128, _null, _null), "lightblue", K.SassColor$rgb(173, 216, 230, _null, _null), "lemonchiffon", K.SassColor$rgb(255, 250, 205, _null, _null), "lawngreen", K.SassColor$rgb(124, 252, 0, _null, _null), "lavenderblush", K.SassColor$rgb(255, 240, 245, _null, _null), "lavender", K.SassColor$rgb(230, 230, 250, _null, _null), "khaki", K.SassColor$rgb(240, 230, 140, _null, _null), "ivory", K.SassColor$rgb(255, 255, 240, _null, _null), "indigo", K.SassColor$rgb(75, 0, 130, _null, _null), "indianred", K.SassColor$rgb(205, 92, 92, _null, _null), "hotpink", K.SassColor$rgb(255, 105, 180, _null, _null), "honeydew", K.SassColor$rgb(240, 255, 240, _null, _null), "grey", K.SassColor$rgb(128, 128, 128, _null, _null), "greenyellow", K.SassColor$rgb(173, 255, 47, _null, _null), "green", K.SassColor$rgb(0, 128, 0, _null, _null), "gray", K.SassColor$rgb(128, 128, 128, _null, _null), "goldenrod", K.SassColor$rgb(218, 165, 32, _null, _null), "gold", K.SassColor$rgb(255, 215, 0, _null, _null), "ghostwhite", K.SassColor$rgb(248, 248, 255, _null, _null), "gainsboro", K.SassColor$rgb(220, 220, 220, _null, _null), "fuchsia", K.SassColor$rgb(255, 0, 255, _null, _null), "forestgreen", K.SassColor$rgb(34, 139, 34, _null, _null), "floralwhite", K.SassColor$rgb(255, 250, 240, _null, _null), "firebrick", K.SassColor$rgb(178, 34, 34, _null, _null), "dodgerblue", K.SassColor$rgb(30, 144, 255, _null, _null), "dimgrey", K.SassColor$rgb(105, 105, 105, _null, _null), "dimgray", K.SassColor$rgb(105, 105, 105, _null, _null), "deepskyblue", K.SassColor$rgb(0, 191, 255, _null, _null), "deeppink", K.SassColor$rgb(255, 20, 147, _null, _null), "darkviolet", K.SassColor$rgb(148, 0, 211, _null, _null), "darkturquoise", K.SassColor$rgb(0, 206, 209, _null, _null), "darkslategrey", K.SassColor$rgb(47, 79, 79, _null, _null), "darkslategray", K.SassColor$rgb(47, 79, 79, _null, _null), "darkslateblue", K.SassColor$rgb(72, 61, 139, _null, _null), "darkseagreen", K.SassColor$rgb(143, 188, 143, _null, _null), "darksalmon", K.SassColor$rgb(233, 150, 122, _null, _null), "darkred", K.SassColor$rgb(139, 0, 0, _null, _null), "darkorchid", K.SassColor$rgb(153, 50, 204, _null, _null), "darkorange", K.SassColor$rgb(255, 140, 0, _null, _null), "darkolivegreen", K.SassColor$rgb(85, 107, 47, _null, _null), "darkmagenta", K.SassColor$rgb(139, 0, 139, _null, _null), "darkkhaki", K.SassColor$rgb(189, 183, 107, _null, _null), "darkgrey", K.SassColor$rgb(169, 169, 169, _null, _null), "darkgreen", K.SassColor$rgb(0, 100, 0, _null, _null), "darkgray", K.SassColor$rgb(169, 169, 169, _null, _null), "darkgoldenrod", K.SassColor$rgb(184, 134, 11, _null, _null), "darkcyan", K.SassColor$rgb(0, 139, 139, _null, _null), "darkblue", K.SassColor$rgb(0, 0, 139, _null, _null), "cyan", K.SassColor$rgb(0, 255, 255, _null, _null), "crimson", K.SassColor$rgb(220, 20, 60, _null, _null), "cornsilk", K.SassColor$rgb(255, 248, 220, _null, _null), "cornflowerblue", K.SassColor$rgb(100, 149, 237, _null, _null), "coral", K.SassColor$rgb(255, 127, 80, _null, _null), "chocolate", K.SassColor$rgb(210, 105, 30, _null, _null), "chartreuse", K.SassColor$rgb(127, 255, 0, _null, _null), "cadetblue", K.SassColor$rgb(95, 158, 160, _null, _null), "burlywood", K.SassColor$rgb(222, 184, 135, _null, _null), "brown", K.SassColor$rgb(165, 42, 42, _null, _null), "blueviolet", K.SassColor$rgb(138, 43, 226, _null, _null), "blue", K.SassColor$rgb(0, 0, 255, _null, _null), "blanchedalmond", K.SassColor$rgb(255, 235, 205, _null, _null), "black", K.SassColor$rgb(0, 0, 0, _null, _null), "bisque", K.SassColor$rgb(255, 228, 196, _null, _null), "beige", K.SassColor$rgb(245, 245, 220, _null, _null), "azure", K.SassColor$rgb(240, 255, 255, _null, _null), "aquamarine", K.SassColor$rgb(127, 255, 212, _null, _null), "aqua", K.SassColor$rgb(0, 255, 255, _null, _null), "antiquewhite", K.SassColor$rgb(250, 235, 215, _null, _null), "aliceblue", K.SassColor$rgb(240, 248, 255, _null, _null)], type$.legacy_String, type$.legacy_SassColor);
+    });
+    _lazyOld($, "namesByColor", "$get$namesByColor", function() {
+      var t2, t3,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_SassColor, type$.legacy_String);
+      for (t2 = $.$get$colorsByName(), t2 = t2.get$entries(t2), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t1.$indexSet(0, t3.value, t3.key);
+      }
+      return t1;
+    });
+    _lazyOld($, "ExecutableOptions__separatorBar", "$get$ExecutableOptions__separatorBar", function() {
+      return B.isWindows() ? "=" : "\u2501";
+    });
+    _lazyOld($, "ExecutableOptions__parser", "$get$ExecutableOptions__parser", function() {
+      return new B.ExecutableOptions_closure().call$0();
+    });
+    _lazyOld($, "globalFunctions", "$get$globalFunctions", function() {
+      var t2,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_BuiltInCallable);
+      for (t2 = $.$get$global0(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global1(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global2(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global3(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global4(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global5(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      t1.push(Q.BuiltInCallable$function("if", "$condition, $if-true, $if-false", new Y.closure(), null));
+      return P.UnmodifiableListView$(t1, type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "coreModules", "$get$coreModules", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$module(), $.$get$module0(), $.$get$module1(), $.$get$module2(), $.$get$module3(), $.$get$module4()], type$.JSArray_legacy_BuiltInModule_legacy_BuiltInCallable), H.findType("BuiltInModule<BuiltInCallable*>*"));
+    });
+    _lazyOld($, "_microsoftFilterStart", "$get$_microsoftFilterStart", function() {
+      return P.RegExp_RegExp("^[a-zA-Z]+\\s*=", false);
+    });
+    _lazyOld($, "global", "$get$global0", function() {
+      var _s27_ = "$red, $green, $blue, $alpha",
+        _s19_ = "$red, $green, $blue",
+        _s37_ = "$hue, $saturation, $lightness, $alpha",
+        _s29_ = "$hue, $saturation, $lightness",
+        _s17_ = "$hue, $saturation",
+        _s15_ = "$color, $amount",
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_legacy_Value_Function_legacy_List_legacy_Value;
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_red(), $.$get$_green(), $.$get$_blue(), $.$get$_mix(), Q.BuiltInCallable$overloadedFunction("rgb", P.LinkedHashMap_LinkedHashMap$_literal([_s27_, new K.closure44(), _s19_, new K.closure45(), "$color, $alpha", new K.closure46(), "$channels", new K.closure47()], t1, t2)), Q.BuiltInCallable$overloadedFunction("rgba", P.LinkedHashMap_LinkedHashMap$_literal([_s27_, new K.closure48(), _s19_, new K.closure49(), "$color, $alpha", new K.closure50(), "$channels", new K.closure51()], t1, t2)), K._function4("invert", "$color, $weight: 100%", new K.closure52()), $.$get$_hue(), $.$get$_saturation(), $.$get$_lightness(), $.$get$_complement(), Q.BuiltInCallable$overloadedFunction("hsl", P.LinkedHashMap_LinkedHashMap$_literal([_s37_, new K.closure53(), _s29_, new K.closure54(), _s17_, new K.closure55(), "$channels", new K.closure56()], t1, t2)), Q.BuiltInCallable$overloadedFunction("hsla", P.LinkedHashMap_LinkedHashMap$_literal([_s37_, new K.closure57(), _s29_, new K.closure58(), _s17_, new K.closure59(), "$channels", new K.closure60()], t1, t2)), K._function4("grayscale", "$color", new K.closure61()), K._function4("adjust-hue", "$color, $degrees", new K.closure62()), K._function4("lighten", _s15_, new K.closure63()), K._function4("darken", _s15_, new K.closure64()), Q.BuiltInCallable$overloadedFunction("saturate", P.LinkedHashMap_LinkedHashMap$_literal(["$amount", new K.closure65(), "$color, $amount", new K.closure66()], t1, t2)), K._function4("desaturate", _s15_, new K.closure67()), K._function4("opacify", _s15_, K.color___opacify$closure()), K._function4("fade-in", _s15_, K.color___opacify$closure()), K._function4("transparentize", _s15_, K.color___transparentize$closure()), K._function4("fade-out", _s15_, K.color___transparentize$closure()), Q.BuiltInCallable$overloadedFunction("alpha", P.LinkedHashMap_LinkedHashMap$_literal(["$color", new K.closure68(), "$args...", new K.closure69()], t1, t2)), K._function4("opacity", "$color", new K.closure70()), $.$get$_ieHexStr(), $.$get$_adjust().withName$1("adjust-color"), $.$get$_scale().withName$1("scale-color"), $.$get$_change().withName$1("change-color")], type$.JSArray_legacy_BuiltInCallable), type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "module", "$get$module", function() {
+      var _s9_ = "lightness",
+        _s10_ = "saturation",
+        _s6_ = "$color", _s5_ = "alpha",
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_legacy_Value_Function_legacy_List_legacy_Value;
+      return Q.BuiltInModule$("color", H.setRuntimeTypeInfo([$.$get$_red(), $.$get$_green(), $.$get$_blue(), $.$get$_mix(), K._function4("invert", "$color, $weight: 100%", new K.closure99()), $.$get$_hue(), $.$get$_saturation(), $.$get$_lightness(), $.$get$_complement(), K._removedColorFunction("adjust-hue", "hue", false), K._removedColorFunction("lighten", _s9_, false), K._removedColorFunction("darken", _s9_, true), K._removedColorFunction("saturate", _s10_, false), K._removedColorFunction("desaturate", _s10_, true), K._function4("grayscale", _s6_, new K.closure100()), Q.BuiltInCallable$overloadedFunction("hwb", P.LinkedHashMap_LinkedHashMap$_literal(["$hue, $whiteness, $blackness, $alpha: 1", new K.closure101(), "$channels", new K.closure102()], t1, t2)), K._function4("whiteness", _s6_, new K.closure103()), K._function4("blackness", _s6_, new K.closure104()), K._removedColorFunction("opacify", _s5_, false), K._removedColorFunction("fade-in", _s5_, false), K._removedColorFunction("transparentize", _s5_, true), K._removedColorFunction("fade-out", _s5_, true), Q.BuiltInCallable$overloadedFunction(_s5_, P.LinkedHashMap_LinkedHashMap$_literal(["$color", new K.closure105(), "$args...", new K.closure106()], t1, t2)), K._function4("opacity", _s6_, new K.closure107()), $.$get$_adjust(), $.$get$_scale(), $.$get$_change(), $.$get$_ieHexStr()], type$.JSArray_legacy_BuiltInCallable), null, null, type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "_red", "$get$_red", function() {
+      return K._function4("red", "$color", new K.closure82());
+    });
+    _lazyOld($, "_green", "$get$_green", function() {
+      return K._function4("green", "$color", new K.closure81());
+    });
+    _lazyOld($, "_blue", "$get$_blue", function() {
+      return K._function4("blue", "$color", new K.closure80());
+    });
+    _lazyOld($, "_mix", "$get$_mix", function() {
+      return K._function4("mix", "$color1, $color2, $weight: 50%", new K.closure79());
+    });
+    _lazyOld($, "_hue", "$get$_hue", function() {
+      return K._function4("hue", "$color", new K.closure78());
+    });
+    _lazyOld($, "_saturation", "$get$_saturation", function() {
+      return K._function4("saturation", "$color", new K.closure77());
+    });
+    _lazyOld($, "_lightness", "$get$_lightness", function() {
+      return K._function4("lightness", "$color", new K.closure76());
+    });
+    _lazyOld($, "_complement", "$get$_complement", function() {
+      return K._function4("complement", "$color", new K.closure75());
+    });
+    _lazyOld($, "_adjust", "$get$_adjust", function() {
+      return K._function4("adjust", "$color, $kwargs...", new K.closure73());
+    });
+    _lazyOld($, "_scale", "$get$_scale", function() {
+      return K._function4("scale", "$color, $kwargs...", new K.closure72());
+    });
+    _lazyOld($, "_change", "$get$_change", function() {
+      return K._function4("change", "$color, $kwargs...", new K.closure71());
+    });
+    _lazyOld($, "_ieHexStr", "$get$_ieHexStr", function() {
+      return K._function4("ie-hex-str", "$color", new K.closure74());
+    });
+    _lazyOld($, "global0", "$get$global1", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_length0(), $.$get$_nth(), $.$get$_setNth(), $.$get$_join(), $.$get$_append0(), $.$get$_zip(), $.$get$_index0(), $.$get$_isBracketed(), $.$get$_separator().withName$1("list-separator")], type$.JSArray_legacy_BuiltInCallable), type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "module0", "$get$module0", function() {
+      return Q.BuiltInModule$("list", H.setRuntimeTypeInfo([$.$get$_length0(), $.$get$_nth(), $.$get$_setNth(), $.$get$_join(), $.$get$_append0(), $.$get$_zip(), $.$get$_index0(), $.$get$_isBracketed(), $.$get$_separator()], type$.JSArray_legacy_BuiltInCallable), null, null, type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "_length", "$get$_length0", function() {
+      return D._function3("length", "$list", new D.closure43());
+    });
+    _lazyOld($, "_nth", "$get$_nth", function() {
+      return D._function3("nth", "$list, $n", new D.closure42());
+    });
+    _lazyOld($, "_setNth", "$get$_setNth", function() {
+      return D._function3("set-nth", "$list, $n, $value", new D.closure41());
+    });
+    _lazyOld($, "_join", "$get$_join", function() {
+      return D._function3("join", string$.x24list1, new D.closure40());
+    });
+    _lazyOld($, "_append", "$get$_append0", function() {
+      return D._function3("append", "$list, $val, $separator: auto", new D.closure39());
+    });
+    _lazyOld($, "_zip", "$get$_zip", function() {
+      return D._function3("zip", "$lists...", new D.closure38());
+    });
+    _lazyOld($, "_index", "$get$_index0", function() {
+      return D._function3("index", "$list, $value", new D.closure37());
+    });
+    _lazyOld($, "_separator", "$get$_separator", function() {
+      return D._function3("separator", "$list", new D.closure35());
+    });
+    _lazyOld($, "_isBracketed", "$get$_isBracketed", function() {
+      return D._function3("is-bracketed", "$list", new D.closure36());
+    });
+    _lazyOld($, "global1", "$get$global2", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_get().withName$1("map-get"), $.$get$_merge().withName$1("map-merge"), $.$get$_remove().withName$1("map-remove"), $.$get$_keys().withName$1("map-keys"), $.$get$_values().withName$1("map-values"), $.$get$_hasKey().withName$1("map-has-key")], type$.JSArray_legacy_BuiltInCallable), type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "module1", "$get$module1", function() {
+      return Q.BuiltInModule$("map", H.setRuntimeTypeInfo([$.$get$_get(), $.$get$_set(), $.$get$_merge(), $.$get$_remove(), $.$get$_keys(), $.$get$_values(), $.$get$_hasKey(), $.$get$_deepMerge(), $.$get$_deepRemove()], type$.JSArray_legacy_BuiltInCallable), null, null, type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "_get", "$get$_get", function() {
+      return A._function2("get", "$map, $key, $keys...", new A.closure34());
+    });
+    _lazyOld($, "_set", "$get$_set", function() {
+      return Q.BuiltInCallable$overloadedFunction("set", P.LinkedHashMap_LinkedHashMap$_literal(["$map, $key, $value", new A.closure97(), "$map, $args...", new A.closure98()], type$.legacy_String, type$.legacy_legacy_Value_Function_legacy_List_legacy_Value));
+    });
+    _lazyOld($, "_merge", "$get$_merge", function() {
+      return Q.BuiltInCallable$overloadedFunction("merge", P.LinkedHashMap_LinkedHashMap$_literal(["$map1, $map2", new A.closure32(), "$map1, $args...", new A.closure33()], type$.legacy_String, type$.legacy_legacy_Value_Function_legacy_List_legacy_Value));
+    });
+    _lazyOld($, "_deepMerge", "$get$_deepMerge", function() {
+      return A._function2("deep-merge", "$map1, $map2", new A.closure96());
+    });
+    _lazyOld($, "_deepRemove", "$get$_deepRemove", function() {
+      return A._function2("deep-remove", "$map, $key, $keys...", new A.closure95());
+    });
+    _lazyOld($, "_remove", "$get$_remove", function() {
+      return Q.BuiltInCallable$overloadedFunction("remove", P.LinkedHashMap_LinkedHashMap$_literal(["$map", new A.closure30(), "$map, $key, $keys...", new A.closure31()], type$.legacy_String, type$.legacy_legacy_Value_Function_legacy_List_legacy_Value));
+    });
+    _lazyOld($, "_keys", "$get$_keys", function() {
+      return A._function2("keys", "$map", new A.closure29());
+    });
+    _lazyOld($, "_values", "$get$_values", function() {
+      return A._function2("values", "$map", new A.closure28());
+    });
+    _lazyOld($, "_hasKey", "$get$_hasKey", function() {
+      return A._function2("has-key", "$map, $key, $keys...", new A.closure27());
+    });
+    _lazyOld($, "global2", "$get$global3", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_abs(), $.$get$_ceil(), $.$get$_floor(), $.$get$_max(), $.$get$_min(), $.$get$_percentage(), $.$get$_randomFunction(), $.$get$_round(), $.$get$_unit(), $.$get$_compatible().withName$1("comparable"), $.$get$_isUnitless().withName$1("unitless")], type$.JSArray_legacy_BuiltInCallable), type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "module2", "$get$module2", function() {
+      return Q.BuiltInModule$("math", H.setRuntimeTypeInfo([$.$get$_abs(), $.$get$_acos(), $.$get$_asin(), $.$get$_atan(), $.$get$_atan2(), $.$get$_ceil(), $.$get$_clamp(), $.$get$_cos(), $.$get$_compatible(), $.$get$_floor(), $.$get$_hypot(), $.$get$_isUnitless(), $.$get$_log(), $.$get$_max(), $.$get$_min(), $.$get$_percentage(), $.$get$_pow(), $.$get$_randomFunction(), $.$get$_round(), $.$get$_sin(), $.$get$_sqrt(), $.$get$_tan(), $.$get$_unit()], type$.JSArray_legacy_BuiltInCallable), null, P.LinkedHashMap_LinkedHashMap$_literal(["e", T.SassNumber_SassNumber(2.718281828459045, null), "pi", T.SassNumber_SassNumber(3.141592653589793, null)], type$.legacy_String, type$.legacy_Value), type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "_ceil", "$get$_ceil", function() {
+      return K._numberFunction("ceil", new K.closure25());
+    });
+    _lazyOld($, "_clamp", "$get$_clamp", function() {
+      return K._function1("clamp", "$min, $number, $max", new K.closure90());
+    });
+    _lazyOld($, "_floor", "$get$_floor", function() {
+      return K._numberFunction("floor", new K.closure24());
+    });
+    _lazyOld($, "_max", "$get$_max", function() {
+      return K._function1("max", "$numbers...", new K.closure23());
+    });
+    _lazyOld($, "_min", "$get$_min", function() {
+      return K._function1("min", "$numbers...", new K.closure22());
+    });
+    _lazyOld($, "_round", "$get$_round", function() {
+      return K._numberFunction("round", T.number0__fuzzyRound$closure());
+    });
+    _lazyOld($, "_abs", "$get$_abs", function() {
+      return K._numberFunction("abs", new K.closure26());
+    });
+    _lazyOld($, "_hypot", "$get$_hypot", function() {
+      return K._function1("hypot", "$numbers...", new K.closure88());
+    });
+    _lazyOld($, "_log", "$get$_log", function() {
+      return K._function1("log", "$number, $base: null", new K.closure87());
+    });
+    _lazyOld($, "_pow", "$get$_pow", function() {
+      return K._function1("pow", "$base, $exponent", new K.closure86());
+    });
+    _lazyOld($, "_sqrt", "$get$_sqrt", function() {
+      return K._function1("sqrt", "$number", new K.closure84());
+    });
+    _lazyOld($, "_acos", "$get$_acos", function() {
+      return K._function1("acos", "$number", new K.closure94());
+    });
+    _lazyOld($, "_asin", "$get$_asin", function() {
+      return K._function1("asin", "$number", new K.closure93());
+    });
+    _lazyOld($, "_atan", "$get$_atan", function() {
+      return K._function1("atan", "$number", new K.closure92());
+    });
+    _lazyOld($, "_atan2", "$get$_atan2", function() {
+      return K._function1("atan2", "$y, $x", new K.closure91());
+    });
+    _lazyOld($, "_cos", "$get$_cos", function() {
+      return K._function1("cos", "$number", new K.closure89());
+    });
+    _lazyOld($, "_sin", "$get$_sin", function() {
+      return K._function1("sin", "$number", new K.closure85());
+    });
+    _lazyOld($, "_tan", "$get$_tan", function() {
+      return K._function1("tan", "$number", new K.closure83());
+    });
+    _lazyOld($, "_compatible", "$get$_compatible", function() {
+      return K._function1("compatible", "$number1, $number2", new K.closure18());
+    });
+    _lazyOld($, "_isUnitless", "$get$_isUnitless", function() {
+      return K._function1("is-unitless", "$number", new K.closure17());
+    });
+    _lazyOld($, "_unit", "$get$_unit", function() {
+      return K._function1("unit", "$number", new K.closure19());
+    });
+    _lazyOld($, "_percentage", "$get$_percentage", function() {
+      return K._function1("percentage", "$number", new K.closure21());
+    });
+    _lazyOld($, "_random", "$get$_random0", function() {
+      return P.Random_Random();
+    });
+    _lazyOld($, "_randomFunction", "$get$_randomFunction", function() {
+      return K._function1("random", "$limit: null", new K.closure20());
+    });
+    _lazyOld($, "global3", "$get$global", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([Q._function5("feature-exists", "$feature", new Q.closure108()), Q._function5("inspect", "$value", new Q.closure109()), Q._function5("type-of", "$value", new Q.closure110()), Q._function5("keywords", "$args", new Q.closure111())], type$.JSArray_legacy_BuiltInCallable), type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "global4", "$get$global4", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_isSuperselector(), $.$get$_simpleSelectors(), $.$get$_parse().withName$1("selector-parse"), $.$get$_nest().withName$1("selector-nest"), $.$get$_append().withName$1("selector-append"), $.$get$_extend().withName$1("selector-extend"), $.$get$_replace().withName$1("selector-replace"), $.$get$_unify().withName$1("selector-unify")], type$.JSArray_legacy_BuiltInCallable), type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "module3", "$get$module3", function() {
+      return Q.BuiltInModule$("selector", H.setRuntimeTypeInfo([$.$get$_isSuperselector(), $.$get$_simpleSelectors(), $.$get$_parse(), $.$get$_nest(), $.$get$_append(), $.$get$_extend(), $.$get$_replace(), $.$get$_unify()], type$.JSArray_legacy_BuiltInCallable), null, null, type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "_nest", "$get$_nest", function() {
+      return T._function0("nest", "$selectors...", new T.closure13());
+    });
+    _lazyOld($, "_append0", "$get$_append", function() {
+      return T._function0("append", "$selectors...", new T.closure12());
+    });
+    _lazyOld($, "_extend", "$get$_extend", function() {
+      return T._function0("extend", "$selector, $extendee, $extender", new T.closure11());
+    });
+    _lazyOld($, "_replace", "$get$_replace", function() {
+      return T._function0("replace", "$selector, $original, $replacement", new T.closure10());
+    });
+    _lazyOld($, "_unify", "$get$_unify", function() {
+      return T._function0("unify", "$selector1, $selector2", new T.closure9());
+    });
+    _lazyOld($, "_isSuperselector", "$get$_isSuperselector", function() {
+      return T._function0("is-superselector", "$super, $sub", new T.closure16());
+    });
+    _lazyOld($, "_simpleSelectors", "$get$_simpleSelectors", function() {
+      return T._function0("simple-selectors", "$selector", new T.closure15());
+    });
+    _lazyOld($, "_parse", "$get$_parse", function() {
+      return T._function0("parse", "$selector", new T.closure14());
+    });
+    _lazyOld($, "_random0", "$get$_random", function() {
+      return P.Random_Random();
+    });
+    _lazyOld($, "_previousUniqueId", "$get$_previousUniqueId", function() {
+      return $.$get$_random().nextInt$1(H._asIntS(P.pow(36, 6)));
+    });
+    _lazyOld($, "global5", "$get$global5", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_unquote(), $.$get$_quote(), $.$get$_toUpperCase(), $.$get$_toLowerCase(), $.$get$_uniqueId(), $.$get$_length().withName$1("str-length"), $.$get$_insert().withName$1("str-insert"), $.$get$_index().withName$1("str-index"), $.$get$_slice().withName$1("str-slice")], type$.JSArray_legacy_BuiltInCallable), type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "module4", "$get$module4", function() {
+      return Q.BuiltInModule$("string", H.setRuntimeTypeInfo([$.$get$_unquote(), $.$get$_quote(), $.$get$_toUpperCase(), $.$get$_toLowerCase(), $.$get$_length(), $.$get$_insert(), $.$get$_index(), $.$get$_slice(), $.$get$_uniqueId()], type$.JSArray_legacy_BuiltInCallable), null, null, type$.legacy_BuiltInCallable);
+    });
+    _lazyOld($, "_unquote", "$get$_unquote", function() {
+      return D._function("unquote", "$string", new D.closure8());
+    });
+    _lazyOld($, "_quote", "$get$_quote", function() {
+      return D._function("quote", "$string", new D.closure7());
+    });
+    _lazyOld($, "_length0", "$get$_length", function() {
+      return D._function("length", "$string", new D.closure3());
+    });
+    _lazyOld($, "_insert", "$get$_insert", function() {
+      return D._function("insert", "$string, $insert, $index", new D.closure2());
+    });
+    _lazyOld($, "_index0", "$get$_index", function() {
+      return D._function("index", "$string, $substring", new D.closure1());
+    });
+    _lazyOld($, "_slice", "$get$_slice", function() {
+      return D._function("slice", "$string, $start-at, $end-at: -1", new D.closure0());
+    });
+    _lazyOld($, "_toUpperCase", "$get$_toUpperCase", function() {
+      return D._function("to-upper-case", "$string", new D.closure6());
+    });
+    _lazyOld($, "_toLowerCase", "$get$_toLowerCase", function() {
+      return D._function("to-lower-case", "$string", new D.closure5());
+    });
+    _lazyOld($, "_uniqueId", "$get$_uniqueId", function() {
+      return D._function("unique-id", "", new D.closure4());
+    });
+    _lazyOld($, "stderr", "$get$stderr", function() {
+      return new B.Stderr(J.get$stderr$x(self.process));
+    });
+    _lazyOld($, "Logger_quiet", "$get$Logger_quiet", function() {
+      return new F._QuietLogger();
+    });
+    _lazyOld($, "_disallowedFunctionNames", "$get$_disallowedFunctionNames", function() {
+      var t1 = $.$get$globalFunctions();
+      t1 = t1.map$1$1(t1, new Q.closure112(), type$.legacy_String).toSet$0(0);
+      t1.add$1(0, "if");
+      t1.remove$1(0, "rgb");
+      t1.remove$1(0, "rgba");
+      t1.remove$1(0, "hsl");
+      t1.remove$1(0, "hsla");
+      t1.remove$1(0, "grayscale");
+      t1.remove$1(0, "invert");
+      t1.remove$1(0, "alpha");
+      t1.remove$1(0, "opacity");
+      t1.remove$1(0, "saturate");
+      return t1;
+    });
+    _lazyOld($, "epsilon", "$get$epsilon", function() {
+      return P.pow(10, -11);
+    });
+    _lazyOld($, "_inverseEpsilon", "$get$_inverseEpsilon", function() {
+      return 1 / $.$get$epsilon();
+    });
+    _lazyOld($, "_noSourceUrl", "$get$_noSourceUrl", function() {
+      return P.Uri_parse("-");
+    });
+    _lazyOld($, "_typesByUnit", "$get$_typesByUnit", function() {
+      var t2, t3, t4,
+        t1 = type$.legacy_String;
+      t1 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t2 = C.Map_U8AHF.get$entries(C.Map_U8AHF), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        for (t4 = J.get$iterator$ax(t3.value), t3 = t3.key; t4.moveNext$0();)
+          t1.$indexSet(0, t4.get$current(t4), t3);
+      }
+      return t1;
+    });
+    _lazyOld($, "_emptyQuoted", "$get$_emptyQuoted", function() {
+      return D.SassString$("", true);
+    });
+    _lazyOld($, "_emptyUnquoted", "$get$_emptyUnquoted", function() {
+      return D.SassString$("", false);
+    });
+    _lazyOld($, "MAX_INT32", "$get$MAX_INT32", function() {
+      return P.pow(2, 31) - 1;
+    });
+    _lazyOld($, "MIN_INT32", "$get$MIN_INT32", function() {
+      return -P.pow(2, 31);
+    });
+    _lazyOld($, "_vmFrame", "$get$_vmFrame", function() {
+      return P.RegExp_RegExp("^#\\d+\\s+(\\S.*) \\((.+?)((?::\\d+){0,2})\\)$", false);
+    });
+    _lazyOld($, "_v8Frame", "$get$_v8Frame", function() {
+      return P.RegExp_RegExp("^\\s*at (?:(\\S.*?)(?: \\[as [^\\]]+\\])? \\((.*)\\)|(.*))$", false);
+    });
+    _lazyOld($, "_v8UrlLocation", "$get$_v8UrlLocation", function() {
+      return P.RegExp_RegExp("^(.*?):(\\d+)(?::(\\d+))?$|native$", false);
+    });
+    _lazyOld($, "_v8EvalLocation", "$get$_v8EvalLocation", function() {
+      return P.RegExp_RegExp("^eval at (?:\\S.*?) \\((.*)\\)(?:, .*?:\\d+:\\d+)?$", false);
+    });
+    _lazyOld($, "_firefoxEvalLocation", "$get$_firefoxEvalLocation", function() {
+      return P.RegExp_RegExp("(\\S+)@(\\S+) line (\\d+) >.* (Function|eval):\\d+:\\d+", false);
+    });
+    _lazyOld($, "_firefoxSafariFrame", "$get$_firefoxSafariFrame", function() {
+      return P.RegExp_RegExp("^(?:([^@(/]*)(?:\\(.*\\))?((?:/[^/]*)*)(?:\\(.*\\))?@)?(.*?):(\\d*)(?::(\\d*))?$", false);
+    });
+    _lazyOld($, "_friendlyFrame", "$get$_friendlyFrame", function() {
+      return P.RegExp_RegExp("^(\\S+)(?: (\\d+)(?::(\\d+))?)?\\s+([^\\d].*)$", false);
+    });
+    _lazyOld($, "_asyncBody", "$get$_asyncBody", function() {
+      return P.RegExp_RegExp("<(<anonymous closure>|[^>]+)_async_body>", false);
+    });
+    _lazyOld($, "_initialDot", "$get$_initialDot", function() {
+      return P.RegExp_RegExp("^\\.", false);
+    });
+    _lazyOld($, "Frame__uriRegExp", "$get$Frame__uriRegExp", function() {
+      return P.RegExp_RegExp("^[a-zA-Z][-+.a-zA-Z\\d]*://", false);
+    });
+    _lazyOld($, "Frame__windowsRegExp", "$get$Frame__windowsRegExp", function() {
+      return P.RegExp_RegExp("^([a-zA-Z]:[\\\\/]|\\\\\\\\)", false);
+    });
+    _lazyOld($, "_terseRegExp", "$get$_terseRegExp", function() {
+      return P.RegExp_RegExp("(-patch)?([/\\\\].*)?$", false);
+    });
+    _lazyOld($, "_v8Trace", "$get$_v8Trace", function() {
+      return P.RegExp_RegExp("\\n    ?at ", false);
+    });
+    _lazyOld($, "_v8TraceLine", "$get$_v8TraceLine", function() {
+      return P.RegExp_RegExp("    ?at ", false);
+    });
+    _lazyOld($, "_firefoxEvalTrace", "$get$_firefoxEvalTrace", function() {
+      return P.RegExp_RegExp("@\\S+ line \\d+ >.* (Function|eval):\\d+:\\d+", false);
+    });
+    _lazyOld($, "_firefoxSafariTrace", "$get$_firefoxSafariTrace", function() {
+      return P.RegExp_RegExp("^(([.0-9A-Za-z_$/<]|\\(.*\\))*@)?[^\\s]*:\\d*$", true);
+    });
+    _lazyOld($, "_friendlyTrace", "$get$_friendlyTrace", function() {
+      return P.RegExp_RegExp("^[^\\s<][^\\s]*( \\d+(:\\d+)?)?[ \\t]+[^\\s]+$", true);
+    });
+    _lazyOld($, "vmChainGap", "$get$vmChainGap", function() {
+      return P.RegExp_RegExp("^<asynchronous suspension>\\n?$", true);
+    });
+    _lazyOld($, "_newlineRegExp", "$get$_newlineRegExp", function() {
+      return P.RegExp_RegExp("\\r\\n?|\\n", false);
+    });
+    _lazyOld($, "booleanConstructor", "$get$booleanConstructor", function() {
+      return new Z.closure263().call$0();
+    });
+    _lazyOld($, "_microsoftFilterStart0", "$get$_microsoftFilterStart0", function() {
+      return P.RegExp_RegExp("^[a-zA-Z]+\\s*=", false);
+    });
+    _lazyOld($, "global6", "$get$global7", function() {
+      var _s27_ = "$red, $green, $blue, $alpha",
+        _s19_ = "$red, $green, $blue",
+        _s37_ = "$hue, $saturation, $lightness, $alpha",
+        _s29_ = "$hue, $saturation, $lightness",
+        _s17_ = "$hue, $saturation",
+        _s15_ = "$color, $amount",
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_legacy_Value_Function_legacy_List_legacy_Value_2;
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_red0(), $.$get$_green0(), $.$get$_blue0(), $.$get$_mix0(), Q.BuiltInCallable$overloadedFunction0("rgb", P.LinkedHashMap_LinkedHashMap$_literal([_s27_, new K.closure159(), _s19_, new K.closure160(), "$color, $alpha", new K.closure161(), "$channels", new K.closure162()], t1, t2)), Q.BuiltInCallable$overloadedFunction0("rgba", P.LinkedHashMap_LinkedHashMap$_literal([_s27_, new K.closure163(), _s19_, new K.closure164(), "$color, $alpha", new K.closure165(), "$channels", new K.closure166()], t1, t2)), K._function11("invert", "$color, $weight: 100%", new K.closure167()), $.$get$_hue0(), $.$get$_saturation0(), $.$get$_lightness0(), $.$get$_complement0(), Q.BuiltInCallable$overloadedFunction0("hsl", P.LinkedHashMap_LinkedHashMap$_literal([_s37_, new K.closure168(), _s29_, new K.closure169(), _s17_, new K.closure170(), "$channels", new K.closure171()], t1, t2)), Q.BuiltInCallable$overloadedFunction0("hsla", P.LinkedHashMap_LinkedHashMap$_literal([_s37_, new K.closure172(), _s29_, new K.closure173(), _s17_, new K.closure174(), "$channels", new K.closure175()], t1, t2)), K._function11("grayscale", "$color", new K.closure176()), K._function11("adjust-hue", "$color, $degrees", new K.closure177()), K._function11("lighten", _s15_, new K.closure178()), K._function11("darken", _s15_, new K.closure179()), Q.BuiltInCallable$overloadedFunction0("saturate", P.LinkedHashMap_LinkedHashMap$_literal(["$amount", new K.closure180(), "$color, $amount", new K.closure181()], t1, t2)), K._function11("desaturate", _s15_, new K.closure182()), K._function11("opacify", _s15_, K.color1___opacify$closure()), K._function11("fade-in", _s15_, K.color1___opacify$closure()), K._function11("transparentize", _s15_, K.color1___transparentize$closure()), K._function11("fade-out", _s15_, K.color1___transparentize$closure()), Q.BuiltInCallable$overloadedFunction0("alpha", P.LinkedHashMap_LinkedHashMap$_literal(["$color", new K.closure183(), "$args...", new K.closure184()], t1, t2)), K._function11("opacity", "$color", new K.closure185()), $.$get$_ieHexStr0(), $.$get$_adjust0().withName$1("adjust-color"), $.$get$_scale0().withName$1("scale-color"), $.$get$_change0().withName$1("change-color")], type$.JSArray_legacy_BuiltInCallable_2), type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "module5", "$get$module5", function() {
+      var _s9_ = "lightness",
+        _s10_ = "saturation",
+        _s6_ = "$color", _s5_ = "alpha",
+        t1 = type$.legacy_String,
+        t2 = type$.legacy_legacy_Value_Function_legacy_List_legacy_Value_2;
+      return Q.BuiltInModule$0("color", H.setRuntimeTypeInfo([$.$get$_red0(), $.$get$_green0(), $.$get$_blue0(), $.$get$_mix0(), K._function11("invert", "$color, $weight: 100%", new K.closure214()), $.$get$_hue0(), $.$get$_saturation0(), $.$get$_lightness0(), $.$get$_complement0(), K._removedColorFunction0("adjust-hue", "hue", false), K._removedColorFunction0("lighten", _s9_, false), K._removedColorFunction0("darken", _s9_, true), K._removedColorFunction0("saturate", _s10_, false), K._removedColorFunction0("desaturate", _s10_, true), K._function11("grayscale", _s6_, new K.closure215()), Q.BuiltInCallable$overloadedFunction0("hwb", P.LinkedHashMap_LinkedHashMap$_literal(["$hue, $whiteness, $blackness, $alpha: 1", new K.closure216(), "$channels", new K.closure217()], t1, t2)), K._function11("whiteness", _s6_, new K.closure218()), K._function11("blackness", _s6_, new K.closure219()), K._removedColorFunction0("opacify", _s5_, false), K._removedColorFunction0("fade-in", _s5_, false), K._removedColorFunction0("transparentize", _s5_, true), K._removedColorFunction0("fade-out", _s5_, true), Q.BuiltInCallable$overloadedFunction0(_s5_, P.LinkedHashMap_LinkedHashMap$_literal(["$color", new K.closure220(), "$args...", new K.closure221()], t1, t2)), K._function11("opacity", _s6_, new K.closure222()), $.$get$_adjust0(), $.$get$_scale0(), $.$get$_change0(), $.$get$_ieHexStr0()], type$.JSArray_legacy_BuiltInCallable_2), null, null, type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "_red0", "$get$_red0", function() {
+      return K._function11("red", "$color", new K.closure197());
+    });
+    _lazyOld($, "_green0", "$get$_green0", function() {
+      return K._function11("green", "$color", new K.closure196());
+    });
+    _lazyOld($, "_blue0", "$get$_blue0", function() {
+      return K._function11("blue", "$color", new K.closure195());
+    });
+    _lazyOld($, "_mix0", "$get$_mix0", function() {
+      return K._function11("mix", "$color1, $color2, $weight: 50%", new K.closure194());
+    });
+    _lazyOld($, "_hue0", "$get$_hue0", function() {
+      return K._function11("hue", "$color", new K.closure193());
+    });
+    _lazyOld($, "_saturation0", "$get$_saturation0", function() {
+      return K._function11("saturation", "$color", new K.closure192());
+    });
+    _lazyOld($, "_lightness0", "$get$_lightness0", function() {
+      return K._function11("lightness", "$color", new K.closure191());
+    });
+    _lazyOld($, "_complement0", "$get$_complement0", function() {
+      return K._function11("complement", "$color", new K.closure190());
+    });
+    _lazyOld($, "_adjust0", "$get$_adjust0", function() {
+      return K._function11("adjust", "$color, $kwargs...", new K.closure188());
+    });
+    _lazyOld($, "_scale0", "$get$_scale0", function() {
+      return K._function11("scale", "$color, $kwargs...", new K.closure187());
+    });
+    _lazyOld($, "_change0", "$get$_change0", function() {
+      return K._function11("change", "$color, $kwargs...", new K.closure186());
+    });
+    _lazyOld($, "_ieHexStr0", "$get$_ieHexStr0", function() {
+      return K._function11("ie-hex-str", "$color", new K.closure189());
+    });
+    _lazyOld($, "colorConstructor", "$get$colorConstructor", function() {
+      return B.createClass("SassColor", new K.closure253(), P.LinkedHashMap_LinkedHashMap$_literal(["getR", new K.closure254(), "getG", new K.closure255(), "getB", new K.closure256(), "getA", new K.closure257(), "setR", new K.closure258(), "setG", new K.closure259(), "setB", new K.closure260(), "setA", new K.closure261(), "toString", new K.closure262()], type$.legacy_String, type$.legacy_Function));
+    });
+    _lazyOld($, "colorsByName0", "$get$colorsByName0", function() {
+      var _null = null;
+      return P.LinkedHashMap_LinkedHashMap$_literal(["yellowgreen", K.SassColor$rgb0(154, 205, 50, _null, _null), "yellow", K.SassColor$rgb0(255, 255, 0, _null, _null), "whitesmoke", K.SassColor$rgb0(245, 245, 245, _null, _null), "white", K.SassColor$rgb0(255, 255, 255, _null, _null), "wheat", K.SassColor$rgb0(245, 222, 179, _null, _null), "violet", K.SassColor$rgb0(238, 130, 238, _null, _null), "turquoise", K.SassColor$rgb0(64, 224, 208, _null, _null), "transparent", K.SassColor$rgb0(0, 0, 0, 0, _null), "tomato", K.SassColor$rgb0(255, 99, 71, _null, _null), "thistle", K.SassColor$rgb0(216, 191, 216, _null, _null), "teal", K.SassColor$rgb0(0, 128, 128, _null, _null), "tan", K.SassColor$rgb0(210, 180, 140, _null, _null), "steelblue", K.SassColor$rgb0(70, 130, 180, _null, _null), "springgreen", K.SassColor$rgb0(0, 255, 127, _null, _null), "snow", K.SassColor$rgb0(255, 250, 250, _null, _null), "slategrey", K.SassColor$rgb0(112, 128, 144, _null, _null), "slategray", K.SassColor$rgb0(112, 128, 144, _null, _null), "slateblue", K.SassColor$rgb0(106, 90, 205, _null, _null), "skyblue", K.SassColor$rgb0(135, 206, 235, _null, _null), "silver", K.SassColor$rgb0(192, 192, 192, _null, _null), "sienna", K.SassColor$rgb0(160, 82, 45, _null, _null), "seashell", K.SassColor$rgb0(255, 245, 238, _null, _null), "seagreen", K.SassColor$rgb0(46, 139, 87, _null, _null), "sandybrown", K.SassColor$rgb0(244, 164, 96, _null, _null), "salmon", K.SassColor$rgb0(250, 128, 114, _null, _null), "saddlebrown", K.SassColor$rgb0(139, 69, 19, _null, _null), "royalblue", K.SassColor$rgb0(65, 105, 225, _null, _null), "rosybrown", K.SassColor$rgb0(188, 143, 143, _null, _null), "red", K.SassColor$rgb0(255, 0, 0, _null, _null), "rebeccapurple", K.SassColor$rgb0(102, 51, 153, _null, _null), "purple", K.SassColor$rgb0(128, 0, 128, _null, _null), "powderblue", K.SassColor$rgb0(176, 224, 230, _null, _null), "plum", K.SassColor$rgb0(221, 160, 221, _null, _null), "pink", K.SassColor$rgb0(255, 192, 203, _null, _null), "peru", K.SassColor$rgb0(205, 133, 63, _null, _null), "peachpuff", K.SassColor$rgb0(255, 218, 185, _null, _null), "papayawhip", K.SassColor$rgb0(255, 239, 213, _null, _null), "palevioletred", K.SassColor$rgb0(219, 112, 147, _null, _null), "paleturquoise", K.SassColor$rgb0(175, 238, 238, _null, _null), "palegreen", K.SassColor$rgb0(152, 251, 152, _null, _null), "palegoldenrod", K.SassColor$rgb0(238, 232, 170, _null, _null), "orchid", K.SassColor$rgb0(218, 112, 214, _null, _null), "orangered", K.SassColor$rgb0(255, 69, 0, _null, _null), "orange", K.SassColor$rgb0(255, 165, 0, _null, _null), "olivedrab", K.SassColor$rgb0(107, 142, 35, _null, _null), "olive", K.SassColor$rgb0(128, 128, 0, _null, _null), "oldlace", K.SassColor$rgb0(253, 245, 230, _null, _null), "navy", K.SassColor$rgb0(0, 0, 128, _null, _null), "navajowhite", K.SassColor$rgb0(255, 222, 173, _null, _null), "moccasin", K.SassColor$rgb0(255, 228, 181, _null, _null), "mistyrose", K.SassColor$rgb0(255, 228, 225, _null, _null), "mintcream", K.SassColor$rgb0(245, 255, 250, _null, _null), "midnightblue", K.SassColor$rgb0(25, 25, 112, _null, _null), "mediumvioletred", K.SassColor$rgb0(199, 21, 133, _null, _null), "mediumturquoise", K.SassColor$rgb0(72, 209, 204, _null, _null), "mediumspringgreen", K.SassColor$rgb0(0, 250, 154, _null, _null), "mediumslateblue", K.SassColor$rgb0(123, 104, 238, _null, _null), "mediumseagreen", K.SassColor$rgb0(60, 179, 113, _null, _null), "mediumpurple", K.SassColor$rgb0(147, 112, 219, _null, _null), "mediumorchid", K.SassColor$rgb0(186, 85, 211, _null, _null), "mediumblue", K.SassColor$rgb0(0, 0, 205, _null, _null), "mediumaquamarine", K.SassColor$rgb0(102, 205, 170, _null, _null), "maroon", K.SassColor$rgb0(128, 0, 0, _null, _null), "magenta", K.SassColor$rgb0(255, 0, 255, _null, _null), "linen", K.SassColor$rgb0(250, 240, 230, _null, _null), "limegreen", K.SassColor$rgb0(50, 205, 50, _null, _null), "lime", K.SassColor$rgb0(0, 255, 0, _null, _null), "lightyellow", K.SassColor$rgb0(255, 255, 224, _null, _null), "lightsteelblue", K.SassColor$rgb0(176, 196, 222, _null, _null), "lightslategrey", K.SassColor$rgb0(119, 136, 153, _null, _null), "lightslategray", K.SassColor$rgb0(119, 136, 153, _null, _null), "lightskyblue", K.SassColor$rgb0(135, 206, 250, _null, _null), "lightseagreen", K.SassColor$rgb0(32, 178, 170, _null, _null), "lightsalmon", K.SassColor$rgb0(255, 160, 122, _null, _null), "lightpink", K.SassColor$rgb0(255, 182, 193, _null, _null), "lightgrey", K.SassColor$rgb0(211, 211, 211, _null, _null), "lightgreen", K.SassColor$rgb0(144, 238, 144, _null, _null), "lightgray", K.SassColor$rgb0(211, 211, 211, _null, _null), "lightgoldenrodyellow", K.SassColor$rgb0(250, 250, 210, _null, _null), "lightcyan", K.SassColor$rgb0(224, 255, 255, _null, _null), "lightcoral", K.SassColor$rgb0(240, 128, 128, _null, _null), "lightblue", K.SassColor$rgb0(173, 216, 230, _null, _null), "lemonchiffon", K.SassColor$rgb0(255, 250, 205, _null, _null), "lawngreen", K.SassColor$rgb0(124, 252, 0, _null, _null), "lavenderblush", K.SassColor$rgb0(255, 240, 245, _null, _null), "lavender", K.SassColor$rgb0(230, 230, 250, _null, _null), "khaki", K.SassColor$rgb0(240, 230, 140, _null, _null), "ivory", K.SassColor$rgb0(255, 255, 240, _null, _null), "indigo", K.SassColor$rgb0(75, 0, 130, _null, _null), "indianred", K.SassColor$rgb0(205, 92, 92, _null, _null), "hotpink", K.SassColor$rgb0(255, 105, 180, _null, _null), "honeydew", K.SassColor$rgb0(240, 255, 240, _null, _null), "grey", K.SassColor$rgb0(128, 128, 128, _null, _null), "greenyellow", K.SassColor$rgb0(173, 255, 47, _null, _null), "green", K.SassColor$rgb0(0, 128, 0, _null, _null), "gray", K.SassColor$rgb0(128, 128, 128, _null, _null), "goldenrod", K.SassColor$rgb0(218, 165, 32, _null, _null), "gold", K.SassColor$rgb0(255, 215, 0, _null, _null), "ghostwhite", K.SassColor$rgb0(248, 248, 255, _null, _null), "gainsboro", K.SassColor$rgb0(220, 220, 220, _null, _null), "fuchsia", K.SassColor$rgb0(255, 0, 255, _null, _null), "forestgreen", K.SassColor$rgb0(34, 139, 34, _null, _null), "floralwhite", K.SassColor$rgb0(255, 250, 240, _null, _null), "firebrick", K.SassColor$rgb0(178, 34, 34, _null, _null), "dodgerblue", K.SassColor$rgb0(30, 144, 255, _null, _null), "dimgrey", K.SassColor$rgb0(105, 105, 105, _null, _null), "dimgray", K.SassColor$rgb0(105, 105, 105, _null, _null), "deepskyblue", K.SassColor$rgb0(0, 191, 255, _null, _null), "deeppink", K.SassColor$rgb0(255, 20, 147, _null, _null), "darkviolet", K.SassColor$rgb0(148, 0, 211, _null, _null), "darkturquoise", K.SassColor$rgb0(0, 206, 209, _null, _null), "darkslategrey", K.SassColor$rgb0(47, 79, 79, _null, _null), "darkslategray", K.SassColor$rgb0(47, 79, 79, _null, _null), "darkslateblue", K.SassColor$rgb0(72, 61, 139, _null, _null), "darkseagreen", K.SassColor$rgb0(143, 188, 143, _null, _null), "darksalmon", K.SassColor$rgb0(233, 150, 122, _null, _null), "darkred", K.SassColor$rgb0(139, 0, 0, _null, _null), "darkorchid", K.SassColor$rgb0(153, 50, 204, _null, _null), "darkorange", K.SassColor$rgb0(255, 140, 0, _null, _null), "darkolivegreen", K.SassColor$rgb0(85, 107, 47, _null, _null), "darkmagenta", K.SassColor$rgb0(139, 0, 139, _null, _null), "darkkhaki", K.SassColor$rgb0(189, 183, 107, _null, _null), "darkgrey", K.SassColor$rgb0(169, 169, 169, _null, _null), "darkgreen", K.SassColor$rgb0(0, 100, 0, _null, _null), "darkgray", K.SassColor$rgb0(169, 169, 169, _null, _null), "darkgoldenrod", K.SassColor$rgb0(184, 134, 11, _null, _null), "darkcyan", K.SassColor$rgb0(0, 139, 139, _null, _null), "darkblue", K.SassColor$rgb0(0, 0, 139, _null, _null), "cyan", K.SassColor$rgb0(0, 255, 255, _null, _null), "crimson", K.SassColor$rgb0(220, 20, 60, _null, _null), "cornsilk", K.SassColor$rgb0(255, 248, 220, _null, _null), "cornflowerblue", K.SassColor$rgb0(100, 149, 237, _null, _null), "coral", K.SassColor$rgb0(255, 127, 80, _null, _null), "chocolate", K.SassColor$rgb0(210, 105, 30, _null, _null), "chartreuse", K.SassColor$rgb0(127, 255, 0, _null, _null), "cadetblue", K.SassColor$rgb0(95, 158, 160, _null, _null), "burlywood", K.SassColor$rgb0(222, 184, 135, _null, _null), "brown", K.SassColor$rgb0(165, 42, 42, _null, _null), "blueviolet", K.SassColor$rgb0(138, 43, 226, _null, _null), "blue", K.SassColor$rgb0(0, 0, 255, _null, _null), "blanchedalmond", K.SassColor$rgb0(255, 235, 205, _null, _null), "black", K.SassColor$rgb0(0, 0, 0, _null, _null), "bisque", K.SassColor$rgb0(255, 228, 196, _null, _null), "beige", K.SassColor$rgb0(245, 245, 220, _null, _null), "azure", K.SassColor$rgb0(240, 255, 255, _null, _null), "aquamarine", K.SassColor$rgb0(127, 255, 212, _null, _null), "aqua", K.SassColor$rgb0(0, 255, 255, _null, _null), "antiquewhite", K.SassColor$rgb0(250, 235, 215, _null, _null), "aliceblue", K.SassColor$rgb0(240, 248, 255, _null, _null)], type$.legacy_String, type$.legacy_SassColor_2);
+    });
+    _lazyOld($, "namesByColor0", "$get$namesByColor0", function() {
+      var t2, t3,
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_SassColor_2, type$.legacy_String);
+      for (t2 = $.$get$colorsByName0(), t2 = t2.get$entries(t2), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        t1.$indexSet(0, t3.value, t3.key);
+      }
+      return t1;
+    });
+    _lazyOld($, "_disallowedFunctionNames0", "$get$_disallowedFunctionNames0", function() {
+      var t1 = $.$get$globalFunctions0();
+      t1 = t1.map$1$1(t1, new Q.closure227(), type$.legacy_String).toSet$0(0);
+      t1.add$1(0, "if");
+      t1.remove$1(0, "rgb");
+      t1.remove$1(0, "rgba");
+      t1.remove$1(0, "hsl");
+      t1.remove$1(0, "hsla");
+      t1.remove$1(0, "grayscale");
+      t1.remove$1(0, "invert");
+      t1.remove$1(0, "alpha");
+      t1.remove$1(0, "opacity");
+      t1.remove$1(0, "saturate");
+      return t1;
+    });
+    _lazyOld($, "globalFunctions0", "$get$globalFunctions0", function() {
+      var t2,
+        t1 = H.setRuntimeTypeInfo([], type$.JSArray_legacy_BuiltInCallable_2);
+      for (t2 = $.$get$global7(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global8(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global9(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global10(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global11(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global12(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      for (t2 = $.$get$global6(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+        t1.push(t2.get$current(t2));
+      t1.push(Q.BuiltInCallable$function0("if", "$condition, $if-true, $if-false", new Y.closure114(), null));
+      return P.UnmodifiableListView$(t1, type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "coreModules0", "$get$coreModules0", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$module5(), $.$get$module6(), $.$get$module7(), $.$get$module8(), $.$get$module9(), $.$get$module10()], type$.JSArray_legacy_BuiltInModule_legacy_BuiltInCallable_2), H.findType("BuiltInModule0<BuiltInCallable0*>*"));
+    });
+    _lazyOld($, "IfExpression_declaration0", "$get$IfExpression_declaration0", function() {
+      return B.ArgumentDeclaration_ArgumentDeclaration$parse0(string$.x40funct, null);
+    });
+    _lazyOld($, "global7", "$get$global8", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_length2(), $.$get$_nth0(), $.$get$_setNth0(), $.$get$_join0(), $.$get$_append2(), $.$get$_zip0(), $.$get$_index2(), $.$get$_isBracketed0(), $.$get$_separator0().withName$1("list-separator")], type$.JSArray_legacy_BuiltInCallable_2), type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "module6", "$get$module6", function() {
+      return Q.BuiltInModule$0("list", H.setRuntimeTypeInfo([$.$get$_length2(), $.$get$_nth0(), $.$get$_setNth0(), $.$get$_join0(), $.$get$_append2(), $.$get$_zip0(), $.$get$_index2(), $.$get$_isBracketed0(), $.$get$_separator0()], type$.JSArray_legacy_BuiltInCallable_2), null, null, type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "_length1", "$get$_length2", function() {
+      return D._function10("length", "$list", new D.closure158());
+    });
+    _lazyOld($, "_nth0", "$get$_nth0", function() {
+      return D._function10("nth", "$list, $n", new D.closure157());
+    });
+    _lazyOld($, "_setNth0", "$get$_setNth0", function() {
+      return D._function10("set-nth", "$list, $n, $value", new D.closure156());
+    });
+    _lazyOld($, "_join0", "$get$_join0", function() {
+      return D._function10("join", string$.x24list1, new D.closure155());
+    });
+    _lazyOld($, "_append1", "$get$_append2", function() {
+      return D._function10("append", "$list, $val, $separator: auto", new D.closure154());
+    });
+    _lazyOld($, "_zip0", "$get$_zip0", function() {
+      return D._function10("zip", "$lists...", new D.closure153());
+    });
+    _lazyOld($, "_index1", "$get$_index2", function() {
+      return D._function10("index", "$list, $value", new D.closure152());
+    });
+    _lazyOld($, "_separator0", "$get$_separator0", function() {
+      return D._function10("separator", "$list", new D.closure150());
+    });
+    _lazyOld($, "_isBracketed0", "$get$_isBracketed0", function() {
+      return D._function10("is-bracketed", "$list", new D.closure151());
+    });
+    _lazyOld($, "listConstructor", "$get$listConstructor", function() {
+      return B.createClass("SassList", new D.closure246(), P.LinkedHashMap_LinkedHashMap$_literal(["getValue", new D.closure247(), "setValue", new D.closure248(), "getSeparator", new D.closure249(), "setSeparator", new D.closure250(), "getLength", new D.closure251(), "toString", new D.closure252()], type$.legacy_String, type$.legacy_Function));
+    });
+    _lazyOld($, "global8", "$get$global9", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_get0().withName$1("map-get"), $.$get$_merge0().withName$1("map-merge"), $.$get$_remove0().withName$1("map-remove"), $.$get$_keys0().withName$1("map-keys"), $.$get$_values0().withName$1("map-values"), $.$get$_hasKey0().withName$1("map-has-key")], type$.JSArray_legacy_BuiltInCallable_2), type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "module7", "$get$module7", function() {
+      return Q.BuiltInModule$0("map", H.setRuntimeTypeInfo([$.$get$_get0(), $.$get$_set0(), $.$get$_merge0(), $.$get$_remove0(), $.$get$_keys0(), $.$get$_values0(), $.$get$_hasKey0(), $.$get$_deepMerge0(), $.$get$_deepRemove0()], type$.JSArray_legacy_BuiltInCallable_2), null, null, type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "_get0", "$get$_get0", function() {
+      return A._function9("get", "$map, $key, $keys...", new A.closure149());
+    });
+    _lazyOld($, "_set0", "$get$_set0", function() {
+      return Q.BuiltInCallable$overloadedFunction0("set", P.LinkedHashMap_LinkedHashMap$_literal(["$map, $key, $value", new A.closure212(), "$map, $args...", new A.closure213()], type$.legacy_String, type$.legacy_legacy_Value_Function_legacy_List_legacy_Value_2));
+    });
+    _lazyOld($, "_merge0", "$get$_merge0", function() {
+      return Q.BuiltInCallable$overloadedFunction0("merge", P.LinkedHashMap_LinkedHashMap$_literal(["$map1, $map2", new A.closure147(), "$map1, $args...", new A.closure148()], type$.legacy_String, type$.legacy_legacy_Value_Function_legacy_List_legacy_Value_2));
+    });
+    _lazyOld($, "_deepMerge0", "$get$_deepMerge0", function() {
+      return A._function9("deep-merge", "$map1, $map2", new A.closure211());
+    });
+    _lazyOld($, "_deepRemove0", "$get$_deepRemove0", function() {
+      return A._function9("deep-remove", "$map, $key, $keys...", new A.closure210());
+    });
+    _lazyOld($, "_remove0", "$get$_remove0", function() {
+      return Q.BuiltInCallable$overloadedFunction0("remove", P.LinkedHashMap_LinkedHashMap$_literal(["$map", new A.closure145(), "$map, $key, $keys...", new A.closure146()], type$.legacy_String, type$.legacy_legacy_Value_Function_legacy_List_legacy_Value_2));
+    });
+    _lazyOld($, "_keys0", "$get$_keys0", function() {
+      return A._function9("keys", "$map", new A.closure144());
+    });
+    _lazyOld($, "_values0", "$get$_values0", function() {
+      return A._function9("values", "$map", new A.closure143());
+    });
+    _lazyOld($, "_hasKey0", "$get$_hasKey0", function() {
+      return A._function9("has-key", "$map, $key, $keys...", new A.closure142());
+    });
+    _lazyOld($, "mapConstructor", "$get$mapConstructor", function() {
+      return B.createClass("SassMap", new A.closure239(), P.LinkedHashMap_LinkedHashMap$_literal(["getKey", new A.closure240(), "getValue", new A.closure241(), "getLength", new A.closure242(), "setKey", new A.closure243(), "setValue", new A.closure244(), "toString", new A.closure245()], type$.legacy_String, type$.legacy_Function));
+    });
+    _lazyOld($, "global9", "$get$global10", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_abs0(), $.$get$_ceil0(), $.$get$_floor0(), $.$get$_max0(), $.$get$_min0(), $.$get$_percentage0(), $.$get$_randomFunction0(), $.$get$_round0(), $.$get$_unit0(), $.$get$_compatible0().withName$1("comparable"), $.$get$_isUnitless0().withName$1("unitless")], type$.JSArray_legacy_BuiltInCallable_2), type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "module8", "$get$module8", function() {
+      return Q.BuiltInModule$0("math", H.setRuntimeTypeInfo([$.$get$_abs0(), $.$get$_acos0(), $.$get$_asin0(), $.$get$_atan0(), $.$get$_atan20(), $.$get$_ceil0(), $.$get$_clamp0(), $.$get$_cos0(), $.$get$_compatible0(), $.$get$_floor0(), $.$get$_hypot0(), $.$get$_isUnitless0(), $.$get$_log0(), $.$get$_max0(), $.$get$_min0(), $.$get$_percentage0(), $.$get$_pow0(), $.$get$_randomFunction0(), $.$get$_round0(), $.$get$_sin0(), $.$get$_sqrt0(), $.$get$_tan0(), $.$get$_unit0()], type$.JSArray_legacy_BuiltInCallable_2), null, P.LinkedHashMap_LinkedHashMap$_literal(["e", T.SassNumber_SassNumber0(2.718281828459045, null), "pi", T.SassNumber_SassNumber0(3.141592653589793, null)], type$.legacy_String, type$.legacy_Value_2), type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "_ceil0", "$get$_ceil0", function() {
+      return K._numberFunction0("ceil", new K.closure140());
+    });
+    _lazyOld($, "_clamp0", "$get$_clamp0", function() {
+      return K._function8("clamp", "$min, $number, $max", new K.closure205());
+    });
+    _lazyOld($, "_floor0", "$get$_floor0", function() {
+      return K._numberFunction0("floor", new K.closure139());
+    });
+    _lazyOld($, "_max0", "$get$_max0", function() {
+      return K._function8("max", "$numbers...", new K.closure138());
+    });
+    _lazyOld($, "_min0", "$get$_min0", function() {
+      return K._function8("min", "$numbers...", new K.closure137());
+    });
+    _lazyOld($, "_round0", "$get$_round0", function() {
+      return K._numberFunction0("round", T.number2__fuzzyRound$closure());
+    });
+    _lazyOld($, "_abs0", "$get$_abs0", function() {
+      return K._numberFunction0("abs", new K.closure141());
+    });
+    _lazyOld($, "_hypot0", "$get$_hypot0", function() {
+      return K._function8("hypot", "$numbers...", new K.closure203());
+    });
+    _lazyOld($, "_log0", "$get$_log0", function() {
+      return K._function8("log", "$number, $base: null", new K.closure202());
+    });
+    _lazyOld($, "_pow0", "$get$_pow0", function() {
+      return K._function8("pow", "$base, $exponent", new K.closure201());
+    });
+    _lazyOld($, "_sqrt0", "$get$_sqrt0", function() {
+      return K._function8("sqrt", "$number", new K.closure199());
+    });
+    _lazyOld($, "_acos0", "$get$_acos0", function() {
+      return K._function8("acos", "$number", new K.closure209());
+    });
+    _lazyOld($, "_asin0", "$get$_asin0", function() {
+      return K._function8("asin", "$number", new K.closure208());
+    });
+    _lazyOld($, "_atan0", "$get$_atan0", function() {
+      return K._function8("atan", "$number", new K.closure207());
+    });
+    _lazyOld($, "_atan20", "$get$_atan20", function() {
+      return K._function8("atan2", "$y, $x", new K.closure206());
+    });
+    _lazyOld($, "_cos0", "$get$_cos0", function() {
+      return K._function8("cos", "$number", new K.closure204());
+    });
+    _lazyOld($, "_sin0", "$get$_sin0", function() {
+      return K._function8("sin", "$number", new K.closure200());
+    });
+    _lazyOld($, "_tan0", "$get$_tan0", function() {
+      return K._function8("tan", "$number", new K.closure198());
+    });
+    _lazyOld($, "_compatible0", "$get$_compatible0", function() {
+      return K._function8("compatible", "$number1, $number2", new K.closure133());
+    });
+    _lazyOld($, "_isUnitless0", "$get$_isUnitless0", function() {
+      return K._function8("is-unitless", "$number", new K.closure132());
+    });
+    _lazyOld($, "_unit0", "$get$_unit0", function() {
+      return K._function8("unit", "$number", new K.closure134());
+    });
+    _lazyOld($, "_percentage0", "$get$_percentage0", function() {
+      return K._function8("percentage", "$number", new K.closure136());
+    });
+    _lazyOld($, "_random1", "$get$_random2", function() {
+      return P.Random_Random();
+    });
+    _lazyOld($, "_randomFunction0", "$get$_randomFunction0", function() {
+      return K._function8("random", "$limit: null", new K.closure135());
+    });
+    _lazyOld($, "global10", "$get$global6", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([Q._function12("feature-exists", "$feature", new Q.closure223()), Q._function12("inspect", "$value", new Q.closure224()), Q._function12("type-of", "$value", new Q.closure225()), Q._function12("keywords", "$args", new Q.closure226())], type$.JSArray_legacy_BuiltInCallable_2), type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "stderr0", "$get$stderr0", function() {
+      return new B.Stderr0(J.get$stderr$x(self.process));
+    });
+    _lazyOld($, "nullConstructor", "$get$nullConstructor", function() {
+      return new O.closure238().call$0();
+    });
+    _lazyOld($, "epsilon0", "$get$epsilon0", function() {
+      return P.pow(10, -11);
+    });
+    _lazyOld($, "_inverseEpsilon0", "$get$_inverseEpsilon0", function() {
+      return 1 / $.$get$epsilon0();
+    });
+    _lazyOld($, "numberConstructor", "$get$numberConstructor", function() {
+      return B.createClass("SassNumber", new T.closure232(), P.LinkedHashMap_LinkedHashMap$_literal(["getValue", new T.closure233(), "setValue", new T.closure234(), "getUnit", new T.closure235(), "setUnit", new T.closure236(), "toString", new T.closure237()], type$.legacy_String, type$.legacy_Function));
+    });
+    _lazyOld($, "_typesByUnit0", "$get$_typesByUnit0", function() {
+      var t2, t3, t4,
+        t1 = type$.legacy_String;
+      t1 = P.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
+      for (t2 = C.Map_U8AHF.get$entries(C.Map_U8AHF), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
+        t3 = t2.get$current(t2);
+        for (t4 = J.get$iterator$ax(t3.value), t3 = t3.key; t4.moveNext$0();)
+          t1.$indexSet(0, t4.get$current(t4), t3);
+      }
+      return t1;
+    });
+    _lazyOld($, "global11", "$get$global11", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_isSuperselector0(), $.$get$_simpleSelectors0(), $.$get$_parse0().withName$1("selector-parse"), $.$get$_nest0().withName$1("selector-nest"), $.$get$_append1().withName$1("selector-append"), $.$get$_extend0().withName$1("selector-extend"), $.$get$_replace0().withName$1("selector-replace"), $.$get$_unify0().withName$1("selector-unify")], type$.JSArray_legacy_BuiltInCallable_2), type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "module9", "$get$module9", function() {
+      return Q.BuiltInModule$0("selector", H.setRuntimeTypeInfo([$.$get$_isSuperselector0(), $.$get$_simpleSelectors0(), $.$get$_parse0(), $.$get$_nest0(), $.$get$_append1(), $.$get$_extend0(), $.$get$_replace0(), $.$get$_unify0()], type$.JSArray_legacy_BuiltInCallable_2), null, null, type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "_nest0", "$get$_nest0", function() {
+      return T._function7("nest", "$selectors...", new T.closure128());
+    });
+    _lazyOld($, "_append2", "$get$_append1", function() {
+      return T._function7("append", "$selectors...", new T.closure127());
+    });
+    _lazyOld($, "_extend0", "$get$_extend0", function() {
+      return T._function7("extend", "$selector, $extendee, $extender", new T.closure126());
+    });
+    _lazyOld($, "_replace0", "$get$_replace0", function() {
+      return T._function7("replace", "$selector, $original, $replacement", new T.closure125());
+    });
+    _lazyOld($, "_unify0", "$get$_unify0", function() {
+      return T._function7("unify", "$selector1, $selector2", new T.closure124());
+    });
+    _lazyOld($, "_isSuperselector0", "$get$_isSuperselector0", function() {
+      return T._function7("is-superselector", "$super, $sub", new T.closure131());
+    });
+    _lazyOld($, "_simpleSelectors0", "$get$_simpleSelectors0", function() {
+      return T._function7("simple-selectors", "$selector", new T.closure130());
+    });
+    _lazyOld($, "_parse0", "$get$_parse0", function() {
+      return T._function7("parse", "$selector", new T.closure129());
+    });
+    _lazyOld($, "_random2", "$get$_random1", function() {
+      return P.Random_Random();
+    });
+    _lazyOld($, "_previousUniqueId0", "$get$_previousUniqueId0", function() {
+      return $.$get$_random1().nextInt$1(H._asIntS(P.pow(36, 6)));
+    });
+    _lazyOld($, "global12", "$get$global12", function() {
+      return P.UnmodifiableListView$(H.setRuntimeTypeInfo([$.$get$_unquote0(), $.$get$_quote0(), $.$get$_toUpperCase0(), $.$get$_toLowerCase0(), $.$get$_uniqueId0(), $.$get$_length1().withName$1("str-length"), $.$get$_insert0().withName$1("str-insert"), $.$get$_index1().withName$1("str-index"), $.$get$_slice0().withName$1("str-slice")], type$.JSArray_legacy_BuiltInCallable_2), type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "module10", "$get$module10", function() {
+      return Q.BuiltInModule$0("string", H.setRuntimeTypeInfo([$.$get$_unquote0(), $.$get$_quote0(), $.$get$_toUpperCase0(), $.$get$_toLowerCase0(), $.$get$_length1(), $.$get$_insert0(), $.$get$_index1(), $.$get$_slice0(), $.$get$_uniqueId0()], type$.JSArray_legacy_BuiltInCallable_2), null, null, type$.legacy_BuiltInCallable_2);
+    });
+    _lazyOld($, "_unquote0", "$get$_unquote0", function() {
+      return D._function6("unquote", "$string", new D.closure123());
+    });
+    _lazyOld($, "_quote0", "$get$_quote0", function() {
+      return D._function6("quote", "$string", new D.closure122());
+    });
+    _lazyOld($, "_length2", "$get$_length1", function() {
+      return D._function6("length", "$string", new D.closure118());
+    });
+    _lazyOld($, "_insert0", "$get$_insert0", function() {
+      return D._function6("insert", "$string, $insert, $index", new D.closure117());
+    });
+    _lazyOld($, "_index2", "$get$_index1", function() {
+      return D._function6("index", "$string, $substring", new D.closure116());
+    });
+    _lazyOld($, "_slice0", "$get$_slice0", function() {
+      return D._function6("slice", "$string, $start-at, $end-at: -1", new D.closure115());
+    });
+    _lazyOld($, "_toUpperCase0", "$get$_toUpperCase0", function() {
+      return D._function6("to-upper-case", "$string", new D.closure121());
+    });
+    _lazyOld($, "_toLowerCase0", "$get$_toLowerCase0", function() {
+      return D._function6("to-lower-case", "$string", new D.closure120());
+    });
+    _lazyOld($, "_uniqueId0", "$get$_uniqueId0", function() {
+      return D._function6("unique-id", "", new D.closure119());
+    });
+    _lazyOld($, "stringConstructor", "$get$stringConstructor", function() {
+      return B.createClass("SassString", new D.closure228(), P.LinkedHashMap_LinkedHashMap$_literal(["getValue", new D.closure229(), "setValue", new D.closure230(), "toString", new D.closure231()], type$.legacy_String, type$.legacy_Function));
+    });
+    _lazyOld($, "_emptyQuoted0", "$get$_emptyQuoted0", function() {
+      return D.SassString$0("", true);
+    });
+    _lazyOld($, "_emptyUnquoted0", "$get$_emptyUnquoted0", function() {
+      return D.SassString$0("", false);
+    });
+    _lazyOld($, "_jsThrow", "$get$_jsThrow", function() {
+      return new self.Function("error", "throw error;");
+    });
+    _lazyOld($, "_isUndefined", "$get$_isUndefined", function() {
+      return new self.Function("value", "return value === undefined;");
+    });
+    _lazyOld($, "_jsInstanceOf", "$get$_jsInstanceOf", function() {
+      return new self.Function("value", "type", "return value instanceof type;");
+    });
+    _lazyOld($, "_noSourceUrl0", "$get$_noSourceUrl0", function() {
+      return P.Uri_parse("-");
+    });
+  })();
+  (function nativeSupport() {
+    !function() {
+      var intern = function(s) {
+        var o = {};
+        o[s] = 1;
+        return Object.keys(hunkHelpers.convertToFastObject(o))[0];
+      };
+      init.getIsolateTag = function(name) {
+        return intern("___dart_" + name + init.isolateTag);
+      };
+      var tableProperty = "___dart_isolate_tags_";
+      var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
+      var rootProperty = "_ZxYxX";
+      for (var i = 0;; i++) {
+        var property = intern(rootProperty + "_" + i + "_");
+        if (!(property in usedProperties)) {
+          usedProperties[property] = 1;
+          init.isolateTag = property;
+          break;
+        }
+      }
+      init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
+    }();
+    hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer: J.Interceptor, DataView: H.NativeTypedData, ArrayBufferView: H.NativeTypedData, Float32Array: H.NativeFloat32List, Float64Array: H.NativeFloat64List, Int16Array: H.NativeInt16List, Int32Array: H.NativeInt32List, Int8Array: H.NativeInt8List, Uint16Array: H.NativeUint16List, Uint32Array: H.NativeUint32List, Uint8ClampedArray: H.NativeUint8ClampedList, CanvasPixelArray: H.NativeUint8ClampedList, Uint8Array: H.NativeUint8List});
+    hunkHelpers.setOrUpdateLeafTags({ArrayBuffer: true, DataView: true, ArrayBufferView: false, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false});
+    H.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView";
+    H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
+    H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
+    H.NativeTypedArrayOfDouble.$nativeSuperclassTag = "ArrayBufferView";
+    H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
+    H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
+    H.NativeTypedArrayOfInt.$nativeSuperclassTag = "ArrayBufferView";
+  })();
+  Function.prototype.call$2 = function(a, b) {
+    return this(a, b);
+  };
+  Function.prototype.call$1 = function(a) {
+    return this(a);
+  };
+  Function.prototype.call$0 = function() {
+    return this();
+  };
+  Function.prototype.call$3$1 = function(a) {
+    return this(a);
+  };
+  Function.prototype.call$2$1 = function(a) {
+    return this(a);
+  };
+  Function.prototype.call$1$1 = function(a) {
+    return this(a);
+  };
+  Function.prototype.call$3 = function(a, b, c) {
+    return this(a, b, c);
+  };
+  Function.prototype.call$4 = function(a, b, c, d) {
+    return this(a, b, c, d);
+  };
+  Function.prototype.call$3$3 = function(a, b, c) {
+    return this(a, b, c);
+  };
+  Function.prototype.call$2$2 = function(a, b) {
+    return this(a, b);
+  };
+  Function.prototype.call$6 = function(a, b, c, d, e, f) {
+    return this(a, b, c, d, e, f);
+  };
+  Function.prototype.call$5 = function(a, b, c, d, e) {
+    return this(a, b, c, d, e);
+  };
+  Function.prototype.call$1$3 = function(a, b, c) {
+    return this(a, b, c);
+  };
+  Function.prototype.call$2$3 = function(a, b, c) {
+    return this(a, b, c);
+  };
+  Function.prototype.call$1$2 = function(a, b) {
+    return this(a, b);
+  };
+  Function.prototype.call$1$0 = function() {
+    return this();
+  };
+  convertAllToFastObject(holders);
+  convertToFastObject($);
+  (function(callback) {
+    if (typeof document === "undefined") {
+      callback(null);
+      return;
+    }
+    if (typeof document.currentScript != 'undefined') {
+      callback(document.currentScript);
+      return;
+    }
+    var scripts = document.scripts;
+    function onLoad(event) {
+      for (var i = 0; i < scripts.length; ++i)
+        scripts[i].removeEventListener("load", onLoad, false);
+      callback(event.target);
+    }
+    for (var i = 0; i < scripts.length; ++i)
+      scripts[i].addEventListener("load", onLoad, false);
+  })(function(currentScript) {
+    init.currentScript = currentScript;
+    if (typeof dartMainRunner === "function")
+      dartMainRunner(R.main0, []);
+    else
+      R.main0([]);
+  });
+})();
diff --git a/node_modules/sass/sass.js b/node_modules/sass/sass.js
new file mode 100644
index 0000000..969fd8a
--- /dev/null
+++ b/node_modules/sass/sass.js
@@ -0,0 +1,4 @@
+#!/usr/bin/env node
+
+var module = require('./sass.dart.js');
+module.cli_pkg_main_0_(process.argv.slice(2));
