~evanj/cms

fa4ea4a12974e37872ce895a09ecf64cc22bd753 — Evan M Jones 1 year, 5 months ago 66aa25a
WIP(html+css): Refactor.
M TODO => TODO +3 -0
@@ 5,3 5,6 @@ Allow updating of space.
Cache: When an item is updated, any item that references it is not.
What happens when you delete a content's only reference list content? Then try
to copy space?

BUG: Removing field from contenttype seems to be broken.
BUG: create content type, create content, add string field to content type, copy space broken.

M internal/s/tmpl/html/_header.html => internal/s/tmpl/html/_header.html +6 -2
@@ 18,7 18,10 @@
        {{ if .Content }}
        <li class='nav-item'><a class='nav-link' href='/contenttype/{{ .Space.ID}}/{{ .ContentType.ID }}'>{{ .ContentType.Name }}</a></li>
        {{ end }}
        <li class='nav-item'><a class='nav-link' href='//git.sr.ht/~evanj/cms'>Source</a></li>
        {{ if and .ContentType (not .Content) }}
          <li class='nav-item'><a data-toggle="modal" data-target="#updateModal" class='nav-link' href='#'>Update</a></li>
          <li class='nav-item'><a data-toggle="modal" data-target="#deleteModal" class='nav-link' href='#'>Delete</a></li>
        {{ end }}
        {{ if and .Space (not .ContentType) }}
          <li class='nav-item'><a data-toggle="modal" data-target="#copyModal" class='nav-link' href='#'>Copy</a></li>
          <li class='nav-item'><a data-toggle="modal" data-target="#deleteModal" class='nav-link' href='#'>Delete</a></li>


@@ 26,10 29,11 @@
        {{ if .User }}
          <li class='nav-item'>
            <form method=POST action='/user/logout' enctype='multipart/form-data'>
              <input type=submit class="btn btn-link nav-link" value=Logout />
              <input type=submit class="btn btn-link nav-link border-0" value=Logout />
            </form>
          </li>
        {{ end}}
        <li class='nav-item'><a class='nav-link' href='//git.sr.ht/~evanj/cms'>Source</a></li>
      </ul>
    </div>
  </nav>

M internal/s/tmpl/html/content.html => internal/s/tmpl/html/content.html +1 -0
@@ 191,6 191,7 @@
    <hr/>
    {{ template "html/_footer.html" }}
  </main>
  {{ template "html/_scripts.html" }}
  <script src="//unpkg.com/tinymce@5.2.0/tinymce.min.js"></script>
  <script src='//unpkg.com/autocomplete.js@0.37.1/dist/autocomplete.min.js'></script>
  <script>{{ template "js/content.js" $ }}</script>

M internal/s/tmpl/html/contenttype.html => internal/s/tmpl/html/contenttype.html +220 -161
@@ 6,183 6,242 @@
  <title>CMS | {{ .Space.Name }} | {{ .ContentType.Name }}</title>
</head>

