Files
hyperframes/docs/public/catalog/components/ink-bleed-reveal.json
Miguel Ángel 406bf316a3 fix(catalog): make component previews answer their variables panel (#3323)
* fix(catalog): make component previews answer their variables panel

Every control on a component's catalog page did nothing. Asking
caption-camera-follow for a violet accent rendered gold, and so did green
and blue, on 166 of the 168 components that declare variables.

A component ships a snippet, which is what the page hands you to paste and
which carries the declaration plus the script that turns a chosen value
into a CSS custom property, and a demo.html which stages and animates it.
The preview is built from the demo, and the demo was authored as a copy of
the snippet rather than a reference to it. The copies drifted until almost
none of them carried the declaration or the reader, so the payload for that
page never contained the word violet at all.

Components come in two shapes, so the repair does too.

123 ship a snippet that registers its own paused timeline. That snippet is
a whole piece, so their preview is now built from it and carries markup,
variables and motion together.

45 are markup plus a commented recipe, where the demo owns the motion.
Those demos now carry the snippet's declaration, reader and var-driven CSS
in the registry itself, written by scripts/catalog/sync-demo-variables.ts.
Nothing is patched in at build time.

A test runs that tool in dry mode and fails when a demo has drifted again,
naming the command that repairs it. It also asserts it inspected more than
a hundred components, because a check that silently matches nothing is how
this rotted in the first place.

Measured by rendering every payload in a real player rather than by reading
markup: payloads declaring their variables go from 2 of 168 to 168 of 168,
previews that animate go from 166 to 167, and nothing that moved stopped
moving. ascii-render-pass and star-rating-fill render a still frame when
built from their snippet, so they keep the demo path as a recorded
exception and stay in the state they were already in.

* refactor(catalog): give the preview pipeline one lookup and one entrypoint guard

Follow-up on the same branch, no behaviour change: 42 tests still pass and
`sync-demo-variables --check` still reports all 168 components clean.

The payload generator and the demo sync had each grown their own copy of
"given a component directory, find the snippet and the demo". Both now call
`componentFiles`, which is the same duplication-by-copying that broke the
previews in the first place.

Both catalog generators also carried a byte-identical 12-line guard for
"only run main() when this file is the entrypoint". That clone was already
in the tree, but nothing had touched both files at once before, so it had
never surfaced. It is now `runAsCommand`, and the sync script's variant of
the same condition is `isEntrypoint`.

The rest is flattening: the layering guards read as a table of conditions
instead of a chain, the reporting splits by what it reports, and the entry
resolution comes out of `buildPayload` rather than being spliced into it.

Also runs the formatter over the demos this branch rewrote. Whitespace only,
and `notes-typing` is the only component demo that renders pre-formatted
text, which this does not touch.
2026-08-18 01:37:46 -04:00

1 line
27 KiB
JSON

{"html":"<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=1920, height=1080\" />\n <script src=\"https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js\"></script>\n <style>* { margin: 0; padding: 0; } html, body { width: 1920px; height: 1080px; overflow: hidden; background: #0a0a0a; }\n [data-composition-src] { inset: 0; display: grid; place-items: center stretch; box-sizing: border-box; padding: 98px; }</style>\n</head>\n<body>\n <div data-composition-id=\"preview-root\" data-width=\"1920\" data-height=\"1080\" data-start=\"0\" data-duration=\"5\" data-hf-theme=\"dark\">\n <div data-composition-id=\"ink-bleed-reveal\" data-composition-src=\"data:text/html;base64,PCFkb2N0eXBlIGh0bWw+CjwhLS0KICBpbmstYmxlZWQtcmV2ZWFsOiBIeXBlckZyYW1lcyB2aWRlbyBwcmltaXRpdmUgKHRleHR1cmUgLyByZXZlYWxzKS4gV2F2ZSBNNy4KCiAgTGlxdWlkIGluayBibG9vbXMgdGhyb3VnaCBwYXBlciB0byByZXZlYWwgYSBtYXJrLiBTZXZlcmFsIGluayBibG9icyBibGVlZAogIG91dHdhcmQgZnJvbSB0aGUgY2VudGVyIGFuZCBtZXJnZSBsaWtlIGxpcXVpZCB1bmRlciB0aGUgZ29vZXkgY2hhaW4KICAoR2F1c3NpYW4gYmx1ciArIGEgaGFyZCBhbHBoYSB0aHJlc2hvbGQ6IHRoZSBibHVyIHNvZnRlbnMgdGhlIHNpbGhvdWV0dGVzCiAgdG9nZXRoZXIsIHRoZSB0aHJlc2hvbGQgc25hcHMgdGhlIG1lcmdlZCBhbHBoYSBiYWNrIHRvIGEgY3Jpc3AgbGlxdWlkCiAgZWRnZSksIHRoZW4gdGhlIHB1ZGRsZSBjb250cmFjdHMgYW5kIGRpZXMgYXMgdGhlIGNyaXNwIG1hcmsgcmVzb2x2ZXMKICBiZW5lYXRoIGl0LiBUaGUgY2hhaW4gaXMgdGhlIGNsYXNzaWMgU1ZHIGZlR2F1c3NpYW5CbHVyICsgZmVDb2xvck1hdHJpeAogIHJlY2lwZSwgYnV0IGNvbXB1dGVkIGluIGEgY2FudmFzIHdvcmsgYnVmZmVyIGVhY2ggcmVwYWludDogQ2hyb21lJ3MgbGl2ZQogIGZpbHRlciByYXN0ZXIgcGF0Y2hlcyBkYW1hZ2VkIHRpbGVzIHdpdGggc2Vlay1oaXN0b3J5LWRlcGVuZGVudCBzZWFtCiAgYW50aWFsaWFzaW5nLCB3aGlsZSBhIGNsZWFyZWQsIGZ1bGx5IHJlZHJhd24gY2FudmFzIGlzIGEgcHVyZSBmdW5jdGlvbiBvZgogICh0YWJsZSwgdGltZSkgYW5kIGxhbmRzIGJ5dGUtaWRlbnRpY2FsIGZyYW1lcy4gQSBzZWVkZWQsIHN0YXRpYwogIHBhcGVyLWdyYWluIG92ZXJsYXkgKGZlVHVyYnVsZW5jZSwgZml4ZWQgc2VlZCwgbmV2ZXIgYW5pbWF0ZWQpIHJpZGVzIHRoZQogIHdob2xlIHBpZWNlLgoKICBUaGUgbWFyayBpcyBhIFNMT1QuIENhbGxlcnMgc3VwcGx5IGNvbnRlbnQgYnkgcGxhY2luZyBhbiBpbmVydCB0ZW1wbGF0ZQogIGFueXdoZXJlIGluIHRoZSBIT1NUIHBhZ2UgKHRlbXBsYXRlcyBuZXZlciByZW5kZXIsIGFuZCB0aGUgcnVudGltZSB3aXBlcwogIHRoZSBob3N0IGNsaXAncyBvd24gY2hpbGRyZW4gb24gbW91bnQsIHNvIHRoZSBzbG90IGxpdmVzIGF0IGRvY3VtZW50IGxldmVsKToKCiAgICA8dGVtcGxhdGUgZGF0YS1zbG90PSJpbmstYmxlZWQtcmV2ZWFsLW1hcmsiPiAuLi4gPC90ZW1wbGF0ZT4KCiAgV2l0aCBubyBzbG90LCB0aGUgcHJpbWl0aXZlIHJlbmRlcnMgYSB0b2tlbiBtb25vZ3JhbTogb25lIGRpc3BsYXkgZ2x5cGggaW4KICBpbmssIGRyYXduIGVudGlyZWx5IGZyb20gY29udHJhY3QgdG9rZW5zLiBMaWdodCBwYXBlciBpcyB0aGUgaG9tZSByZWdpc3RlciwKICBidXQgZXZlcnkgY29sb3IgcmlkZXMgYSB0b2tlbiBzbyB0aGVtZXMgcmVzdGF0ZSBpdC4KCiAgVmFyaWFibGVzIChkZWNsYXJlZCBpbiBkYXRhLWNvbXBvc2l0aW9uLXZhcmlhYmxlcyBiZWxvdyk6CiAgICAtIGJsb2JzIChudW1iZXIgNC02LCBkZWZhdWx0IDUpOiBob3cgbWFueSBpbmsgYmxvYnMgYmxlZWQgYW5kIG1lcmdlLgogICAgLSBhY2NlbnQgKCJncmVlbiIgfCAiYmx1ZSIgfCAidmlvbGV0IiwgZGVmYXVsdCAiZ3JlZW4iKTogaW5rIHRpbnQ7IGdyZWVuCiAgICAgIHJpZGVzIC0tYnJhbmQsIGJsdWUgcmlkZXMgLS1hY2NlbnQsIHZpb2xldCByaWRlcyAtLWFjY2VudC0yLiBUaGUgaW5rCiAgICAgIGJvZHkgaXMgdGhlIGFjY2VudCBtaXhlZCB0b3dhcmQgLS1mZyBzbyBpdCByZWFkcyBhcyBwaWdtZW50LCBub3QgcGFpbnQuCiAgICAtIGV4aXQgKCJub25lIiB8ICJmYWRlIiB8ICJ1cCIsIGRlZmF1bHQgIm5vbmUiKTogZnJhbWUgcm9vdHMgb3duCiAgICAgIHRyYW5zaXRpb25zOyB0aGUgZGVmYXVsdCBob2xkcyB0aGUgcmV2ZWFsZWQgbWFyayB0byB0aGUgbGFzdCBwaXhlbC4KCiAgRW52ZWxvcGUsIGZpeGVkIElOIGFuZCBPVVQgd2l0aCBlbGFzdGljIEhPTEQgb25seSAobmV2ZXIgdGltZVNjYWxlKToKICAgIElOX0JBU0UgID0gMi44MHMgIGluayBibG9vbXMsIG1lcmdlcywgY29udHJhY3RzOyBtYXJrIHJlc29sdmVzIGNyaXNwCiAgICBIT0xEICAgICA9IG1heCgwLCBEIC0gSU4gLSBPVVQpOyB0cnVseSBzdGlsbCAoZ3JhaW4gaXMgc3RhdGljIGJ5CiAgICAgICAgICAgICAgIGNvbnN0cnVjdGlvbjogcGFpbnRlZCBieSBhIGZpeGVkLXNlZWQgZmVUdXJidWxlbmNlLCBuZXZlcgogICAgICAgICAgICAgICBhbmltYXRlZCwgc28gaGVsZCBmcmFtZXMgYXJlIGJ5dGUtaWRlbnRpY2FsKQogICAgT1VUX0JBU0UgPSAwLjQ1cyAgb25seSB3aGVuIGV4aXQgIT0gbm9uZQogICAgSWYgRCA8IElOX0JBU0UgKyBPVVRfQkFTRSwgSU4gYW5kIE9VVCBjb21wcmVzcyB0b2dldGhlci4KCiAgRGV0ZXJtaW5pc20gKGNsb3NlZC1mb3JtIGZpZWxkIGxhdyk6IHRoZXJlIGlzIE5PIHBoeXNpY3Mgc3RhdGUuIE9uZQogIHBlci1ibG9iIHBhcmFtZXRlciB0YWJsZSBpcyBjb21wdXRlZCBleGFjdGx5IG9uY2UgZHVyaW5nIHN5bmNocm9ub3VzCiAgdGltZWxpbmUgY29uc3RydWN0aW9uIGZyb20gZml4ZWQgTENHIHNlZWQgMHgxYjFlZWRjYTsgZXZlcnkgcGFpbnRlZCBmcmFtZQogIHBvc2l0aW9ucyBlYWNoIGJsb2IgYXMgYSBwdXJlIGZ1bmN0aW9uIG9mICh0YWJsZSByb3csIHRpbWVsaW5lIHRpbWUpIGluc2lkZQogIHRoZSBhbmNob3IgdHdlZW4ncyBvblVwZGF0ZS4gWmVybyBwZXItYmxvYiB0d2VlbnMuIE5vIE1hdGgucmFuZG9tLCBubyB3YWxsCiAgY2xvY2ssIG5vIHJlcXVlc3RBbmltYXRpb25GcmFtZS4gRXZlbnRmdWwgc2Vla3MgKHN1cHByZXNzRXZlbnRzPWZhbHNlLCB0aGUKICBlbmdpbmUncyByZW5kZXIgcGF0aCkgbGFuZCBpZGVudGljYWwgZnJhbWVzIGluIGFueSBvcmRlciBhbmQgZWl0aGVyCiAgZGlyZWN0aW9uOyBieSB0aGUgZW5kIG9mIElOIGV2ZXJ5IGJsb2IncyBzY2FsZSBpcyBleGFjdGx5IHplcm8gYW5kIHRoZSBnb28KICBsYXllcidzIG9wYWNpdHkgaXMgemVybywgc28gdGhlIEhPTEQgaXMgdGhlIGNyaXNwIG1hcmsgb24gc3RpbGwgcGFwZXIuCgogIE1vdW50IGNvbnRyYWN0OiB0aGUgcnVudGltZSBjbG9uZXMgb25seSB0aGlzIHRlbXBsYXRlLiAjcm9vdCBmaWxscyB0aGUKICBob3N0IGJveCAobm8gZGF0YS13aWR0aC9kYXRhLWhlaWdodCwgY29udGFpbmVyLXR5cGU6IHNpemUsIGNxbWluIHVuaXRzKSwKICBpcyBzdHlsZWQgdmlhICNyb290IG9ubHksIGFuZCByZWdpc3RlcnMgb25lIHBhdXNlZCB0aW1lbGluZSB1bmRlciB0aGUKICBMSVRFUkFMICJpbmstYmxlZWQtcmV2ZWFsIiBrZXkuIEFsbCBET00gc3RhdGUgaXMgc2V0IHdpdGggZXhwbGljaXQKICBlbmRwb2ludHMgKGdzYXAuc2V0ICsgZnJvbVRvKSBzbyBhbnkgc2VlayBvcmRlciBsYW5kcyBpZGVudGljYWwgZnJhbWVzLgotLT4KPGh0bWwKICBsYW5nPSJlbiIKICBkYXRhLWNvbXBvc2l0aW9uLWlkPSJpbmstYmxlZWQtcmV2ZWFsIgogIGRhdGEtY29tcG9zaXRpb24tZHVyYXRpb249IjQiCiAgZGF0YS1jb21wb3NpdGlvbi12YXJpYWJsZXM9J1sKICAgIHsgImlkIjogImJsb2JzIiwgInR5cGUiOiAibnVtYmVyIiwgInJvbGUiOiAic3R5bGUiLCAibGFiZWwiOiAiQmxvYnMiLCAiZGVzY3JpcHRpb24iOiAiSG93IG1hbnkgaW5rIGJsb2JzIGJsZWVkIGFuZCBtZXJnZSAoNCB0byA2KS4iLCAiZGVmYXVsdCI6IDUsICJtaW4iOiA0LCAibWF4IjogNiwgInN0ZXAiOiAxIH0sCiAgICB7ICJpZCI6ICJhY2NlbnQiLCAidHlwZSI6ICJlbnVtIiwgInJvbGUiOiAic3R5bGUiLCAibGFiZWwiOiAiQWNjZW50IiwgImRlc2NyaXB0aW9uIjogIkluayB0aW50OiBncmVlbiByaWRlcyAtLWJyYW5kLCBibHVlIHJpZGVzIC0tYWNjZW50LCB2aW9sZXQgcmlkZXMgLS1hY2NlbnQtMi4iLCAiZGVmYXVsdCI6ICJncmVlbiIsICJvcHRpb25zIjogW3sgInZhbHVlIjogImdyZWVuIiwgImxhYmVsIjogIkdyZWVuIiB9LCB7ICJ2YWx1ZSI6ICJibHVlIiwgImxhYmVsIjogIkJsdWUiIH0sIHsgInZhbHVlIjogInZpb2xldCIsICJsYWJlbCI6ICJWaW9sZXQiIH1dIH0sCiAgICB7ICJpZCI6ICJleGl0IiwgInR5cGUiOiAiZW51bSIsICJyb2xlIjogInRpbWluZyIsICJsYWJlbCI6ICJFeGl0IiwgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIGRlcGFydHVyZS4gRGVmYXVsdCBub25lOiB0aGUgcmV2ZWFsZWQgbWFyayBob2xkcyB1bnRpbCB0aGUgZnJhbWUgY3V0cy4iLCAiZGVmYXVsdCI6ICJub25lIiwgIm9wdGlvbnMiOiBbeyAidmFsdWUiOiAibm9uZSIsICJsYWJlbCI6ICJOb25lIiB9LCB7ICJ2YWx1ZSI6ICJmYWRlIiwgImxhYmVsIjogIkZhZGUiIH0sIHsgInZhbHVlIjogInVwIiwgImxhYmVsIjogIlVwIiB9XSB9CiAgXScKPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+CiAgICA8dGl0bGU+SW5rIEJsZWVkIFJldmVhbDwvdGl0bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHRlbXBsYXRlPgogICAgICA8ZGl2IGlkPSJyb290IiBkYXRhLWNvbXBvc2l0aW9uLWlkPSJpbmstYmxlZWQtcmV2ZWFsIiBkYXRhLWR1cmF0aW9uPSI0IiBkYXRhLWZwcz0iMzAiPgogICAgICAgIDxzdHlsZT4KICAgICAgICAgICosCiAgICAgICAgICAqOjpiZWZvcmUsCiAgICAgICAgICAqOjphZnRlciB7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICB9CgogICAgICAgICAgI3Jvb3QgewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICBjb250YWluZXItdHlwZTogc2l6ZTsKICAgICAgICAgICAgaXNvbGF0aW9uOiBpc29sYXRlOwogICAgICAgICAgICBjb2xvcjogdmFyKC0tZmcsICMxZDFiMTYpOwogICAgICAgICAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1kaXNwbGF5LCAiSW50ZXIiLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWYpOwogICAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgIH0KCiAgICAgICAgICAuaWJyLWNsaXAgewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZywgdHJhbnNwYXJlbnQpOwogICAgICAgICAgfQoKICAgICAgICAgIC5pYnItc3RhZ2UgewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5OwogICAgICAgICAgfQoKICAgICAgICAgIC8qIFRoZSBnb29leSBsYXllciBpcyBhIGNhbnZhczogYmx1ciArIGFscGhhIHRocmVzaG9sZCBhcmUgY29tcHV0ZWQKICAgICAgICAgICAgIGluLWJ1ZmZlciBlYWNoIHJlcGFpbnQgKGN0eC5maWx0ZXIgYmx1ciwgdGhlbiB0aGUgY29sb3JtYXRyaXgKICAgICAgICAgICAgIHRocmVzaG9sZCBhcHBsaWVkIHRvIHRoZSByZWFkYmFjaykuIENocm9tZSdzIGxpdmUgU1ZHL0NTUyBmaWx0ZXIKICAgICAgICAgICAgIHJhc3RlciBwYXRjaGVzIGRhbWFnZWQgdGlsZXMgd2l0aCBzZWVrLWhpc3RvcnktZGVwZW5kZW50IHNlYW0KICAgICAgICAgICAgIGFudGlhbGlhc2luZywgd2hpY2ggYnJlYWtzIGJ5dGUtaWRlbnRpY2FsIGZyYW1lczsgYSBjbGVhcmVkIGFuZAogICAgICAgICAgICAgZnVsbHkgcmVkcmF3biBjYW52YXMgaXMgYSBwdXJlIGZ1bmN0aW9uIG9mICh0YWJsZSwgdGltZSkuICovCiAgICAgICAgICAuaWJyLWNhbnZhcyB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICB9CgogICAgICAgICAgLmlici1tYXJrIHsKICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICBpbnNldDogMDsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTsKICAgICAgICAgIH0KCiAgICAgICAgICAuaWJyLW1vbm9ncmFtIHsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgd2lkdGg6IDQ0Y3FtaW47CiAgICAgICAgICAgIGhlaWdodDogNDRjcW1pbjsKICAgICAgICAgICAgYm9yZGVyOiAwLjVjcW1pbiBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0taWJyLWFjY2VudCkgNTglLCB2YXIoLS1mZywgIzFkMWIxNikpOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICB9CgogICAgICAgICAgLmlici1tb25vZ3JhbS1nbHlwaCB7CiAgICAgICAgICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0taWJyLWFjY2VudCkgNTUlLCB2YXIoLS1mZywgIzFkMWIxNikpOwogICAgICAgICAgICBmb250LXNpemU6IDIyY3FtaW47CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgICAgICAgfQoKICAgICAgICAgIC8qIFNlZWRlZCBzdGF0aWMgcGFwZXIgZ3JhaW46IGZlVHVyYnVsZW5jZSB3aXRoIGEgRklYRUQgc2VlZCBwYWludHMKICAgICAgICAgICAgIHRoaXMgbGF5ZXIgb25jZSBwZXIgcmFzdGVyOyBub3RoaW5nIGFib3V0IGl0IGlzIGFuaW1hdGVkLCBzbyBpdAogICAgICAgICAgICAgYWRkcyB0b290aCB3aXRob3V0IHRvdWNoaW5nIGRldGVybWluaXNtLiAqLwogICAgICAgICAgLmlici1ncmFpbiB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICAgIGZpbHRlcjogdXJsKCNpYnItZ3JhaW4tZmlsdGVyKTsKICAgICAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgICAgICBtaXgtYmxlbmQtbW9kZTogbXVsdGlwbHk7CiAgICAgICAgICB9CiAgICAgICAgPC9zdHlsZT4KCiAgICAgICAgPGRpdgogICAgICAgICAgaWQ9Imluay1ibGVlZC1yZXZlYWwtY2xpcCIKICAgICAgICAgIGNsYXNzPSJpYnItY2xpcCBjbGlwIgogICAgICAgICAgZGF0YS1zdGFydD0iMCIKICAgICAgICAgIGRhdGEtZHVyYXRpb249IjQiCiAgICAgICAgICBkYXRhLXRyYWNrLWluZGV4PSIwIgogICAgICAgID4KICAgICAgICAgIDxzdmcgYXJpYS1oaWRkZW49InRydWUiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGUiPgogICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICA8ZmlsdGVyCiAgICAgICAgICAgICAgICBpZD0iaWJyLWdyYWluLWZpbHRlciIKICAgICAgICAgICAgICAgIHg9IjAlIgogICAgICAgICAgICAgICAgeT0iMCUiCiAgICAgICAgICAgICAgICB3aWR0aD0iMTAwJSIKICAgICAgICAgICAgICAgIGhlaWdodD0iMTAwJSIKICAgICAgICAgICAgICAgIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZmVUdXJidWxlbmNlCiAgICAgICAgICAgICAgICAgIHR5cGU9ImZyYWN0YWxOb2lzZSIKICAgICAgICAgICAgICAgICAgYmFzZUZyZXF1ZW5jeT0iMC44MiIKICAgICAgICAgICAgICAgICAgbnVtT2N0YXZlcz0iMiIKICAgICAgICAgICAgICAgICAgc2VlZD0iMTEiCiAgICAgICAgICAgICAgICAgIHN0aXRjaFRpbGVzPSJzdGl0Y2giCiAgICAgICAgICAgICAgICAgIHJlc3VsdD0ibm9pc2UiCiAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXgKICAgICAgICAgICAgICAgICAgaW49Im5vaXNlIgogICAgICAgICAgICAgICAgICB0eXBlPSJtYXRyaXgiCiAgICAgICAgICAgICAgICAgIHZhbHVlcz0iMCAwIDAgMCAwICAwIDAgMCAwIDAgIDAgMCAwIDAgMCAgMC4xNCAwLjE0IDAuMTQgMCAwIgogICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICA8L2ZpbHRlcj4KICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpYnItc3RhZ2UiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpYnItbWFyayI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWJyLW1vbm9ncmFtIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpYnItbW9ub2dyYW0tZ2x5cGgiIGFyaWEtaGlkZGVuPSJ0cnVlIj5IPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGNhbnZhcyBjbGFzcz0iaWJyLWNhbnZhcyIgYXJpYS1oaWRkZW49InRydWUiPjwvY2FudmFzPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpYnItZ3JhaW4iPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2dzYXBAMy4xNC4yL2Rpc3QvZ3NhcC5taW4uanMiPjwvc2NyaXB0PgogICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAidXNlIHN0cmljdCI7CgogICAgICAgICAgICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyb290Iik7CiAgICAgICAgICAgIHZhciBzdGFnZSA9IHJvb3QucXVlcnlTZWxlY3RvcigiLmlici1zdGFnZSIpOwogICAgICAgICAgICB2YXIgY2FudmFzID0gcm9vdC5xdWVyeVNlbGVjdG9yKCIuaWJyLWNhbnZhcyIpOwogICAgICAgICAgICB2YXIgbWFyayA9IHJvb3QucXVlcnlTZWxlY3RvcigiLmlici1tYXJrIik7CiAgICAgICAgICAgIHZhciB2YXJzID0KICAgICAgICAgICAgICB3aW5kb3cuX19oeXBlcmZyYW1lcyAmJiB3aW5kb3cuX19oeXBlcmZyYW1lcy5nZXRWYXJpYWJsZXMKICAgICAgICAgICAgICAgID8gd2luZG93Ll9faHlwZXJmcmFtZXMuZ2V0VmFyaWFibGVzKCkKICAgICAgICAgICAgICAgIDoge307CgogICAgICAgICAgICB2YXIgYmxvYkNvdW50ID0gTWF0aC5yb3VuZChOdW1iZXIodmFycy5ibG9icykpOwogICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShibG9iQ291bnQpKSBibG9iQ291bnQgPSA1OwogICAgICAgICAgICBibG9iQ291bnQgPSBNYXRoLm1pbig2LCBNYXRoLm1heCg0LCBibG9iQ291bnQpKTsKICAgICAgICAgICAgLy8gRWFjaCBlbnVtIGNob2ljZSByb3V0ZXMgdG8gYSBESUZGRVJFTlQgY29udHJhY3QgdG9rZW4gc28gdGhlCiAgICAgICAgICAgIC8vIHZhcmlhYmxlIHN0YXlzIG1lYW5pbmdmdWwgdW5kZXIgYSB0aGVtZS4KICAgICAgICAgICAgdmFyIGFjY2VudENvbG9ycyA9IHsKICAgICAgICAgICAgICBncmVlbjogInZhcigtLWJyYW5kLCAjMTRhMzVlKSIsCiAgICAgICAgICAgICAgYmx1ZTogInZhcigtLWFjY2VudCwgIzJmNmZlZCkiLAogICAgICAgICAgICAgIHZpb2xldDogInZhcigtLWFjY2VudC0yLCAjN2E1Y2Q2KSIsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBhY2NlbnQgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYWNjZW50Q29sb3JzLCB2YXJzLmFjY2VudCkKICAgICAgICAgICAgICA/IHZhcnMuYWNjZW50CiAgICAgICAgICAgICAgOiAiZ3JlZW4iOwogICAgICAgICAgICB2YXIgZXhpdCA9IHZhcnMuZXhpdCA9PT0gImZhZGUiIHx8IHZhcnMuZXhpdCA9PT0gInVwIiA/IHZhcnMuZXhpdCA6ICJub25lIjsKCiAgICAgICAgICAgIHJvb3Quc3R5bGUuc2V0UHJvcGVydHkoIi0taWJyLWFjY2VudCIsIGFjY2VudENvbG9yc1thY2NlbnRdKTsKCiAgICAgICAgICAgIC8vIFNMT1QuIENhbGxlciB0ZW1wbGF0ZXMgbGl2ZSBhdCBIT1NUIERPQ1VNRU5UIGxldmVsICh0aGUgbW91bnQKICAgICAgICAgICAgLy8gd2lwZXMgaG9zdC1jbGlwIGNoaWxkcmVuLCBhbmQgdGVtcGxhdGVzIG5ldmVyIHJlbmRlcikuIFRoZQogICAgICAgICAgICAvLyBzY29wZWQgZG9jdW1lbnQgcHJveHkgZmlsdGVycyBxdWVyaWVzIHRvIHRoaXMgY29tcG9zaXRpb24ncwogICAgICAgICAgICAvLyBzdWJ0cmVlLCBzbyB0aGUgbG9va3VwIGRlbGliZXJhdGVseSBnb2VzIHRocm91Z2ggb3duZXJEb2N1bWVudC4KICAgICAgICAgICAgdmFyIGhvc3REb2MgPSByb290Lm93bmVyRG9jdW1lbnQ7CiAgICAgICAgICAgIHZhciBzbG90VGVtcGxhdGUgPSBudWxsOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHNsb3RUZW1wbGF0ZSA9IGhvc3REb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGVbZGF0YS1zbG90PSJpbmstYmxlZWQtcmV2ZWFsLW1hcmsiXScpOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgIHNsb3RUZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNsb3RUZW1wbGF0ZSkgewogICAgICAgICAgICAgIG1hcmsucXVlcnlTZWxlY3RvcigiLmlici1tb25vZ3JhbSIpLnJlbW92ZSgpOwogICAgICAgICAgICAgIG1hcmsuYXBwZW5kQ2hpbGQoaG9zdERvYy5pbXBvcnROb2RlKHNsb3RUZW1wbGF0ZS5jb250ZW50LCB0cnVlKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVudmVsb3BlOiBmaXhlZCBJTi9PVVQsIGVsYXN0aWMgSE9MRCwgbmV2ZXIgdGltZS1zY2FsZWQuCiAgICAgICAgICAgIHZhciBJTl9CQVNFID0gMi44OwogICAgICAgICAgICB2YXIgT1VUX0JBU0UgPSBleGl0ID09PSAibm9uZSIgPyAwIDogMC40NTsKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gTWF0aC5tYXgoMC4wMDEsIHBhcnNlRmxvYXQocm9vdC5kYXRhc2V0LmR1cmF0aW9uIHx8ICI0IikpOwogICAgICAgICAgICB2YXIgdG90YWxCYXNlID0gTWF0aC5tYXgoMC4wMDEsIElOX0JBU0UgKyBPVVRfQkFTRSk7CiAgICAgICAgICAgIHZhciBzY2FsZSA9IGR1cmF0aW9uIDwgdG90YWxCYXNlID8gZHVyYXRpb24gLyB0b3RhbEJhc2UgOiAxOwogICAgICAgICAgICB2YXIgSU4gPSBJTl9CQVNFICogc2NhbGU7CiAgICAgICAgICAgIHZhciBPVVQgPSBPVVRfQkFTRSAqIHNjYWxlOwogICAgICAgICAgICB2YXIgSE9MRCA9IE1hdGgubWF4KDAsIGR1cmF0aW9uIC0gKElOICsgT1VUKSk7CiAgICAgICAgICAgIHZhciBPVVRfU1RBUlQgPSBJTiArIEhPTEQ7CgogICAgICAgICAgICAvLyBHZW9tZXRyeSBiYXNpcyBpcyBmaXhlZCBvbmNlIGF0IG1vdW50IGZyb20gdGhlIGhvc3QgYm94LCBsaWtlCiAgICAgICAgICAgIC8vIHRoZSBwYXJ0aWNsZS1pbWFnZS1yZXZlYWwgY2FudmFzIHJhc3RlcjogdGhlIHNhbWUgaG9zdCBhbHdheXMKICAgICAgICAgICAgLy8geWllbGRzIHRoZSBzYW1lIHBpeGVsIGNvb3JkaW5hdGVzIGFuZCBibHVyIHJhZGl1cy4gVGhlIGRpc3BsYXkKICAgICAgICAgICAgLy8gY2FudmFzIHJpZGVzIHRoZSBob3N0IHJhc3RlcjsgdGhlIGdvbyBpdHNlbGYgaXMgY29tcHV0ZWQgaW4gYQogICAgICAgICAgICAvLyBsb3ctcmVzb2x1dGlvbiB3b3JrIGJ1ZmZlciAodGhlIGJsdXIgcmFkaXVzIGR3YXJmcyB0aGUgbG9zdAogICAgICAgICAgICAvLyBkZXRhaWwsIGFuZCB0aGUgdXBzY2FsZSBzb2Z0ZW5zIHRoZSBpbmsgZWRnZSBwbGVhc2FudGx5KS4KICAgICAgICAgICAgdmFyIGRwciA9IE1hdGgubWluKDIsIE1hdGgubWF4KDEsIE51bWJlcih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgfHwgMSkpOwogICAgICAgICAgICB2YXIgYm94ID0gcm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgdmFyIGNzc1cgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJveC53aWR0aCkgfHwgNjQwKTsKICAgICAgICAgICAgdmFyIGNzc0ggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJveC5oZWlnaHQpIHx8IDM2MCk7CiAgICAgICAgICAgIHZhciBtaW5EaW0gPSBNYXRoLm1pbihjc3NXLCBjc3NIKTsKICAgICAgICAgICAgdmFyIGN4ID0gY3NzVyAvIDI7CiAgICAgICAgICAgIHZhciBjeSA9IGNzc0ggLyAyOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKGNzc1cgKiBkcHIpOwogICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChjc3NIICogZHByKTsKICAgICAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICB2YXIgTE9XID0gMzsKICAgICAgICAgICAgdmFyIHdvcmsgPSBob3N0RG9jLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICB3b3JrLndpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNzc1cgLyBMT1cpKTsKICAgICAgICAgICAgd29yay5oZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwoY3NzSCAvIExPVykpOwogICAgICAgICAgICB2YXIgd29ya0N0eCA9IHdvcmsuZ2V0Q29udGV4dCgiMmQiLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTsKCiAgICAgICAgICAgIC8vIEdvb2V5IHJhdGlvOiB0aGUgYmx1ciByYWRpdXMgdnMuIHRocmVzaG9sZCBzbG9wZSBpcyB3aGF0IG1ha2VzCiAgICAgICAgICAgIC8vIHRoaXMgcmVhZCBhcyBsaXF1aWQgaW5zdGVhZCBvZiBibHVyLiBTYW1lIG1hdGggYXMgdGhlIGNsYXNzaWMKICAgICAgICAgICAgLy8gU1ZHIGNoYWluIChmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb24sIHRoZW4gZmVDb2xvck1hdHJpeAogICAgICAgICAgICAvLyBhbHBoYSByb3cgMjIgLyAtOSksIGNvbXB1dGVkIGluLWJ1ZmZlciBmb3IgYnl0ZS1zdGFibGUgc2Vla3MuCiAgICAgICAgICAgIHZhciBibHVyTG93ID0gTWF0aC5tYXgoMiwgKG1pbkRpbSAqIDAuMDI4KSAvIExPVyk7CgogICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBpbmsgY29sb3IgdG8gYSBjb25jcmV0ZSB2YWx1ZSBvbmNlIGF0IG1vdW50IHNvCiAgICAgICAgICAgIC8vIGNhbnZhcyBmaWxscyBuZXZlciBkZXBlbmQgb24gc3R5bGUgcmVjYWxjIGR1cmluZyBzZWVrcy4KICAgICAgICAgICAgdmFyIHByb2JlID0gaG9zdERvYy5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgIHByb2JlLnN0eWxlLmNvbG9yID0KICAgICAgICAgICAgICAiY29sb3ItbWl4KGluIHNyZ2IsICIgKyBhY2NlbnRDb2xvcnNbYWNjZW50XSArICIgNjIlLCB2YXIoLS1mZywgIzFkMWIxNikpIjsKICAgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChwcm9iZSk7CiAgICAgICAgICAgIHZhciBpbmtDb2xvciA9IGdldENvbXB1dGVkU3R5bGUocHJvYmUpLmNvbG9yIHx8ICIjMWQxYjE2IjsKICAgICAgICAgICAgcHJvYmUucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBUaGUgTENHIGFuZCBldmVyeSBwZXItYmxvYiBkZWNpc2lvbiBsaXZlIGhlcmUuIFRoaXMgSUlGRSBydW5zCiAgICAgICAgICAgIC8vIG9uY2UgYmVmb3JlIHRpbWVsaW5lIGNvbnN0cnVjdGlvbjsgYWZ0ZXJ3YXJkcyBvbmx5IHRoZSB0YWJsZSBpcwogICAgICAgICAgICAvLyByZWFkLiBCbG9iIHN0YXRlIGF0IGFueSB0aW1lIGlzIGEgcHVyZSBjbG9zZWQtZm9ybSBmdW5jdGlvbiBvZgogICAgICAgICAgICAvLyAodGFibGUgcm93LCB0aW1lbGluZSB0aW1lKS4gTm8gdmVsb2NpdGllcywgbm8gaW50ZWdyYXRpb24uCiAgICAgICAgICAgIHZhciBibG9iUm93cyA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIHN0YXRlID0gMHgxYjFlZWRjYTsKICAgICAgICAgICAgICBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgICAgICAgICAgc3RhdGUgPSAoTWF0aC5pbXVsKDE2NjQ1MjUsIHN0YXRlKSArIDEwMTM5MDQyMjMpID4+PiAwOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlIC8gNDI5NDk2NzI5NjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2JDb3VudDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICB2YXIgYW5nbGUgPSAoaSAvIGJsb2JDb3VudCkgKiBNYXRoLlBJICogMiArIG5leHQoKSAqIDAuOTsKICAgICAgICAgICAgICAgIHJvd3MucHVzaCh7CiAgICAgICAgICAgICAgICAgIGRpclg6IE1hdGguY29zKGFuZ2xlKSwKICAgICAgICAgICAgICAgICAgZGlyWTogTWF0aC5zaW4oYW5nbGUpLAogICAgICAgICAgICAgICAgICAvLyBIb3cgZmFyIHRoaXMgYmxvYiBibGVlZHMgb3V0d2FyZCBmcm9tIHRoZSBkcm9wIHBvaW50LgogICAgICAgICAgICAgICAgICBzcHJlYWQ6ICgwLjE2ICsgMC4xNiAqIG5leHQoKSkgKiBtaW5EaW0sCiAgICAgICAgICAgICAgICAgIC8vIEJhc2UgZGlhbWV0ZXI7IHRoZSBmaXJzdCBibG9iIGlzIHRoZSBmYXQgbW90aGVyIGRyb3AuCiAgICAgICAgICAgICAgICAgIHNpemU6IChpID09PSAwID8gMC4zNCA6IDAuMTQgKyAwLjEyICogbmV4dCgpKSAqIG1pbkRpbSwKICAgICAgICAgICAgICAgICAgLy8gQmxvb20gc3RhZ2dlciBhbmQgZGVhdGggc2NoZWR1bGUsIGZyYWN0aW9ucyBvZiBJTi4KICAgICAgICAgICAgICAgICAgYmlydGg6IGkgPT09IDAgPyAwIDogMC4wNCArIDAuMyAqIG5leHQoKSwKICAgICAgICAgICAgICAgICAgZGllOiAwLjUgKyAwLjE2ICogbmV4dCgpLAogICAgICAgICAgICAgICAgICAvLyBXb2JibGUgbWFrZXMgdGhlIGJsZWVkIG9yZ2FuaWM7IGFtcGxpdHVkZSByaWRlcyAoMSAtIGRpZSkKICAgICAgICAgICAgICAgICAgLy8gc28gaXQgaXMgZXhhY3RseSB6ZXJvIG9uY2UgdGhlIGJsb2IgaXMgZ29uZS4KICAgICAgICAgICAgICAgICAgd29iYmxlQW1wOiAoMC4wMiArIDAuMDMgKiBuZXh0KCkpICogbWluRGltLAogICAgICAgICAgICAgICAgICB3b2JibGVQaGFzZTogbmV4dCgpICogTWF0aC5QSSAqIDIsCiAgICAgICAgICAgICAgICAgIHdvYmJsZUZyZXE6IDIgKyBNYXRoLmZsb29yKG5leHQoKSAqIDMpLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiByb3dzOwogICAgICAgICAgICB9KSgpOwoKICAgICAgICAgICAgZnVuY3Rpb24gY2xhbXAwMSh2KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHYgPCAwID8gMCA6IHYgPiAxID8gMSA6IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZWFzZU91dEN1YmljKHYpIHsKICAgICAgICAgICAgICByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB2LCAzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBlYXNlSW5PdXQodikgewogICAgICAgICAgICAgIHJldHVybiB2IDwgMC41ID8gMiAqIHYgKiB2IDogMSAtIE1hdGgucG93KC0yICogdiArIDIsIDIpIC8gMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHVyZSByZXBhaW50OiBjbGVhciB0aGUgd29yayBidWZmZXIsIGRyYXcgZXZlcnkgYmxvYiBmcm9tIGl0cwogICAgICAgICAgICAvLyBjbG9zZWQtZm9ybSAocm93LCBwKSBzdGF0ZSwgYmx1ciwgdGhyZXNob2xkIHRoZSByZWFkYmFjaywgdGhlbgogICAgICAgICAgICAvLyBibGl0IHVwIHRvIHRoZSBkaXNwbGF5IGNhbnZhcy4gRXZlcnkgc3RlcCBpcyBhIHB1cmUgZnVuY3Rpb24KICAgICAgICAgICAgLy8gb2YgKHRhYmxlLCB0aW1lbGluZSB0aW1lKTsgbm8gaGlzdG9yeSBzdXJ2aXZlcyBhIGZyYW1lLgogICAgICAgICAgICBmdW5jdGlvbiBwYWludCh0aW1lU2Vjb25kcykgewogICAgICAgICAgICAgIHZhciBwID0gSU4gPiAwID8gY2xhbXAwMSh0aW1lU2Vjb25kcyAvIElOKSA6IDE7CiAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgIC8vIFRoZSBsYXllciBmYWRlcyBvdmVyIHRoZSBtYXJrIGFzIHRoZSBsYXN0IGJsb2JzIGRpZSwKICAgICAgICAgICAgICAvLyBndWFyYW50ZWVpbmcgYW4gZXhhY3RseS1lbXB0eSBjYW52YXMgdGhyb3VnaCB0aGUgSE9MRC4KICAgICAgICAgICAgICB2YXIgbGF5ZXJBbHBoYSA9IDEgLSBjbGFtcDAxKChwIC0gMC44NikgLyAwLjEyKTsKICAgICAgICAgICAgICBpZiAobGF5ZXJBbHBoYSA9PT0gMCkgcmV0dXJuOwogICAgICAgICAgICAgIHdvcmtDdHguZmlsdGVyID0gIm5vbmUiOwogICAgICAgICAgICAgIHdvcmtDdHguY2xlYXJSZWN0KDAsIDAsIHdvcmsud2lkdGgsIHdvcmsuaGVpZ2h0KTsKICAgICAgICAgICAgICB3b3JrQ3R4LmZpbHRlciA9ICJibHVyKCIgKyBibHVyTG93ICsgInB4KSI7CiAgICAgICAgICAgICAgd29ya0N0eC5maWxsU3R5bGUgPSBpbmtDb2xvcjsKICAgICAgICAgICAgICB2YXIgZHJldyA9IGZhbHNlOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvYlJvd3MubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIHZhciByb3cgPSBibG9iUm93c1tpXTsKICAgICAgICAgICAgICAgIC8vIEJsb29tOiB0aGUgYmxvYiBzdXJmYWNlcyBhbmQgYmxlZWRzIG91dHdhcmQuCiAgICAgICAgICAgICAgICB2YXIgZ3JvdyA9IGVhc2VPdXRDdWJpYyhjbGFtcDAxKChwIC0gcm93LmJpcnRoKSAvIDAuMzQpKTsKICAgICAgICAgICAgICAgIC8vIFNldHRsZTogdGhlIGluayBwdWxscyBiYWNrIHRvIHRoZSBkcm9wIHBvaW50IGFuZCBkaWVzLgogICAgICAgICAgICAgICAgLy8gRXZlcnkgZGllIHJhbXAgY29tcGxldGVzIGJ5IHAgPSAwLjk3IGV4YWN0bHkuCiAgICAgICAgICAgICAgICB2YXIgZGllID0gZWFzZUluT3V0KGNsYW1wMDEoKHAgLSByb3cuZGllKSAvICgwLjk3IC0gcm93LmRpZSkpKTsKICAgICAgICAgICAgICAgIHZhciByID0gKHJvdy5zaXplIC8gMikgKiBncm93ICogKDEgLSBkaWUpOwogICAgICAgICAgICAgICAgaWYgKHIgPD0gMC4wMSkgY29udGludWU7CiAgICAgICAgICAgICAgICB2YXIgcmVhY2ggPSByb3cuc3ByZWFkICogZ3JvdyAqICgxIC0gZGllKTsKICAgICAgICAgICAgICAgIHZhciB3b2IgPQogICAgICAgICAgICAgICAgICBNYXRoLnNpbihwICogTWF0aC5QSSAqIDIgKiByb3cud29iYmxlRnJlcSArIHJvdy53b2JibGVQaGFzZSkgKgogICAgICAgICAgICAgICAgICByb3cud29iYmxlQW1wICoKICAgICAgICAgICAgICAgICAgZ3JvdyAqCiAgICAgICAgICAgICAgICAgICgxIC0gZGllKTsKICAgICAgICAgICAgICAgIHZhciB4ID0gY3ggKyByb3cuZGlyWCAqIHJlYWNoICsgd29iICogcm93LmRpclk7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGN5ICsgcm93LmRpclkgKiByZWFjaCAtIHdvYiAqIHJvdy5kaXJYOwogICAgICAgICAgICAgICAgd29ya0N0eC5iZWdpblBhdGgoKTsKICAgICAgICAgICAgICAgIHdvcmtDdHguYXJjKHggLyBMT1csIHkgLyBMT1csIHIgLyBMT1csIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICAgICAgICAgIHdvcmtDdHguZmlsbCgpOwogICAgICAgICAgICAgICAgZHJldyA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHdvcmtDdHguZmlsdGVyID0gIm5vbmUiOwogICAgICAgICAgICAgIGlmICghZHJldykgcmV0dXJuOwogICAgICAgICAgICAgIC8vIFRoZSBjb2xvcm1hdHJpeCB0aHJlc2hvbGQgKGFscGhhIHJvdyAyMiAvIC05KSBhcHBsaWVkIHRvIHRoZQogICAgICAgICAgICAgIC8vIGJsdXJyZWQgYnVmZmVyOiB0aGlzIHNuYXAgaXMgd2hhdCB0dXJucyBvdmVybGFwIGludG8gZ29vLgogICAgICAgICAgICAgIHZhciBpbWFnZSA9IHdvcmtDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdvcmsud2lkdGgsIHdvcmsuaGVpZ2h0KTsKICAgICAgICAgICAgICB2YXIgZGF0YSA9IGltYWdlLmRhdGE7CiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDM7IGogPCBkYXRhLmxlbmd0aDsgaiArPSA0KSB7CiAgICAgICAgICAgICAgICB2YXIgYSA9IChkYXRhW2pdIC8gMjU1KSAqIDIyIC0gOTsKICAgICAgICAgICAgICAgIGRhdGFbal0gPSBhIDw9IDAgPyAwIDogYSA+PSAxID8gMjU1IDogTWF0aC5yb3VuZChhICogMjU1KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd29ya0N0eC5wdXRJbWFnZURhdGEoaW1hZ2UsIDAsIDApOwogICAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGxheWVyQWxwaGE7CiAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZSh3b3JrLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdzYXAuc2V0KHN0YWdlLCB7IG9wYWNpdHk6IDEsIHk6ICIwY3FoIiB9KTsKICAgICAgICAgICAgZ3NhcC5zZXQobWFyaywgeyBvcGFjaXR5OiAwLCBzY2FsZTogMC45NCwgdHJhbnNmb3JtT3JpZ2luOiAiNTAlIDUwJSIgfSk7CgogICAgICAgICAgICB2YXIgdGwgPSBnc2FwLnRpbWVsaW5lKHsKICAgICAgICAgICAgICBwYXVzZWQ6IHRydWUsCiAgICAgICAgICAgICAgb25VcGRhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHBhaW50KHRsLnRpbWUoKSk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBBbmNob3IgdHdlZW46IGFuIGluZXJ0IHBsYWluLW9iamVjdCB0d2VlbiBzcGFubmluZyB0aGUgZnVsbAogICAgICAgICAgICAvLyBhdXRob3JlZCBkdXJhdGlvbiBzbyB0bC50aW1lKCkgY292ZXJzIFswLCBEXSBhbmQgb25VcGRhdGUKICAgICAgICAgICAgLy8gKHRoZSBibG9iIHBhaW50ZXIpIGZpcmVzIGZvciBldmVyeSBldmVudGZ1bCBzZWVrIGFueXdoZXJlIGluCiAgICAgICAgICAgIC8vIHRoZSBwaWVjZSwgaW5jbHVkaW5nIHRoZSBob2xkLgogICAgICAgICAgICB0bC50byh7IHA6IDAgfSwgeyBwOiAxLCBkdXJhdGlvbjogZHVyYXRpb24sIGVhc2U6ICJub25lIiB9LCAwKTsKCiAgICAgICAgICAgIC8vIElOOiB0aGUgY3Jpc3AgbWFyayByZXNvbHZlcyBiZW5lYXRoIHRoZSBjb250cmFjdGluZyBwdWRkbGUuCiAgICAgICAgICAgIC8vIEJvdGggZW5kcG9pbnRzIGF1dGhvcmVkOyB0aGUgaW5rIHN1cHBsaWVzIHRoZSBkcmFtYSwgdGhlIG1hcmsKICAgICAgICAgICAgLy8gbGFuZHMgd2l0aCBvbmUgcmVzdHJhaW5lZCBzZXR0bGUuCiAgICAgICAgICAgIHRsLmZyb21UbygKICAgICAgICAgICAgICBtYXJrLAogICAgICAgICAgICAgIHsgb3BhY2l0eTogMCB9LAogICAgICAgICAgICAgIHsgb3BhY2l0eTogMSwgZHVyYXRpb246IElOICogMC4zNCwgZWFzZTogInBvd2VyMi5vdXQiIH0sCiAgICAgICAgICAgICAgSU4gKiAwLjUyLAogICAgICAgICAgICApOwogICAgICAgICAgICB0bC5mcm9tVG8oCiAgICAgICAgICAgICAgbWFyaywKICAgICAgICAgICAgICB7IHNjYWxlOiAwLjk0IH0sCiAgICAgICAgICAgICAgeyBzY2FsZTogMSwgZHVyYXRpb246IElOICogMC40LCBlYXNlOiAicG93ZXIyLm91dCIgfSwKICAgICAgICAgICAgICBJTiAqIDAuNTIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAvLyBIT0xEOiB0cnVseSBzdGlsbC4gVGhlIGdvbyBjYW52YXMgaXMgb25lIGNsZWFyIHJlY3QgKGV2ZXJ5CiAgICAgICAgICAgIC8vIGJsb2IgZGVhZCwgbGF5ZXIgYWxwaGEgemVybykgYW5kIHRoZSBncmFpbiBpcyBhIHN0YXRpYyBzZWVkZWQKICAgICAgICAgICAgLy8gcmFzdGVyLgoKICAgICAgICAgICAgLy8gT1VUOiBvcHRpb25hbCBkZXBhcnR1cmU7IGV4aXQgbm9uZSBob2xkcyB1bnRpbCB0aGUgZnJhbWUgY3V0cy4KICAgICAgICAgICAgaWYgKGV4aXQgPT09ICJ1cCIpIHsKICAgICAgICAgICAgICB0bC50byhzdGFnZSwgeyB5OiAiLTRjcWgiLCBkdXJhdGlvbjogT1VULCBlYXNlOiAicG93ZXIyLmluIiB9LCBPVVRfU1RBUlQpOwogICAgICAgICAgICAgIHRsLnRvKHN0YWdlLCB7IG9wYWNpdHk6IDAsIGR1cmF0aW9uOiBPVVQsIGVhc2U6ICJwb3dlcjIuaW4iIH0sIE9VVF9TVEFSVCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhpdCA9PT0gImZhZGUiKSB7CiAgICAgICAgICAgICAgdGwudG8oc3RhZ2UsIHsgb3BhY2l0eTogMCwgZHVyYXRpb246IE9VVCwgZWFzZTogInBvd2VyMi5pbiIgfSwgT1VUX1NUQVJUKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGwuc2VlaygwKTsKICAgICAgICAgICAgcGFpbnQoMCk7CiAgICAgICAgICAgIHdpbmRvdy5fX3RpbWVsaW5lcyA9IHdpbmRvdy5fX3RpbWVsaW5lcyB8fCB7fTsKICAgICAgICAgICAgd2luZG93Ll9fdGltZWxpbmVzWyJpbmstYmxlZWQtcmV2ZWFsIl0gPSB0bDsKICAgICAgICAgIH0pKCk7CiAgICAgICAgPC9zY3JpcHQ+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICA8L2JvZHk+CjwvaHRtbD4K\" data-start=\"0\" data-duration=\"5\" data-track-index=\"0\" data-width=\"1920\" data-height=\"1080\"></div>\n </div>\n <script>\n window.__timelines = window.__timelines || {};\n window.__timelines[\"preview-root\"] = gsap.timeline({ paused: true });\n </script>\n</body>\n</html>"}