<body class=contenttype style='max-width: 800px;'>
<body class='contenttype bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <hr/>
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">{{.ContentType.Name}}</h1>
    </div>
    <article>
      <h1>{{ .Space.Name }}, {{ .ContentType.Name }}</h1>
      <details>
        <summary>Create a {{ .ContentType.Name }} Content</summary>
        <form method=POST action='/content/new' enctype='multipart/form-data'>
          <input required type=hidden name=space value="{{ .Space.ID }}" />
          <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />

          <br>
          <fieldset>
          {{ range .ContentType.Fields }}
      <form method=POST action='/contenttype/delete' enctype='multipart/form-data'>
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
        <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">
          <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
            <div class="modal-content">
              <div class="modal-header">
                <h5 class="modal-title" id="deleteModalLabel">Delete {{.ContentType.Name}}</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                  <span aria-hidden="true">&times;</span>
                </button>
              </div>
              <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                <button type="submit" class="btn btn-primary">Go</button>
              </div>
            </div>
          </div>
        </div>
      </form>

            <label for="create-{{ .Type }}-{{ .Name }}">{{ .Name }}</label>
            <br>
            {{ if eq .Type "StringSmall" }}
              <input id="create-{{ .Type }}-{{ .Name }}" required type=text name="{{ .Type }}-{{ .Name }}" placeholder="{{ .Name }}" />
            {{ end }}
            {{ if eq .Type "StringBig" }}
              <textarea id="create-{{ .Type }}-{{ .Name }}" required type=text name="{{ .Type }}-{{ .Name }}" placeholder="{{ .Name }}" ></textarea>
            {{ end }}
            {{ if eq .Type "InputHTML" }}
              <textarea id="create-{{ .Type }}-{{ .Name }}" class='input-html' required type=text name="{{ .Type }}-{{ .Name }}" placeholder="{{ .Name }}" ></textarea>
            {{ end }}
            {{ if eq .Type "InputMarkdown" }}
              <textarea id="create-{{ .Type }}-{{ .Name }}" class='input-markdown' required type=text name="{{ .Type }}-{{ .Name }}" placeholder="{{ .Name }}" ></textarea>
            {{ end }}
            {{ if eq .Type "File" }}
              <input id="create-{{ .Type }}-{{ .Name }}" required type=file name="{{ .Type }}-{{ .Name }}" multiple=false />
            {{ end }}
            {{ if eq .Type "Date" }}
              <input id="create-{{ .Type }}-{{ .Name }}" required type=date name="{{ .Type }}-{{ .Name }}" placeholder="{{ .Name }}" />
            {{ end }}
            {{ if eq .Type "Reference" }}
              <input id="create-{{ .Type }}-{{ .Name }}" class='output-ref' required type=hidden name="{{ .Type }}-{{ .Name }}" />
              <input class='input-ref' type=button value=Open />
              <dialog>
                <menu>
                  <div>
                    <p>Search for content to use as reference.</p>
                    <label for='search-ct'>Content type</label>
                    <br>
                    <input id='search-ct' autofocus class='input-contenttype' type=text placeholder='Search by content type' />
                    <br>
                    <br>
                    <label for='search-c'>Content name</label>
      <form method=POST action='/content/new' enctype='multipart/form-data'>
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
        <div class="modal fade" id="createModal" tabindex="-1" role="dialog" aria-labelledby="createModalLabel" aria-hidden="true">
          <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
            <div class="modal-content">
              <div class="modal-header">
                <h5 class="modal-title" id="createModalLabel">Create a new {{.ContentType.Name}} content</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                  <span aria-hidden="true">&times;</span>
                </button>
              </div>
              <div class="modal-body">
                {{ range .ContentType.Fields }}
                  <div class='form-group'>
                    <label for="create-{{ .Type }}-{{ .Name }}">{{title .Name}}</label>
                    <br>
                    <input id='search-c' disabled class='input-content' type=text placeholder='Search by content name' />
                    {{ if eq .Type "StringSmall" }}
                      <input class="form-control" id="create-{{ .Type }}-{{ .Name }}" required type=text name="{{ .Type }}-{{ .Name }}" placeholder="{{ title .Name }}" />
                    {{ end }}
                    {{ if eq .Type "StringBig" }}
                      <textarea class="form-control" id="create-{{ .Type }}-{{ .Name }}" required type=text name="{{ .Type }}-{{ .Name }}" placeholder="{{ title .Name }}" ></textarea>
                    {{ end }}
                    {{ if eq .Type "InputHTML" }}
                      <textarea class="form-control input-html" id="create-{{ .Type }}-{{ .Name }}" required type=text name="{{ .Type }}-{{ .Name }}" placeholder="{{ title .Name }}" ></textarea>
                    {{ end }}
                    {{ if eq .Type "InputMarkdown" }}
                      <textarea class="form-control input-markdown" id="create-{{ .Type }}-{{ .Name }}" required type=text name="{{ .Type }}-{{ .Name }}" placeholder="{{ title .Name }}" ></textarea>
                    {{ end }}
                    {{ if eq .Type "File" }}
                      <div class="input-group mb-3">
                        <div class="input-group-prepend">
                          <span class="input-group-text" id="inputGroupFileAddon01">Upload</span>
                        </div>
                        <div class="custom-file">
                          <input aria-describedby="inputGroupFileAddon01" id="create-{{ .Type }}-{{ .Name }}" required type=file name="{{ .Type }}-{{ .Name }}" multiple=false />
                          <label class="custom-file-label" for="create-{{ .Type }}-{{ .Name }}">Choose file</label>
                        </div>
                      </div>
                    {{ end }}
                    {{ if eq .Type "Date" }}
                      <input class="form-control" id="create-{{ .Type }}-{{ .Name }}" required type=date name="{{ .Type }}-{{ .Name }}" placeholder="{{ title .Name }}" />
                    {{ end }}
                    {{ if eq .Type "Reference" }}
                      <input id="create-{{ .Type }}-{{ .Name }}" class='output-ref' required type=hidden name="{{ .Type }}-{{ .Name }}" />
                      <input class="form-control input-ref" type=button value=Open />
                      <dialog>
                        <menu>
                          <div>
                            <p>Search for content to use as reference.</p>
                            <label for='search-ct'>Content type</label>
                            <br>
                            <input id='search-ct' autofocus class='input-contenttype' type=text placeholder='Search by content type' />
                            <br>
                            <br>
                            <label for='search-c'>Content name</label>
                            <br>
                            <input id='search-c' disabled class='input-content' type=text placeholder='Search by content name' />
                          </div>
                        </menu>
                      </dialog>
                    {{ end }}
                    {{ if eq .Type "ReferenceList" }}
                      <input id="create-{{ .Type }}-{{ .Name }}" class='output-ref' required type=hidden name="{{ .Type }}-{{ .Name }}" />
                      <input class="form-control input-ref" type=button value=Open />
                      <dialog>
                        <menu>
                          <div>
                            <center>
                              <p>Search for content to use as reference.</p>
                            </center>
                            <input autofocus class='input-contenttype' type=text placeholder='Search by content type' />
                            <input disabled class='input-content' type=text placeholder='Search by content name' />
                            <div>
                              <input class=left type=button value=Clear />
                              <input class=right type=button value=Done />
                            </div>
                          </div>
                        </menu>
                      </dialog>
                    {{ end }}
                  </div>
                </menu>
              </dialog>
            {{ end }}
            {{ if eq .Type "ReferenceList" }}
              <input id="create-{{ .Type }}-{{ .Name }}" class='output-ref' required type=hidden name="{{ .Type }}-{{ .Name }}" />
              <input class='input-ref' type=button value=Open />
              <dialog>
                <menu>
                  <div>
                    <center>
                      <p>Search for content to use as reference.</p>
                    </center>
                    <input autofocus class='input-contenttype' type=text placeholder='Search by content type' />
                    <input disabled class='input-content' type=text placeholder='Search by content name' />
                    <div>
                      <input class=left type=button value=Clear />
                      <input class=right type=button value=Done />
                    </div>
                  </div>
                </menu>
              </dialog>
            {{ end }}
            <br>
            <br>
          {{ end }}
          <input type=submit value=Create />
          </fieldset>
          <br>
        </form>
      </details>

      <details>
        <summary>Update {{ .ContentType.Name }} Content Type</summary>
        <form method=POST action='/contenttype/update' enctype='multipart/form-data'>
          <input required type=hidden name=space value="{{ .Space.ID }}" />
          <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
          <br>
          <fieldset>
            <legend>Content type name</legend>
            <label for='update-name'>Name</label>
            <br>
            <input id='update-name' autofocus required type=text name=name placeholder="name" value="{{ .ContentType.Name }}" />
          </fieldset>
          <br>
          <fieldset>
          <legend>Fields</legend>
          {{ range $index, $item := .ContentType.Fields }}

            {{ if eq $index 0 }}
              <div id='first-fieldset'>
                <input required type=hidden name="field_update_id_{{ inc $index }}" value="{{ .ID }}" />
                <input readonly="readonly" required type=text name="field_update_name_{{ inc $index }}" value="{{ .Name }}" />
                <select value="{{ .Type }}" readonly="readonly" required name="field_update_type_{{ inc $index }}">
                  <option disabled value>Field Type</option>
                  <option selected value="StringSmall">String Small</option>
                  <option disabled value="StringBig">String Big</option>
                  <option disabled value="InputHTML">HTML</option>
                  <option disabled value="InputMarkdown">Markdown</option>
                  <option disabled value="File">File</option>
                  <option disabled value="Date">Date</option>
                  <option disabled value="Reference">Reference</option>
                  <option disabled value="ReferenceList">ReferenceList</option>
                </select>
                <input disabled type=button value='Remove Field' />
                {{ end }}
              </div>
            {{ else }}
              <div>
                <input required type=hidden name="field_update_id_{{ inc $index }}" value="{{ .ID }}" />
                <input required type=text name="field_update_name_{{ inc $index }}" value="{{ .Name }}" />
                <select value="{{ .Type }}" readonly="readonly" required name="field_update_type_{{ inc $index }}">
                  <option disabled value>Field Type</option>
                  <option {{ if eq .Type "StringSmall" }}   selected {{ else }} disabled {{ end }} value="StringSmall">String Small</option>
                  <option {{ if eq .Type "StringBig" }}     selected {{ else }} disabled {{ end }} value="StringBig">String Big</option>
                  <option {{ if eq .Type "InputHTML" }}     selected {{ else }} disabled {{ end }} value="InputHTML">HTML</option>
                  <option {{ if eq .Type "InputMarkdown" }} selected {{ else }} disabled {{ end }} value="InputMarkdown">Markdown</option>
                  <option {{ if eq .Type "File" }}          selected {{ else }} disabled {{ end }} value="File">File</option>
                  <option {{ if eq .Type "Date" }}          selected {{ else }} disabled {{ end }} value="Date">Date</option>
                  <option {{ if eq .Type "Reference" }}     selected {{ else }} disabled {{ end }} value="Reference">Reference</option>
                  <option {{ if eq .Type "ReferenceList" }} selected {{ else }} disabled {{ end }} value="ReferenceList">ReferenceList</option>
                </select>
                <input type=button value='Remove Field' />
              <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                <button type="submit" class="btn btn-primary">Go</button>
              </div>
            {{ end }}
            <br>
          {{ end }}
          <input type=button id='add-fieldbtn' value='Add Another Field' />
          <input type=submit value=Update />
          </fieldset>
          <br>
        </form>
      </details>
            </div>
          </div>
        </div>
      </form>

      <details>
        <summary>Delete {{ .ContentType.Name }} Content Type</summary>
        <form method=POST action='/contenttype/delete' enctype='multipart/form-data'>
          <input required type=hidden name=space value="{{ .Space.ID }}" />
          <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
          <br>
          <fieldset>
            <input type=submit value=Delete />
          </fieldset>
          <br>
        </form>
      </details>
      <form method=POST action='/contenttype/update' enctype='multipart/form-data'>
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
        <div class="modal fade" id="updateModal" tabindex="-1" role="dialog" aria-labelledby="Update {{.ContentType.Name}}" aria-hidden="true">
          <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
            <div class="modal-content">
              <div class="modal-header">
                <h5 class="modal-title" id="contenttypeModalLabel">Update {{.ContentType.Name}}</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                  <span aria-hidden="true">&times;</span>
                </button>
              </div>
              <div class="modal-body">
                <label for="contenttypeName">Name</label>
                <input value="{{.ContentType.Name}}" name=name type=text id="contenttypeName" class="mb-3 form-control" placeholder="Name" required>
                <div id='first-fieldset' class='container-fluid px-0'>
                  {{ range $index, $item := .ContentType.Fields }}
                    {{ if eq $index 0 }}
                      <div id='first-fieldset'>
                        <label for="fieldsetFirst">Fields</label>
                        <input required type=hidden name="field_update_id_{{ inc $index }}" value="{{ .ID }}" />
                        <input class="mb-3 form-control" readonly="readonly" required type=text name="field_update_name_{{ inc $index }}" value="{{ .Name }}" />
                        <div class='form-group row'>
                          <div class='col-6'>
                            <select class="w-100 form-control" value="{{ .Type }}" readonly="readonly" required name="field_update_type_{{ inc $index }}">
                              <option disabled value>Field Type</option>
                              <option selected value="StringSmall">String Small</option>
                              <option disabled value="StringBig">String Big</option>
                              <option disabled value="InputHTML">HTML</option>
                              <option disabled value="InputMarkdown">Markdown</option>
                              <option disabled value="File">File</option>
                              <option disabled value="Date">Date</option>
                              <option disabled value="Reference">Reference</option>
                              <option disabled value="ReferenceList">ReferenceList</option>
                            </select>
                          </div>
                          <div class='col-6'>
                            <input class='w-100 btn btn-primary' disabled type=button value='Remove Field' />
                          </div>
                        </div>
                      </div>
                    {{ else }}
                      <div>
                        <input required type=hidden name="field_update_id_{{ inc $index }}" value="{{ .ID }}" />
                        <input class="mb-3 form-control" required type=text name="field_update_name_{{ inc $index }}" value="{{ .Name }}" />
                        <div class='form-group row'>
                          <div class='col-6'>
                            <select class="w-100 form-control" value="{{ .Type }}" readonly="readonly" required name="field_update_type_{{ inc $index }}">
                              <option disabled value>Field Type</option>
                              <option {{ if eq .Type "StringSmall" }}   selected {{ else }} disabled {{ end }} value="StringSmall">String Small</option>
                              <option {{ if eq .Type "StringBig" }}     selected {{ else }} disabled {{ end }} value="StringBig">String Big</option>
                              <option {{ if eq .Type "InputHTML" }}     selected {{ else }} disabled {{ end }} value="InputHTML">HTML</option>
                              <option {{ if eq .Type "InputMarkdown" }} selected {{ else }} disabled {{ end }} value="InputMarkdown">Markdown</option>
                              <option {{ if eq .Type "File" }}          selected {{ else }} disabled {{ end }} value="File">File</option>
                              <option {{ if eq .Type "Date" }}          selected {{ else }} disabled {{ end }} value="Date">Date</option>
                              <option {{ if eq .Type "Reference" }}     selected {{ else }} disabled {{ end }} value="Reference">Reference</option>
                              <option {{ if eq .Type "ReferenceList" }} selected {{ else }} disabled {{ end }} value="ReferenceList">ReferenceList</option>
                            </select>
                          </div>
                          <div class='col-6'>
                            <input class='w-100 btn btn-primary btn-remove' type=button value='Remove Field' />
                          </div>
                        </div>
                      </div>
                    {{ end }}
                  {{ end }}
                </div>

      <h2>Browse {{ .ContentType.Name }} Content</h2>
      {{ if .ContentList }}
        <ul>
          {{ range .ContentList }}
            <li> 
              <a href='/content/{{ $.Space.ID }}/{{ $.ContentType.ID }}/{{ .ID }}'>
                {{ (.MustValueByName "name").Value }}
              </a>
            </li>
          {{ end }}
        </ul>
      {{ else }}
        <p>No content has been created with a content type of {{ .ContentType.Name }}</p>
      {{ end }}
                <a href='#' class='btn btn-link' id='add-fieldbtn'>Add Another Field</a>
              </div>
              <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                <button type="submit" class="btn btn-primary">Go</button>
              </div>
            </div>
          </div>
        </div>
      </form>

      <div class="container">
        <div class='row'>
          <div class='offset-lg-3 col-lg-6'>
            <div class="my-3 p-3 bg-white rounded shadow-sm">
                <small class="d-block text-right float-right" data-toggle="modal" data-target="#createModal">
                  <a href="#">Create a new content</a>
                </small>
                <h6 class="border-bottom border-gray pb-2 mb-0">Your {{.ContentType.Name}} content</h6>
              {{ if .ContentList }}
                {{ range .ContentList }}
                <div class="media text-muted pt-3">
                  <a href='/content/{{ $.Space.ID }}/{{ $.ContentType.ID }}/{{ .ID }}'  class="media-body pb-3 mb-0 small lh-125 border-bottom border-gray">
                    <strong class="d-block text-gray-dark">
                      {{ (.MustValueByName "name").Value }}
                    </strong>
                  </a>
                </div>
                {{ end }}
                <small class="d-block text-right mt-3">
                  <a href="#">Load more</a>
                </small>
              {{ else }}
                <div class="mt-3 alert alert-primary" role="alert">
                  You haven't created any content yet. 
                </div>
              {{ end }}
            </div>
          </div>
        </div>
      </div>
    </article>
    <hr/>
    {{ template "html/_footer.html" }}
  </main>
  {{ template "html/_scripts.html" }}
  <script src='//unpkg.com/tinymce@5.2.0/tinymce.min.js'></script>
  <script src='//unpkg.com/autocomplete.js@0.37.1/dist/autocomplete.min.js'></script>
  <script>{{ template "js/space.js" }}</script>

M internal/s/tmpl/js/space.js => internal/s/tmpl/js/space.js +9 -8
@@ 43,12 43,13 @@

// For update: remove old fields
(function() { 
  // var btns = document.querySelectorAll("form div input[type=button]");
  // for (var e = 0; e < btns.length; e++) {
  //   (function(btn) {
  //     btn.addEventListener("click", function handelClick() { 
  //       btn.parentElement.parentElement.removeChild(btn.parentElement);
  //     });
  //   })(btns[e]);
  // }
  var btns = document.querySelectorAll(".btn-remove");
  for (var e = 0; e < btns.length; e++) {
    (function(btn) {
      btn.addEventListener("click", function handelClick() { 
        btn = btn.parentElement.parentElement
        btn.parentElement.parentElement.removeChild(btn.parentElement);
      });
    })(btns[e]);
  }
})();

M internal/s/tmpl/tmpl.go => internal/s/tmpl/tmpl.go +3 -1
@@ 2,6 2,7 @@ package tmpl

import (
	"html/template"
	"strings"
)

//go:generate embed -pattern */* -id tmpls


@@ 12,7 13,8 @@ func MustParse(name string) *template.Template {
	if all == nil {

		fns := template.FuncMap{
			"inc": func(i int) int { return i + 1 },
			"inc":   func(i int) int { return i + 1 },
			"title": func(str string) string { return strings.Title(str) },
		}

		all = template.New("cms")

M internal/s/tmpl/tmpls_embed.go => internal/s/tmpl/tmpls_embed.go +3 -3
@@ 22,13 22,13 @@ func init() {

	tmpls["html/_head.html"] = tostring("PG1ldGEgY2hhcnNldD0idXRmLTgiPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iaHR0cHM6Ly9mYXZpY29uLmV2YW5qb24uZXMvMC8xMDUvMjE3LzMyL2Zhdmljb24uaWNvIiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vc3RhY2twYXRoLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzQuNS4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIgLz4K")

	tmpls["html/_header.html"] = tostring("PGhlYWRlciBjbGFzcz0nYmctcHJpbWFyeSc+CiAgPG5hdiBjbGFzcz0nY29udGFpbmVyIG5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1kYXJrJz4KICAgIDxhIGNsYXNzPSduYXZiYXItYnJhbmQnIGhyZWY9Jy8nPkNNUzwvYT4KICAgIDxidXR0b24gY2xhc3M9J25hdmJhci10b2dnbGVyJyB0eXBlPSdidXR0b24nIGRhdGEtdG9nZ2xlPSdjb2xsYXBzZScgZGF0YS10YXJnZXQ9JyNuYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWNvbnRyb2xzPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWV4cGFuZGVkPSdmYWxzZScgYXJpYS1sYWJlbD0nVG9nZ2xlIG5hdmlnYXRpb24nPgogICAgICA8c3BhbiBjbGFzcz0nbmF2YmFyLXRvZ2dsZXItaWNvbic+PC9zcGFuPgogICAgPC9idXR0b24+CiAgICA8ZGl2IGNsYXNzPSdjb2xsYXBzZSBuYXZiYXItY29sbGFwc2UnIGlkPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50Jz4KICAgICAgPHVsIGNsYXNzPSduYXZiYXItbmF2IG1sLWF1dG8nPgogICAgICAgIHt7IGlmIC5TcGFjZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyc+SG9tZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Db250ZW50VHlwZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuSG9vayB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudCB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL2NvbnRlbnR0eXBlL3t7IC5TcGFjZS5JRH19L3t7IC5Db250ZW50VHlwZS5JRCB9fSc+e3sgLkNvbnRlbnRUeXBlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy8vZ2l0LnNyLmh0L35ldmFuai9jbXMnPlNvdXJjZTwvYT48L2xpPgogICAgICAgIHt7IGlmIGFuZCAuU3BhY2UgKG5vdCAuQ29udGVudFR5cGUpIH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29weU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkNvcHk8L2E+PC9saT4KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNkZWxldGVNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+CiAgICAgICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3VzZXIvbG9nb3V0JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9ImJ0biBidG4tbGluayBuYXYtbGluayIgdmFsdWU9TG9nb3V0IC8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDwvbGk+CiAgICAgICAge3sgZW5kfX0KICAgICAgPC91bD4KICAgIDwvZGl2PgogIDwvbmF2Pgo8L2hlYWRlcj4K")
	tmpls["html/_header.html"] = tostring("PGhlYWRlciBjbGFzcz0nYmctcHJpbWFyeSc+CiAgPG5hdiBjbGFzcz0nY29udGFpbmVyIG5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1kYXJrJz4KICAgIDxhIGNsYXNzPSduYXZiYXItYnJhbmQnIGhyZWY9Jy8nPkNNUzwvYT4KICAgIDxidXR0b24gY2xhc3M9J25hdmJhci10b2dnbGVyJyB0eXBlPSdidXR0b24nIGRhdGEtdG9nZ2xlPSdjb2xsYXBzZScgZGF0YS10YXJnZXQ9JyNuYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWNvbnRyb2xzPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWV4cGFuZGVkPSdmYWxzZScgYXJpYS1sYWJlbD0nVG9nZ2xlIG5hdmlnYXRpb24nPgogICAgICA8c3BhbiBjbGFzcz0nbmF2YmFyLXRvZ2dsZXItaWNvbic+PC9zcGFuPgogICAgPC9idXR0b24+CiAgICA8ZGl2IGNsYXNzPSdjb2xsYXBzZSBuYXZiYXItY29sbGFwc2UnIGlkPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50Jz4KICAgICAgPHVsIGNsYXNzPSduYXZiYXItbmF2IG1sLWF1dG8nPgogICAgICAgIHt7IGlmIC5TcGFjZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyc+SG9tZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Db250ZW50VHlwZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuSG9vayB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudCB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL2NvbnRlbnR0eXBlL3t7IC5TcGFjZS5JRH19L3t7IC5Db250ZW50VHlwZS5JRCB9fSc+e3sgLkNvbnRlbnRUeXBlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiBhbmQgLkNvbnRlbnRUeXBlIChub3QgLkNvbnRlbnQpIH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjdXBkYXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+VXBkYXRlPC9hPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgYW5kIC5TcGFjZSAobm90IC5Db250ZW50VHlwZSkgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjb3B5TW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+Q29weTwvYT48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2RlbGV0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Vc2VyIH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz4KICAgICAgICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvdXNlci9sb2dvdXQnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0iYnRuIGJ0bi1saW5rIG5hdi1saW5rIGJvcmRlci0wIiB2YWx1ZT1Mb2dvdXQgLz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgPC9saT4KICAgICAgICB7eyBlbmR9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLy9naXQuc3IuaHQvfmV2YW5qL2Ntcyc+U291cmNlPC9hPjwvbGk+CiAgICAgIDwvdWw+CiAgICA8L2Rpdj4KICA8L25hdj4KPC9oZWFkZXI+Cg==")

	tmpls["html/_scripts.html"] = tostring("PHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0zLjUuMS5zbGltLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3BvcHBlci5qc0AxLjE2LjAvZGlzdC91bWQvcG9wcGVyLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL3N0YWNrcGF0aC5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC80LjUuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4K")

	tmpls["html/content.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUyB8IHt7IC5TcGFjZS5OYW1lIH19IHwge3sgLkNvbnRlbnRUeXBlLk5hbWUgfX0gfCB7eyAoLkNvbnRlbnQuTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX08L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGNsYXNzPWNvbnRlbnQgc3R5bGU9J21heC13aWR0aDogODAwcHg7Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8aHIvPgogICAgPGFydGljbGU+CiAgICAgIDxoMT57eyAuU3BhY2UuTmFtZSB9fSwge3sgLkNvbnRlbnRUeXBlLk5hbWUgfX0sIHt7ICguQ29udGVudC5NdXN0VmFsdWVCeU5hbWUgIm5hbWUiKS5WYWx1ZSB9fTwvaDE+CiAgICAgIDxkZXRhaWxzPgogICAgICAgIDxzdW1tYXJ5PlVwZGF0ZSBDb250ZW50PC9zdW1tYXJ5PgogICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnQvdXBkYXRlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudCB2YWx1ZT0ie3sgLkNvbnRlbnQuSUQgfX0iIC8+CgogICAgICAgICAgPGJyPgogICAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAge3sgcmFuZ2UgJGluZGV4LCAkaXRlbSA6PSAuQ29udGVudFR5cGUuRmllbGRzIH19CiAgICAgICAgICAgIHt7ICR2YWwgOj0gJC5Db250ZW50Lk11c3RWYWx1ZUJ5TmFtZSAoICRpdGVtLk5hbWUgKSB9fQoKICAgICAgICAgICAge3sgaWYgJHZhbCB9fSAKICAgICAgICAgICAgICB7eyBpZiBlcSAkaW5kZXggMCB9fQogICAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgIDxsYWJlbCBmb3I9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSI+e3sgJHZhbC5OYW1lIH19PC9sYWJlbD4KICAgICAgICAgICAgICA8YnI+CgogICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiU3RyaW5nU21hbGwiIH19CiAgICAgICAgICAgICAgICA8aW5wdXQge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgcGxhY2Vob2xkZXI9Int7ICR2YWwuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJTdHJpbmdCaWciIH19CiAgICAgICAgICAgICAgICA8dGV4dGFyZWEge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19Ij57eyAkdmFsLlZhbHVlIH19PC90ZXh0YXJlYT4KICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJJbnB1dEhUTUwiIH19CiAgICAgICAgICAgICAgICA8dGV4dGFyZWEge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBjbGFzcz0naW5wdXQtaHRtbCcgdmFsdWU9Int7ICR2YWwuVmFsdWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHBsYWNlaG9sZGVyPSJ7eyAkdmFsLk5hbWUgfX0iPnt7ICR2YWwuVmFsdWUgfX08L3RleHRhcmVhPgogICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIklucHV0TWFya2Rvd24iIH19CiAgICAgICAgICAgICAgICA8dGV4dGFyZWEge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBjbGFzcz0naW5wdXQtbWFya2Rvd24nIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19Ij57eyAkdmFsLlZhbHVlIH19PC90ZXh0YXJlYT4KICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJGaWxlIiB9fQogICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgdmFsdWU9Int7ICR2YWwuVmFsdWUgfX0iIHR5cGU9ZmlsZSBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIG11bHRpcGxlPWZhbHNlIC8+CiAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiRGF0ZSIgfX0KICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiByZXF1aXJlZCB0eXBlPWRhdGUgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19IiAvPgogICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIlJlZmVyZW5jZSIgfX0KICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEfX0iIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J2lucHV0LXJlZicgdHlwZT1idXR0b24gdmFsdWU9Int7IGlmICAkdmFsLlJlZk5hbWUgfX17eyAkdmFsLlJlZk5hbWUgfX17eyBlbHNlIH19T3Blbnt7IGVuZH19Ii8+CiAgICAgICAgICAgICAgICA8ZGlhbG9nPgogICAgICAgICAgICAgICAgICA8bWVudT4KICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGNlbnRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2VhcmNoIGZvciBjb250ZW50IHRvIHVzZSBhcyByZWZlcmVuY2UuPC9wPgogICAgICAgICAgICAgICAgICAgICAgPC9jZW50ZXI+CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgYXV0b2ZvY3VzIGNsYXNzPSdpbnB1dC1jb250ZW50dHlwZScgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgY29udGVudCB0eXBlJyAvPgogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkIGNsYXNzPSdpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBjb250ZW50IG5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvbWVudT4KICAgICAgICAgICAgICAgIDwvZGlhbG9nPgogICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgICA8aW5wdXQge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBjbGFzcz0nb3V0cHV0LXJlZicgcmVxdWlyZWQgdHlwZT1oaWRkZW4gdmFsdWU9Int7ICR2YWwuVmFsdWUgfX0iIG5hbWU9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgLz4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0naW5wdXQtcmVmJyB0eXBlPWJ1dHRvbiB2YWx1ZT0ie3sgaWYgICR2YWwuUmVmTGlzdE5hbWVzIH19e3sgJHZhbC5SZWZMaXN0TmFtZXMgfX17eyBlbHNlIH19T3Blbnt7IGVuZH19Ii8+CiAgICAgICAgICAgICAgICA8ZGlhbG9nPgogICAgICAgICAgICAgICAgICA8bWVudT4KICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGNlbnRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2VhcmNoIGZvciBjb250ZW50IHRvIHVzZSBhcyByZWZlcmVuY2UuPC9wPgogICAgICAgICAgICAgICAgICAgICAgPC9jZW50ZXI+CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgYXV0b2ZvY3VzIGNsYXNzPSdpbnB1dC1jb250ZW50dHlwZScgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgY29udGVudCB0eXBlJyAvPgogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkIGNsYXNzPSdpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBjb250ZW50IG5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9bGVmdCB0eXBlPWJ1dHRvbiB2YWx1ZT1DbGVhciAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9cmlnaHQgdHlwZT1idXR0b24gdmFsdWU9RG9uZSAvPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvbWVudT4KICAgICAgICAgICAgICAgIDwvZGlhbG9nPgogICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgIHt7IGlmIGVxICRpbmRleCAwIH19CiAgICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPnt7IC5OYW1lIH19PC9sYWJlbD4KICAgICAgICAgICAgICA8YnI+CgogICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0KICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgICAgPHRleHRhcmVhIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgICAgPHRleHRhcmVhIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J2lucHV0LWh0bWwnIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIklucHV0TWFya2Rvd24iIH19CiAgICAgICAgICAgICAgICA8dGV4dGFyZWEge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBjbGFzcz0naW5wdXQtbWFya2Rvd24nIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIkZpbGUiIH19CiAgICAgICAgICAgICAgICA8aW5wdXQge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPWZpbGUgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIG11bHRpcGxlPWZhbHNlIC8+CiAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJEYXRlIiB9fQogICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT1kYXRlIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2UiIH19CiAgICAgICAgICAgICAgICA8aW5wdXQge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBjbGFzcz0nb3V0cHV0LXJlZicgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J2lucHV0LXJlZicgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgPGRpYWxvZz4KICAgICAgICAgICAgICAgICAgPG1lbnU+CiAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgIDxjZW50ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNlYXJjaCBmb3IgY29udGVudCB0byB1c2UgYXMgcmVmZXJlbmNlLjwvcD4KICAgICAgICAgICAgICAgICAgICAgIDwvY2VudGVyPgogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGF1dG9mb2N1cyBjbGFzcz0naW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IGNvbnRlbnQgdHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZCBjbGFzcz0naW5wdXQtY29udGVudCcgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgY29udGVudCBuYW1lJyAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L21lbnU+CiAgICAgICAgICAgICAgICA8L2RpYWxvZz4KICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgICA8aW5wdXQge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBjbGFzcz0nb3V0cHV0LXJlZicgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J2lucHV0LXJlZicgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgPGRpYWxvZz4KICAgICAgICAgICAgICAgICAgPG1lbnU+CiAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgIDxjZW50ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNlYXJjaCBmb3IgY29udGVudCB0byB1c2UgYXMgcmVmZXJlbmNlLjwvcD4KICAgICAgICAgICAgICAgICAgICAgIDwvY2VudGVyPgogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGF1dG9mb2N1cyBjbGFzcz0naW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IGNvbnRlbnQgdHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZCBjbGFzcz0naW5wdXQtY29udGVudCcgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgY29udGVudCBuYW1lJyAvPgogICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPWxlZnQgdHlwZT1idXR0b24gdmFsdWU9Q2xlYXIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPXJpZ2h0IHR5cGU9YnV0dG9uIHZhbHVlPURvbmUgLz4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L21lbnU+CiAgICAgICAgICAgICAgICA8L2RpYWxvZz4KICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAge3sgZW5kfX0KCiAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9VXBkYXRlIC8+CiAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgPGJyPgogICAgICAgIDwvZm9ybT4KICAgICAgPC9kZXRhaWxzPgoKICAgICAgPGRldGFpbHM+CiAgICAgICAgPHN1bW1hcnk+RGVsZXRlIENvbnRlbnQ8L3N1bW1hcnk+CiAgICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvY29udGVudC9kZWxldGUnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50IHZhbHVlPSJ7eyAuQ29udGVudC5JRCB9fSIgLz4KICAgICAgICAgIDxicj4KICAgICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPURlbGV0ZSAvPgogICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgIDxicj4KICAgICAgICA8L2Zvcm0+CiAgICAgIDwvZGV0YWlscz4KCiAgICA8L2FydGljbGU+CiAgICA8aHIvPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICA8c2NyaXB0IHNyYz0iLy91bnBrZy5jb20vdGlueW1jZUA1LjIuMC90aW55bWNlLm1pbi5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Jy8vdW5wa2cuY29tL2F1dG9jb21wbGV0ZS5qc0AwLjM3LjEvZGlzdC9hdXRvY29tcGxldGUubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9jb250ZW50LmpzIiAkIH19PC9zY3JpcHQ+CjwvYm9keT4KCjwvaHRtbD4K")

	tmpls["html/contenttype.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+Cgo8aGVhZD4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZC5odG1sIiB9fQogIDx0aXRsZT5DTVMgfCB7eyAuU3BhY2UuTmFtZSB9fSB8IHt7IC5Db250ZW50VHlwZS5OYW1lIH19PC90aXRsZT4KPC9oZWFkPgoKPGJvZHkgY2xhc3M9Y29udGVudHR5cGUgc3R5bGU9J21heC13aWR0aDogODAwcHg7Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8aHIvPgogICAgPGFydGljbGU+CiAgICAgIDxoMT57eyAuU3BhY2UuTmFtZSB9fSwge3sgLkNvbnRlbnRUeXBlLk5hbWUgfX08L2gxPgogICAgICA8ZGV0YWlscz4KICAgICAgICA8c3VtbWFyeT5DcmVhdGUgYSB7eyAuQ29udGVudFR5cGUuTmFtZSB9fSBDb250ZW50PC9zdW1tYXJ5PgogICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnQvbmV3JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgoKICAgICAgICAgIDxicj4KICAgICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgIHt7IHJhbmdlIC5Db250ZW50VHlwZS5GaWVsZHMgfX0KCiAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSI+e3sgLk5hbWUgfX08L2xhYmVsPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0KICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyAuTmFtZSB9fSIgPjwvdGV4dGFyZWE+CiAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBjbGFzcz0naW5wdXQtaHRtbCcgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIklucHV0TWFya2Rvd24iIH19CiAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdpbnB1dC1tYXJrZG93bicgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIkZpbGUiIH19CiAgICAgICAgICAgICAgPGlucHV0IGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9ZmlsZSBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgbXVsdGlwbGU9ZmFsc2UgLz4KICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJEYXRlIiB9fQogICAgICAgICAgICAgIDxpbnB1dCBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPWRhdGUgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2UiIH19CiAgICAgICAgICAgICAgPGlucHV0IGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J2lucHV0LXJlZicgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgIDxkaWFsb2c+CiAgICAgICAgICAgICAgICA8bWVudT4KICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICA8cD5TZWFyY2ggZm9yIGNvbnRlbnQgdG8gdXNlIGFzIHJlZmVyZW5jZS48L3A+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWN0Jz5Db250ZW50IHR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9J3NlYXJjaC1jdCcgYXV0b2ZvY3VzIGNsYXNzPSdpbnB1dC1jb250ZW50dHlwZScgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgY29udGVudCB0eXBlJyAvPgogICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWMnPkNvbnRlbnQgbmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWMnIGRpc2FibGVkIGNsYXNzPSdpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBjb250ZW50IG5hbWUnIC8+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9tZW51PgogICAgICAgICAgICAgIDwvZGlhbG9nPgogICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgPGlucHV0IGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J2lucHV0LXJlZicgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgIDxkaWFsb2c+CiAgICAgICAgICAgICAgICA8bWVudT4KICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICA8Y2VudGVyPgogICAgICAgICAgICAgICAgICAgICAgPHA+U2VhcmNoIGZvciBjb250ZW50IHRvIHVzZSBhcyByZWZlcmVuY2UuPC9wPgogICAgICAgICAgICAgICAgICAgIDwvY2VudGVyPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBhdXRvZm9jdXMgY2xhc3M9J2lucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBjb250ZW50IHR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkIGNsYXNzPSdpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBjb250ZW50IG5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1sZWZ0IHR5cGU9YnV0dG9uIHZhbHVlPUNsZWFyIC8+CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9cmlnaHQgdHlwZT1idXR0b24gdmFsdWU9RG9uZSAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvbWVudT4KICAgICAgICAgICAgICA8L2RpYWxvZz4KICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGJyPgogICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Q3JlYXRlIC8+CiAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgPGJyPgogICAgICAgIDwvZm9ybT4KICAgICAgPC9kZXRhaWxzPgoKICAgICAgPGRldGFpbHM+CiAgICAgICAgPHN1bW1hcnk+VXBkYXRlIHt7IC5Db250ZW50VHlwZS5OYW1lIH19IENvbnRlbnQgVHlwZTwvc3VtbWFyeT4KICAgICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9jb250ZW50dHlwZS91cGRhdGUnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgICA8YnI+CiAgICAgICAgICA8ZmllbGRzZXQ+CiAgICAgICAgICAgIDxsZWdlbmQ+Q29udGVudCB0eXBlIG5hbWU8L2xlZ2VuZD4KICAgICAgICAgICAgPGxhYmVsIGZvcj0ndXBkYXRlLW5hbWUnPk5hbWU8L2xhYmVsPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDxpbnB1dCBpZD0ndXBkYXRlLW5hbWUnIGF1dG9mb2N1cyByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT1uYW1lIHBsYWNlaG9sZGVyPSJuYW1lIiB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLk5hbWUgfX0iIC8+CiAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgPGJyPgogICAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgPGxlZ2VuZD5GaWVsZHM8L2xlZ2VuZD4KICAgICAgICAgIHt7IHJhbmdlICRpbmRleCwgJGl0ZW0gOj0gLkNvbnRlbnRUeXBlLkZpZWxkcyB9fQoKICAgICAgICAgICAge3sgaWYgZXEgJGluZGV4IDAgfX0KICAgICAgICAgICAgICA8ZGl2IGlkPSdmaXJzdC1maWVsZHNldCc+CiAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0iZmllbGRfdXBkYXRlX2lkX3t7IGluYyAkaW5kZXggfX0iIHZhbHVlPSJ7eyAuSUQgfX0iIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0iZmllbGRfdXBkYXRlX25hbWVfe3sgaW5jICRpbmRleCB9fSIgdmFsdWU9Int7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgPHNlbGVjdCB2YWx1ZT0ie3sgLlR5cGUgfX0iIHJlYWRvbmx5PSJyZWFkb25seSIgcmVxdWlyZWQgbmFtZT0iZmllbGRfdXBkYXRlX3R5cGVfe3sgaW5jICRpbmRleCB9fSI+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU+RmllbGQgVHlwZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkIHZhbHVlPSJTdHJpbmdTbWFsbCI+U3RyaW5nIFNtYWxsPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IlN0cmluZ0JpZyI+U3RyaW5nIEJpZzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJJbnB1dEhUTUwiPkhUTUw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iSW5wdXRNYXJrZG93biI+TWFya2Rvd248L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iRmlsZSI+RmlsZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJEYXRlIj5EYXRlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IlJlZmVyZW5jZSI+UmVmZXJlbmNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IlJlZmVyZW5jZUxpc3QiPlJlZmVyZW5jZUxpc3Q8L29wdGlvbj4KICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkIHR5cGU9YnV0dG9uIHZhbHVlPSdSZW1vdmUgRmllbGQnIC8+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9ImZpZWxkX3VwZGF0ZV9pZF97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLklEIH19IiAvPgogICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJmaWVsZF91cGRhdGVfbmFtZV97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICA8c2VsZWN0IHZhbHVlPSJ7eyAuVHlwZSB9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCBuYW1lPSJmaWVsZF91cGRhdGVfdHlwZV97eyBpbmMgJGluZGV4IH19Ij4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT5GaWVsZCBUeXBlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlN0cmluZ1NtYWxsIiB9fSAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJTdHJpbmdTbWFsbCI+U3RyaW5nIFNtYWxsPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlN0cmluZ0JpZyIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fSAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IklucHV0SFRNTCI+SFRNTDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fSBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iSW5wdXRNYXJrZG93biI+TWFya2Rvd248L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiRmlsZSIgfX0gICAgICAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiRGF0ZSIgfX0gICAgICAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IkRhdGUiPkRhdGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiUmVmZXJlbmNlIiB9fSAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IlJlZmVyZW5jZSI+UmVmZXJlbmNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19IHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT0nUmVtb3ZlIEZpZWxkJyAvPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgPGJyPgogICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICA8aW5wdXQgdHlwZT1idXR0b24gaWQ9J2FkZC1maWVsZGJ0bicgdmFsdWU9J0FkZCBBbm90aGVyIEZpZWxkJyAvPgogICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVVwZGF0ZSAvPgogICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgIDxicj4KICAgICAgICA8L2Zvcm0+CiAgICAgIDwvZGV0YWlscz4KCiAgICAgIDxkZXRhaWxzPgogICAgICAgIDxzdW1tYXJ5PkRlbGV0ZSB7eyAuQ29udGVudFR5cGUuTmFtZSB9fSBDb250ZW50IFR5cGU8L3N1bW1hcnk+CiAgICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvY29udGVudHR5cGUvZGVsZXRlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgICAgPGJyPgogICAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9RGVsZXRlIC8+CiAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgPGJyPgogICAgICAgIDwvZm9ybT4KICAgICAgPC9kZXRhaWxzPgoKICAgICAgPGgyPkJyb3dzZSB7eyAuQ29udGVudFR5cGUuTmFtZSB9fSBDb250ZW50PC9oMj4KICAgICAge3sgaWYgLkNvbnRlbnRMaXN0IH19CiAgICAgICAgPHVsPgogICAgICAgICAge3sgcmFuZ2UgLkNvbnRlbnRMaXN0IH19CiAgICAgICAgICAgIDxsaT4gCiAgICAgICAgICAgICAgPGEgaHJlZj0nL2NvbnRlbnQve3sgJC5TcGFjZS5JRCB9fS97eyAkLkNvbnRlbnRUeXBlLklEIH19L3t7IC5JRCB9fSc+CiAgICAgICAgICAgICAgICB7eyAoLk11c3RWYWx1ZUJ5TmFtZSAibmFtZSIpLlZhbHVlIH19CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAge3sgZW5kIH19CiAgICAgICAgPC91bD4KICAgICAge3sgZWxzZSB9fQogICAgICAgIDxwPk5vIGNvbnRlbnQgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIGEgY29udGVudCB0eXBlIG9mIHt7IC5Db250ZW50VHlwZS5OYW1lIH19PC9wPgogICAgICB7eyBlbmQgfX0KCiAgICA8L2FydGljbGU+CiAgICA8aHIvPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICA8c2NyaXB0IHNyYz0nLy91bnBrZy5jb20vdGlueW1jZUA1LjIuMC90aW55bWNlLm1pbi5qcyc+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Jy8vdW5wa2cuY29tL2F1dG9jb21wbGV0ZS5qc0AwLjM3LjEvZGlzdC9hdXRvY29tcGxldGUubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9zcGFjZS5qcyIgfX08L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9jb250ZW50LmpzIiAkIH19PC9zY3JpcHQ+CjwvYm9keT4KCjwvaHRtbD4K")
	tmpls["html/contenttype.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+Cgo8aGVhZD4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZC5odG1sIiB9fQogIDx0aXRsZT5DTVMgfCB7eyAuU3BhY2UuTmFtZSB9fSB8IHt7IC5Db250ZW50VHlwZS5OYW1lIH19PC90aXRsZT4KPC9oZWFkPgoKPGJvZHkgY2xhc3M9J2NvbnRlbnR0eXBlIGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+e3suQ29udGVudFR5cGUuTmFtZX19PC9oMT4KICAgIDwvZGl2PgogICAgPGFydGljbGU+CgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9jb250ZW50dHlwZS9kZWxldGUnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudHR5cGUgdmFsdWU9Int7IC5Db250ZW50VHlwZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZGVsZXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImRlbGV0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImRlbGV0ZU1vZGFsTGFiZWwiPkRlbGV0ZSB7ey5Db250ZW50VHlwZS5OYW1lfX08L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnQvbmV3JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImNyZWF0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJjcmVhdGVNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJjcmVhdGVNb2RhbExhYmVsIj5DcmVhdGUgYSBuZXcge3suQ29udGVudFR5cGUuTmFtZX19IGNvbnRlbnQ8L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAge3sgcmFuZ2UgLkNvbnRlbnRUeXBlLkZpZWxkcyB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwJz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPnt7dGl0bGUgLk5hbWV9fTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyB0aXRsZSAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtaHRtbCIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtbWFya2Rvd24iIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiRmlsZSIgfX0KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIG1iLTMiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cC1wcmVwZW5kIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5wdXQtZ3JvdXAtdGV4dCIgaWQ9ImlucHV0R3JvdXBGaWxlQWRkb24wMSI+VXBsb2FkPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLWZpbGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBhcmlhLWRlc2NyaWJlZGJ5PSJpbnB1dEdyb3VwRmlsZUFkZG9uMDEiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9ZmlsZSBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgbXVsdGlwbGU9ZmFsc2UgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImN1c3RvbS1maWxlLWxhYmVsIiBmb3I9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSI+Q2hvb3NlIGZpbGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJEYXRlIiB9fQogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9ZGF0ZSBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2UiIH19CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIiB0eXBlPWJ1dHRvbiB2YWx1ZT1PcGVuIC8+CiAgICAgICAgICAgICAgICAgICAgICA8ZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICA8bWVudT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2VhcmNoIGZvciBjb250ZW50IHRvIHVzZSBhcyByZWZlcmVuY2UuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWN0Jz5Db250ZW50IHR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSdzZWFyY2gtY3QnIGF1dG9mb2N1cyBjbGFzcz0naW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IGNvbnRlbnQgdHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9J3NlYXJjaC1jJz5Db250ZW50IG5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSdzZWFyY2gtYycgZGlzYWJsZWQgY2xhc3M9J2lucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IGNvbnRlbnQgbmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW51PgogICAgICAgICAgICAgICAgICAgICAgPC9kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIiB0eXBlPWJ1dHRvbiB2YWx1ZT1PcGVuIC8+CiAgICAgICAgICAgICAgICAgICAgICA8ZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICA8bWVudT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNlbnRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2VhcmNoIGZvciBjb250ZW50IHRvIHVzZSBhcyByZWZlcmVuY2UuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jZW50ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgYXV0b2ZvY3VzIGNsYXNzPSdpbnB1dC1jb250ZW50dHlwZScgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgY29udGVudCB0eXBlJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkIGNsYXNzPSdpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBjb250ZW50IG5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9bGVmdCB0eXBlPWJ1dHRvbiB2YWx1ZT1DbGVhciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9cmlnaHQgdHlwZT1idXR0b24gdmFsdWU9RG9uZSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVudT4KICAgICAgICAgICAgICAgICAgICAgIDwvZGlhbG9nPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnR0eXBlL3VwZGF0ZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJ1cGRhdGVNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iVXBkYXRlIHt7LkNvbnRlbnRUeXBlLk5hbWV9fSIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0iY29udGVudHR5cGVNb2RhbExhYmVsIj5VcGRhdGUge3suQ29udGVudFR5cGUuTmFtZX19PC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNvbnRlbnR0eXBlTmFtZSI+TmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdmFsdWU9Int7LkNvbnRlbnRUeXBlLk5hbWV9fSIgbmFtZT1uYW1lIHR5cGU9dGV4dCBpZD0iY29udGVudHR5cGVOYW1lIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJOYW1lIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9J2ZpcnN0LWZpZWxkc2V0JyBjbGFzcz0nY29udGFpbmVyLWZsdWlkIHB4LTAnPgogICAgICAgICAgICAgICAgICB7eyByYW5nZSAkaW5kZXgsICRpdGVtIDo9IC5Db250ZW50VHlwZS5GaWVsZHMgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAkaW5kZXggMCB9fQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nZmlyc3QtZmllbGRzZXQnPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmaWVsZHNldEZpcnN0Ij5GaWVsZHM8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0iZmllbGRfdXBkYXRlX2lkX3t7IGluYyAkaW5kZXggfX0iIHZhbHVlPSJ7eyAuSUQgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlYWRvbmx5PSJyZWFkb25seSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9ImZpZWxkX3VwZGF0ZV9uYW1lX3t7IGluYyAkaW5kZXggfX0iIHZhbHVlPSJ7eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZm9ybS1ncm91cCByb3cnPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC02Jz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InctMTAwIGZvcm0tY29udHJvbCIgdmFsdWU9Int7IC5UeXBlIH19IiByZWFkb25seT0icmVhZG9ubHkiIHJlcXVpcmVkIG5hbWU9ImZpZWxkX3VwZGF0ZV90eXBlX3t7IGluYyAkaW5kZXggfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPkZpZWxkIFR5cGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCB2YWx1ZT0iU3RyaW5nU21hbGwiPlN0cmluZyBTbWFsbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iSW5wdXRIVE1MIj5IVE1MPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IklucHV0TWFya2Rvd24iPk1hcmtkb3duPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iRGF0ZSI+RGF0ZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJSZWZlcmVuY2UiPlJlZmVyZW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J3ctMTAwIGJ0biBidG4tcHJpbWFyeScgZGlzYWJsZWQgdHlwZT1idXR0b24gdmFsdWU9J1JlbW92ZSBGaWVsZCcgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0iZmllbGRfdXBkYXRlX2lkX3t7IGluYyAkaW5kZXggfX0iIHZhbHVlPSJ7eyAuSUQgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJmaWVsZF91cGRhdGVfbmFtZV97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgcm93Jz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJ3LTEwMCBmb3JtLWNvbnRyb2wiIHZhbHVlPSJ7eyAuVHlwZSB9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCBuYW1lPSJmaWVsZF91cGRhdGVfdHlwZV97eyBpbmMgJGluZGV4IH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT5GaWVsZCBUeXBlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlN0cmluZ1NtYWxsIiB9fSAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJTdHJpbmdTbWFsbCI+U3RyaW5nIFNtYWxsPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlN0cmluZ0JpZyIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fSAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IklucHV0SFRNTCI+SFRNTDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fSBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iSW5wdXRNYXJrZG93biI+TWFya2Rvd248L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiRmlsZSIgfX0gICAgICAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiRGF0ZSIgfX0gICAgICAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IkRhdGUiPkRhdGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiUmVmZXJlbmNlIiB9fSAgICAgc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IlJlZmVyZW5jZSI+UmVmZXJlbmNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19IHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J3ctMTAwIGJ0biBidG4tcHJpbWFyeSBidG4tcmVtb3ZlJyB0eXBlPWJ1dHRvbiB2YWx1ZT0nUmVtb3ZlIEZpZWxkJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxhIGhyZWY9JyMnIGNsYXNzPSdidG4gYnRuLWxpbmsnIGlkPSdhZGQtZmllbGRidG4nPkFkZCBBbm90aGVyIEZpZWxkPC9hPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICAgIDxkaXYgY2xhc3M9J29mZnNldC1sZy0zIGNvbC1sZy02Jz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtcmlnaHQgZmxvYXQtcmlnaHQiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjcmVhdGVNb2RhbCI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPkNyZWF0ZSBhIG5ldyBjb250ZW50PC9hPgogICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgIDxoNiBjbGFzcz0iYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSBwYi0yIG1iLTAiPllvdXIge3suQ29udGVudFR5cGUuTmFtZX19IGNvbnRlbnQ8L2g2PgogICAgICAgICAgICAgIHt7IGlmIC5Db250ZW50TGlzdCB9fQogICAgICAgICAgICAgICAge3sgcmFuZ2UgLkNvbnRlbnRMaXN0IH19CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWRpYSB0ZXh0LW11dGVkIHB0LTMiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPScvY29udGVudC97eyAkLlNwYWNlLklEIH19L3t7ICQuQ29udGVudFR5cGUuSUQgfX0ve3sgLklEIH19JyAgY2xhc3M9Im1lZGlhLWJvZHkgcGItMyBtYi0wIHNtYWxsIGxoLTEyNSBib3JkZXItYm90dG9tIGJvcmRlci1ncmF5Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj4KICAgICAgICAgICAgICAgICAgICAgIHt7ICguTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX0KICAgICAgICAgICAgICAgICAgICA8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0iZC1ibG9jayB0ZXh0LXJpZ2h0IG10LTMiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj5Mb2FkIG1vcmU8L2E+CiAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTMgYWxlcnQgYWxlcnQtcHJpbWFyeSIgcm9sZT0iYWxlcnQiPgogICAgICAgICAgICAgICAgICBZb3UgaGF2ZW4ndCBjcmVhdGVkIGFueSBjb250ZW50IHlldC4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2FydGljbGU+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiIH19CiAgPC9tYWluPgogIHt7IHRlbXBsYXRlICJodG1sL19zY3JpcHRzLmh0bWwiIH19CiAgPHNjcmlwdCBzcmM9Jy8vdW5wa2cuY29tL3RpbnltY2VANS4yLjAvdGlueW1jZS5taW4uanMnPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPScvL3VucGtnLmNvbS9hdXRvY29tcGxldGUuanNAMC4zNy4xL2Rpc3QvYXV0b2NvbXBsZXRlLm1pbi5qcyc+PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvc3BhY2UuanMiIH19PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvY29udGVudC5qcyIgJCB9fTwvc2NyaXB0Pgo8L2JvZHk+Cgo8L2h0bWw+Cg==")

	tmpls["html/hook.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+Cgo8aGVhZD4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZC5odG1sIiB9fQogIDx0aXRsZT5DTVMgfCB7eyAuU3BhY2UuTmFtZSB9fSB8IHt7IC5Ib29rLlVSTCB9fTwvdGl0bGU+CjwvaGVhZD4KCjxib2R5IGNsYXNzPWluZGV4IHN0eWxlPSdtYXgtd2lkdGg6IDYwMHB4Oyc+CiAgPHN0eWxlPnt7IHRlbXBsYXRlICJjc3MvbWFpbi5jc3MiIH19PC9zdHlsZT4KICA8bWFpbj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19oZWFkZXIuaHRtbCIgJCB9fQogICAgPGhyLz4KICAgIDxhcnRpY2xlPgogICAgICA8aDE+e3sgLlNwYWNlLk5hbWUgfX0sIHt7IC5Ib29rLlVSTCB9fTwvaDE+CiAgICAgIDxkZXRhaWxzPgogICAgICAgIDxzdW1tYXJ5PkRlbGV0ZSBXZWJob29rPC9zdW1tYXJ5PgogICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2hvb2svZGVsZXRlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1ob29rIHZhbHVlPSJ7eyAuSG9vay5JRCB9fSIgLz4KICAgICAgICAgIDxicj4KICAgICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPURlbGV0ZSAvPgogICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgIDxicj4KICAgICAgICA8L2Zvcm0+CiAgICAgIDwvZGV0YWlscz4KICAgIDwvYXJ0aWNsZT4KICAgIDxoci8+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiIH19CiAgPC9tYWluPgogIDxzY3JpcHQgc3JjPScvL3VucGtnLmNvbS90aW55bWNlQDUuMi4wL3RpbnltY2UubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0nLy91bnBrZy5jb20vYXV0b2NvbXBsZXRlLmpzQDAuMzcuMS9kaXN0L2F1dG9jb21wbGV0ZS5taW4uanMnPjwvc2NyaXB0PgogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL2NvbnRlbnQuanMiICQgfX08L3NjcmlwdD4KPC9ib2R5PgoKPC9odG1sPgo=")



@@ 38,7 38,7 @@ func init() {

	tmpls["js/content.js"] = tostring("Ly8gU2V0dXAgaW5wdXRzIGZvciBjb250ZW50IGNyZWF0ZS91cGRhdGUuCihmdW5jdGlvbigpIHsgCgogIC8vIEhUTUwKICB0aW55bWNlLmluaXQoeyAKICAgIHNlbGVjdG9yOiAndGV4dGFyZWEuaW5wdXQtaHRtbCcsCiAgICBwbHVnaW5zOiAiY29kZSIsCiAgICBmb3JjZWRfcm9vdF9ibG9jayA6ICIiLCAvKiBObyB3cmFwcGluZyBwYXJhZ3JhcGggdGFnLiAqLwogICAgLy8gc3RhdHVzYmFyOiBmYWxzZSwKICAgIHNldHVwOiBmdW5jdGlvbihpdGVtKSB7IAogICAgICBpdGVtLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgCiAgICAgICAgaXRlbS50YXJnZXRFbG0udmFsdWUgPSBpdGVtLmdldENvbnRlbnQoKQogICAgICB9KQogICAgfQogIH0pCgogIC8vIE1BUktET1dOCiAgdGlueW1jZS5pbml0KHsKICAgIHNlbGVjdG9yOiAidGV4dGFyZWEuaW5wdXQtbWFya2Rvd24iLAogICAgcGx1Z2luOiAndGV4dHBhdHRlcm4nLAogICAgZXh0ZXJuYWxfcGx1Z2luczogeyAKICAgICAgdGV4dHBhdHRlcm46ICcvL3VucGtnLmNvbS90aW55bWNlQDUuMi4wL3BsdWdpbnMvdGV4dHBhdHRlcm4vcGx1Z2luLm1pbi5qcycKICAgIH0sCiAgICBtZW51YmFyOiBmYWxzZSwKICAgIHRvb2xiYXI6ICd1bmRvIHJlZG8nLAogICAgLy8gc3RhdHVzYmFyOiBmYWxzZSwKICAgIHRleHRwYXR0ZXJuX3BhdHRlcm5zOiBbCiAgICAgIHtzdGFydDogJyonLCBlbmQ6ICcqJywgZm9ybWF0OiAnaXRhbGljJ30sCiAgICAgIHtzdGFydDogJyoqJywgZW5kOiAnKionLCBmb3JtYXQ6ICdib2xkJ30sCiAgICAgIHtzdGFydDogJ18nLCBlbmQ6ICdfJywgZm9ybWF0OiAnYm9sZCd9LAogICAgICB7c3RhcnQ6ICcjJywgZm9ybWF0OiAnaDEnfSwKICAgICAge3N0YXJ0OiAnIyMnLCBmb3JtYXQ6ICdoMid9LAogICAgICB7c3RhcnQ6ICcjIyMnLCBmb3JtYXQ6ICdoMyd9LAogICAgICB7c3RhcnQ6ICcjIyMjJywgZm9ybWF0OiAnaDQnfSwKICAgICAge3N0YXJ0OiAnIyMjIyMnLCBmb3JtYXQ6ICdoNSd9LAogICAgICB7c3RhcnQ6ICcjIyMjIyMnLCBmb3JtYXQ6ICdoNid9LAogICAgICB7c3RhcnQ6ICcxLiAnLCBjbWQ6ICdJbnNlcnRPcmRlcmVkTGlzdCd9LAogICAgICB7c3RhcnQ6ICcqICcsIGNtZDogJ0luc2VydFVub3JkZXJlZExpc3QnfSwKICAgICAge3N0YXJ0OiAnLSAnLCBjbWQ6ICdJbnNlcnRVbm9yZGVyZWRMaXN0J30KICAgIF0sCiAgICBzZXR1cDogZnVuY3Rpb24oaXRlbSkgeyAKICAgICAgaXRlbS5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7IAogICAgICAgIGl0ZW0udGFyZ2V0RWxtLnZhbHVlID0gaXRlbS5nZXRDb250ZW50KCkKICAgICAgfSkKICAgIH0KICB9KTsKCiAgLy8gUkVGRVJFTkNFCiAgdmFyIHJlZnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJmb3JtIGRpYWxvZyIpCiAgdmFyIG1lbnVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiZm9ybSBkaWFsb2cgbWVudSIpCiAgdmFyIHJlZmJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaW5wdXQtcmVmIikKICB2YXIgdG9idG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLm91dHB1dC1yZWYiKQogIGZvciAoaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7IAogICAgKGZ1bmN0aW9uKGJ0biwgbWVudSwgZGlhbG9nLCBvdXRwdXQpIHsgCiAgICAgIHZhciBpc0xpc3QgPSBvdXRwdXQuZ2V0QXR0cmlidXRlKCJuYW1lIikuaW5kZXhPZigiUmVmZXJlbmNlTGlzdCIpICE9IC0xCiAgICAgIHZhciBjbGVhckJ0biA9IGRpYWxvZy5xdWVyeVNlbGVjdG9yKCIubGVmdCIpCiAgICAgIHZhciBkb25lQnRuID0gZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoIi5yaWdodCIpCgogICAgICB2YXIgY2hvc2VuQ29udGVudFR5cGVJRCAvLyB1c2VkIGJ5IGJvdGgKICAgICAgdmFyIGNob3NlbkNvbnRlbnRJRHMgPSBbXSAvLyBvbmx5IHVzZWQgYmUgcmVmbGlzdAogICAgICB2YXIgY2hvc2VuQ29udGVudE5hbWVzID0gW10gLy8gb25seSB1c2VkIGJlIHJlZmxpc3QKCiAgICAgIC8vIE9QRU4KICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgeyAKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgZGlhbG9nLnNob3dNb2RhbCgpCiAgICAgIH0pCgogICAgICAvLyBDTE9TRQogICAgICBkaWFsb2cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7IAogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBpZiAoaXNMaXN0KSB7IAogICAgICAgICAgLy8gRG9uJ3QgbGV0IHJlZmxpc3QgaW5wdXQgY2xvc2UgYnkgb2ZmIGNsaWNrLCB1c2VyIG11c3QgY2hvb3NlIHRvCiAgICAgICAgICAvLyBjbGVhciBpbnB1dCB0byBjbG9zZSwgb3IgYmUgZG9uZSB0byBjbG9zZS4KICAgICAgICAgIHJldHVybiAKICAgICAgICB9CiAgICAgICAgZGlhbG9nLmNsb3NlKCkKICAgICAgfSkKCiAgICAgIC8vIFNUT1AKICAgICAgbWVudS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsgCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICB9KQoKICAgICAgaWYgKGlzTGlzdCkgewogICAgICAgIC8vIENMRUFSCiAgICAgICAgY2xlYXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGVhckJ0bkhhbmRsZSkKICAgICAgICBmdW5jdGlvbiBjbGVhckJ0bkhhbmRsZShlKSB7IAogICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgICBvdXRwdXQudmFsdWUgPSAnJwogICAgICAgICAgYnRuLnZhbHVlID0gJ09wZW4nCiAgICAgICAgICBjaG9zZW5Db250ZW50SURzID0gW10KICAgICAgICAgIGNob3NlbkNvbnRlbnROYW1lcyA9IFtdCiAgICAgICAgICBkaWFsb2cuY2xvc2UoKQogICAgICAgIH0KCiAgICAgICAgLy8gRE9ORQogICAgICAgIGRvbmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7IAogICAgICAgICAgaWYgKGNob3NlbkNvbnRlbnRJRHMubGVuZ3RoIDwgMSkgewogICAgICAgICAgICByZXR1cm4gY2xlYXJCdG5IYW5kbGUoZSkKICAgICAgICAgIH0KICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgICAgb3V0cHV0LnZhbHVlID0gY2hvc2VuQ29udGVudElEcy5qb2luKCctJykKICAgICAgICAgIGJ0bi52YWx1ZSA9IGNob3NlbkNvbnRlbnROYW1lcy5qb2luKCcsICcpCiAgICAgICAgICBjaG9zZW5Db250ZW50SURzID0gW10KICAgICAgICAgIGNob3NlbkNvbnRlbnROYW1lcyA9IFtdCiAgICAgICAgICBkaWFsb2cuY2xvc2UoKQogICAgICAgIH0pCiAgICAgIH0KCiAgICAgIC8vIElOUFVUUyBFVkVOVFMgQU5EIFJFU1VMVFMKICAgICAgdmFyIGlucHV0cyA9IGRpYWxvZy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpCiAgICAgIHZhciBjb250ZW50dHlwZSA9IGlucHV0c1swXQogICAgICB2YXIgY29udGVudCA9IGlucHV0c1sxXQoKICAgICAgdmFyIG9wdHMgPSB7CiAgICAgICAgYXV0b3NlbGVjdDogdHJ1ZSwKICAgICAgICBhdXRvc2VsZWN0T25CbHVyOiB0cnVlLCAKICAgICAgICB0YWJBdXRvY29tcGxldGU6IHRydWUsCiAgICAgICAgLy8gY2xlYXJPblNlbGVjdGVkOiB0cnVlLAogICAgICAgIGhpbnQ6IGZhbHNlCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGdldG9wdHModXJsLCB0cmFuc2Zvcm0sIGRpc3BsYXlLZXkpIHsgCiAgICAgICAgdmFyIGNvbnRlbnR0eXBlQWJvcnQgPSBmdW5jdGlvbigpIHt9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGRpc3BsYXlLZXk6IGRpc3BsYXlLZXksCiAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uKHF1ZXJ5LCBjYikgeyAKICAgICAgICAgICAgY2IoW10pCiAgICAgICAgICAgIGNvbnRlbnR0eXBlQWJvcnQoKQogICAgICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCkKICAgICAgICAgICAgY29udGVudHR5cGVBYm9ydCA9IGZ1bmN0aW9uKCkgeyByZXEuYWJvcnQoKSB9IAogICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPSA0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyAhPSAyMDApIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlVGV4dCAhPSAiIikgewogICAgICAgICAgICAgICAgICBhbGVydCh0aGlzLnJlc3BvbnNlVGV4dCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNiKFtdKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB0cnkgeyAKICAgICAgICAgICAgICAgIGNiKHRyYW5zZm9ybShKU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KSkpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNhdGNoKGUpIHsgCiAgICAgICAgICAgICAgICB2YXIgbXNnID0gZS50b1N0cmluZygpCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh7ZSxtc2d9KQogICAgICAgICAgICAgICAgaWYgKG1zZyAhPSAiIikgeyAvLyBDYW5jZWxsZWQgcmVxdWVzdHMgaGl0IHRoaXMuCiAgICAgICAgICAgICAgICAgIGFsZXJ0KG1zZykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybCgpICsgcXVlcnksIHRydWUpCiAgICAgICAgICAgIHJlcS5zZW5kKCkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb250ZW50dHlwZU9wdHMgPSBnZXRvcHRzKAogICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gJy9jb250ZW50dHlwZS9zZWFyY2g/c3BhY2U9e3sgLlNwYWNlLklEIH19JnF1ZXJ5PSc7IH0sIAogICAgICAgIGZ1bmN0aW9uKGRhdGEpIHsgcmV0dXJuIGRhdGEgfSwKICAgICAgICAnQ29udGVudFR5cGVOYW1lJwogICAgICApCgogICAgICB3aW5kb3cuYXV0b2NvbXBsZXRlKGNvbnRlbnR0eXBlLCBvcHRzLCBbY29udGVudHR5cGVPcHRzXSkub24oJ2F1dG9jb21wbGV0ZTpzZWxlY3RlZCcsIG9uQ29udGVudFR5cGVTZWxlY3RlZCkKICAgICAgZnVuY3Rpb24gb25Db250ZW50VHlwZVNlbGVjdGVkKGUsIGl0ZW0sIGRhdGFzZXQsIGN0eCkgewogICAgICAgIGNob3NlbkNvbnRlbnRUeXBlSUQgPSBpdGVtLkNvbnRlbnRUeXBlSUQKICAgICAgICBjb250ZW50LmRpc2FibGVkID0gZmFsc2UKICAgICAgfQoKICAgICAgdmFyIGNvbnRlbnRPcHRzID0gZ2V0b3B0cygKICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuICcvY29udGVudC9zZWFyY2g/c3BhY2U9e3sgLlNwYWNlLklEIH19JmNvbnRlbnR0eXBlPScgKyBjaG9zZW5Db250ZW50VHlwZUlEICsgJyZxdWVyeT0nOyB9LCAKICAgICAgICBmdW5jdGlvbihkYXRhKSB7IAogICAgICAgICAgLy8gQmlnIGhhY2suCiAgICAgICAgICBkYXRhID0gZGF0YSA/IGRhdGEgOiBbXQogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsgLy8gVGhpcyByZXNwb25zZSBpcyBwYWdlZCwgZG9uJ3Qgd29ycnkgYWJvdXQgT14yLiBNYXggb2YgMjAgaXRlbXMuCiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkYXRhW2ldLkNvbnRlbnRWYWx1ZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICBpZiAoZGF0YVtpXS5Db250ZW50VmFsdWVzW2pdLkZpZWxkTmFtZSA9PSAibmFtZSIpIHsgLy8gV2UncmUgZ3VhcmFudGVlZCB0byBoYXZlIHRoaXMuCiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGFbaV0sIGRhdGFbaV0uQ29udGVudFZhbHVlc1tqXSkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkYXRhCiAgICAgICAgfSwKICAgICAgICAnRmllbGRWYWx1ZScKICAgICAgKQoKICAgICAgLy8gVE9ETzogV2VpcmQgYmVoYXZpb3IgaGVyZSwgd2h5IGRvIEkgaGF2ZSB0byBpbmxpbmUgdGhpcyBjbGVhciBvbgogICAgICAvLyBzZWxlY3RlZD8gV2h5IGNhbid0IGl0IGV4aXN0cyBpbiBjb250ZW50T3B0cz8KICAgICAgd2luZG93LmF1dG9jb21wbGV0ZShjb250ZW50LCBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7Y2xlYXJPblNlbGVjdGVkOnRydWV9KSwgW2NvbnRlbnRPcHRzXSkub24oJ2F1dG9jb21wbGV0ZTpzZWxlY3RlZCcsIG9uQ29udGVudFNlbGVjdGVkKQogICAgICBmdW5jdGlvbiBvbkNvbnRlbnRTZWxlY3RlZChlLCBpdGVtLCBkYXRhc2V0LCBjdHgpIHsKICAgICAgICBpZiAoaXNMaXN0KSB7CiAgICAgICAgICBjaG9zZW5Db250ZW50SURzLnB1c2goaXRlbS5Db250ZW50SUQpCiAgICAgICAgICBjaG9zZW5Db250ZW50TmFtZXMucHVzaChpdGVtLkZpZWxkVmFsdWUpCiAgICAgICAgICBidG4udmFsdWUgPSBjaG9zZW5Db250ZW50TmFtZXMuam9pbignLCAnKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIG91dHB1dC52YWx1ZSA9IGl0ZW0uQ29udGVudElECiAgICAgICAgICBidG4udmFsdWUgPSBpdGVtLkZpZWxkVmFsdWUKICAgICAgICAgIGRpYWxvZy5jbG9zZSgpCiAgICAgICAgfQogICAgICB9CgogICAgfSkocmVmYnRuc1tpXSwgbWVudXNbaV0sIHJlZnNbaV0sIHRvYnRuc1tpXSkKICB9Cgp9KSgpOwo=")

	tmpls["js/space.js"] = tostring("Ly8gQWRkIG1vcmUgZmllbGRzIHRvIHNwYWNlIGNyZWF0ZS4KKGZ1bmN0aW9uKCkgeyAKICB2YXIgYWRkRmllbGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLWZpZWxkYnRuJykKICB2YXIgaSA9IDEKICBhZGRGaWVsZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsgCiAgICBpKysKICAgIGUucHJldmVudERlZmF1bHQoKQogICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKICAgIGVsLmlubmVySFRNTCA9IGAKICAgICAgPGRpdiBjbGFzcz0nY29udGFpbmVyLWZsdWlkIHB4LTAnPgogICAgICAgIDxpbnB1dCBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJmaWVsZF9uYW1lXyR7aX0iIHZhbHVlPSJuYW1lIiAvPgogICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgcm93Jz4KICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC02Jz4KICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0idy0xMDAgZm9ybS1jb250cm9sIiByZXF1aXJlZCBuYW1lPSJmaWVsZF90eXBlXyR7aX0iPgogICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU+RmllbGQgVHlwZTwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9IlN0cmluZ1NtYWxsIj5TdHJpbmcgU21hbGw8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJbnB1dEhUTUwiPkhUTUw8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJbnB1dE1hcmtkb3duIj5NYXJrZG93bjwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJEYXRlIj5EYXRlPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iUmVmZXJlbmNlIj5SZWZlcmVuY2U8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgIDxpbnB1dCBpZD0ncmVtb3ZlLWZpZWxkYnRuXyR7aX0nIGNsYXNzPSd3LTEwMCBidG4gYnRuLXByaW1hcnknIHR5cGU9YnV0dG9uIHZhbHVlPSdSZW1vdmUgRmllbGQnIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgCiAgICBhZGRGaWVsZEJ0bi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbCwgYWRkRmllbGRCdG4pCiAgICB2YXIgcmVtb3ZlRmllbGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmVtb3ZlLWZpZWxkYnRuXyR7aX1gKQogICAgcmVtb3ZlRmllbGRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7IAogICAgICBpLS0KICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCkKICAgIH0pCiAgfSkKfSkoKTsKCi8vIEZvciB1cGRhdGU6IHJlbW92ZSBvbGQgZmllbGRzCihmdW5jdGlvbigpIHsgCiAgLy8gdmFyIGJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJmb3JtIGRpdiBpbnB1dFt0eXBlPWJ1dHRvbl0iKTsKICAvLyBmb3IgKHZhciBlID0gMDsgZSA8IGJ0bnMubGVuZ3RoOyBlKyspIHsKICAvLyAgIChmdW5jdGlvbihidG4pIHsKICAvLyAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gaGFuZGVsQ2xpY2soKSB7IAogIC8vICAgICAgIGJ0bi5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYnRuLnBhcmVudEVsZW1lbnQpOwogIC8vICAgICB9KTsKICAvLyAgIH0pKGJ0bnNbZV0pOwogIC8vIH0KfSkoKTsK")
	tmpls["js/space.js"] = tostring("Ly8gQWRkIG1vcmUgZmllbGRzIHRvIHNwYWNlIGNyZWF0ZS4KKGZ1bmN0aW9uKCkgeyAKICB2YXIgYWRkRmllbGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLWZpZWxkYnRuJykKICB2YXIgaSA9IDEKICBhZGRGaWVsZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsgCiAgICBpKysKICAgIGUucHJldmVudERlZmF1bHQoKQogICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKICAgIGVsLmlubmVySFRNTCA9IGAKICAgICAgPGRpdiBjbGFzcz0nY29udGFpbmVyLWZsdWlkIHB4LTAnPgogICAgICAgIDxpbnB1dCBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJmaWVsZF9uYW1lXyR7aX0iIHZhbHVlPSJuYW1lIiAvPgogICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgcm93Jz4KICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC02Jz4KICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0idy0xMDAgZm9ybS1jb250cm9sIiByZXF1aXJlZCBuYW1lPSJmaWVsZF90eXBlXyR7aX0iPgogICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU+RmllbGQgVHlwZTwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9IlN0cmluZ1NtYWxsIj5TdHJpbmcgU21hbGw8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJbnB1dEhUTUwiPkhUTUw8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJbnB1dE1hcmtkb3duIj5NYXJrZG93bjwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJEYXRlIj5EYXRlPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iUmVmZXJlbmNlIj5SZWZlcmVuY2U8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgIDxpbnB1dCBpZD0ncmVtb3ZlLWZpZWxkYnRuXyR7aX0nIGNsYXNzPSd3LTEwMCBidG4gYnRuLXByaW1hcnknIHR5cGU9YnV0dG9uIHZhbHVlPSdSZW1vdmUgRmllbGQnIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgCiAgICBhZGRGaWVsZEJ0bi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbCwgYWRkRmllbGRCdG4pCiAgICB2YXIgcmVtb3ZlRmllbGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmVtb3ZlLWZpZWxkYnRuXyR7aX1gKQogICAgcmVtb3ZlRmllbGRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7IAogICAgICBpLS0KICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCkKICAgIH0pCiAgfSkKfSkoKTsKCi8vIEZvciB1cGRhdGU6IHJlbW92ZSBvbGQgZmllbGRzCihmdW5jdGlvbigpIHsgCiAgdmFyIGJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYnRuLXJlbW92ZSIpOwogIGZvciAodmFyIGUgPSAwOyBlIDwgYnRucy5sZW5ndGg7IGUrKykgewogICAgKGZ1bmN0aW9uKGJ0bikgewogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBoYW5kZWxDbGljaygpIHsgCiAgICAgICAgYnRuID0gYnRuLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudAogICAgICAgIGJ0bi5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYnRuLnBhcmVudEVsZW1lbnQpOwogICAgICB9KTsKICAgIH0pKGJ0bnNbZV0pOwogIH0KfSkoKTsK")

}