/*
 * FONT LAYER — shared by every page on the platform.
 *
 * Split out of style.css because style.css is the reveal DECK theme (gainsboro
 * background, navy, slide sizing) and lectures.html / k12.html / teacher.html must
 * not inherit that, yet they still need the @font-face declarations and the
 * language tokens. Loading style.css there to get at the fonts would drag the whole
 * deck look with it.
 *
 * Load order on every page: 98.css -> fonts.css -> (page CSS) -> win98_overrides.css
 */

/*
 * FONTS — one pairing per language, because the course is bilingual.
 *
 * Measured with PROGRESS/temp/script/check_font_vi.py: FuturaStd carries 0/90 and
 * AdobeGaramondPro 0/90 of the Vietnamese tone-mark codepoints (U+1EA0-1EF9). Not
 * a rendering nuance — the glyphs do not exist, so every accented word fell back
 * to a system font mid-sentence and Vietnamese slides rendered in two typefaces.
 *
 * Neither font is dropped: they are the ENGLISH pairing, where they are perfect
 * and where the deck's original look came from. Vietnamese gets faces that can
 * actually spell it. Which pair applies follows the `lang` attribute, so a single
 * slide can carry both languages and each picks up its own face:
 *
 *   Vietnamese (default)          English (:lang(en))
 *   Thuy_san    Be Vietnam Pro    Thuy_san_en    FuturaStd Book/Bold
 *   Thuy_san_b  … ExtraBold       Thuy_san_en_b  FuturaStd ExtraBold
 *   Thuy_serif  EB Garamond       Thuy_serif_en  AdobeGaramondPro
 *
 * Call sites use the --r-main-font / --r-heading-font / --k12-h1-font variables
 * below, never a family name directly, so nothing downstream has to know a
 * language switch happened.
 *
 * The Vietnamese files are subsetted (Latin + Vietnamese only) and woff2-compressed
 * by PROGRESS/temp/script/fetch_vi_fonts.py — 262 KB for all six weights, less than
 * the four AdobeGaramond .otf files alone. The English .otf are the originals,
 * untouched, and are only downloaded once English content is actually on screen.
 */

/* --- Vietnamese: Be Vietnam Pro + EB Garamond -------------------------------- */
@font-face {
  font-family: Thuy_san;
  src: url(./assets/fonts/023eeca99e96585e0244aeb57b9eba9d.woff2) format("woff2");
  font-weight: normal;
}
@font-face {
  font-family: Thuy_san;
  src: url(./assets/fonts/bb94b0ac7495cc64f018044466c6d3fe.woff2) format("woff2");
  font-weight: bold;
}
@font-face {
  font-family: Thuy_san_b;
  src: url(./assets/fonts/271cf8854a2355b612bae294cced5ac7.woff2) format("woff2");
  font-weight: bold;
}
@font-face {
  font-family: Thuy_serif;
  src: url(./assets/fonts/051a74130df9c52f43f5935faaa77d28.woff2) format("woff2");
  font-weight: normal;
}
@font-face {
  font-family: Thuy_serif;
  src: url(./assets/fonts/9cea4e4e7ef587cb0abecb6127809a57.woff2) format("woff2");
  font-weight: bold;
}
@font-face {
  font-family: Thuy_serif;
  src: url(./assets/fonts/45ea1a0ed1dc87b30056838dccea6aed.woff2) format("woff2");
  font-style: Italic;
  font-feature-settings: 'kern', 'swsh', 'liga';
}

/* --- English: the original pairing. https://www.cdnfonts.com/futura-std-4.font -- */
@font-face {
  font-family: Thuy_san_en;
  src: url(./assets/fonts/5f83b0049a36e35d22658f272d501f66.otf) format("opentype");
  font-weight: normal;
}
@font-face {
  font-family: Thuy_san_en;
  src: url(./assets/fonts/fe9bd26c044eb0bfaa28ec000f633e35.otf) format("opentype");
  font-weight: bold;
}
@font-face {
  font-family: Thuy_san_en_b;
  src: url(./assets/fonts/db6be7c246fd3f966ebc75201dbd263a.otf) format("opentype");
  font-weight: bold;
}
@font-face {
  font-family: Thuy_serif_en;
  src: url(./assets/fonts/9b0413a839f8514dc24b094baeae8ee6.otf) format("opentype");
  font-weight: normal;
}
@font-face {
  font-family: Thuy_serif_en;
  src: url(./assets/fonts/26b7f980032a65d843906ace0f977434.otf) format("opentype");
  font-weight: bold;
}
@font-face {
  font-family: Thuy_serif_en;
  src: url(./assets/fonts/0f4928cd820d85cc400e70a7a8270990.otf) format("opentype");
  font-style: Italic;
  font-feature-settings: 'kern', 'swsh', 'liga';
}

:root {
  --r-main-font:    Thuy_serif;
  --r-heading-font: Thuy_san;
  --k12-h1-font:    Thuy_san_b;
}

/*
 * English content opts back into the original Futura/AdobeGaramond pairing. Mark
 * it up with a lang attribute and nothing else has to change:
 *
 *   <section lang="en">        a whole English slide
 *   <span lang="en">…</span>   one English phrase inside a Vietnamese sentence
 *
 * :lang() rather than [lang="en"] so "en-US"/"en-GB" match too. Custom properties
 * inherit, so tagging the outermost element is enough for everything under it, and
 * this stays per-element -- a future language switcher only has to set `lang` on
 * <html> (or per slide) for the whole platform to follow.
 *
 * Vietnamese is the DEFAULT (bare :root) on purpose: it is the majority of the
 * material, and an untagged Vietnamese slide must never land on a font that has
 * no Vietnamese glyphs. Untagged English, by contrast, merely renders in the
 * Vietnamese pair -- which is legible, just not the intended look.
 */
:root:lang(en),
:lang(en) {
  --r-main-font:    Thuy_serif_en;
  --r-heading-font: Thuy_san_en;
  --k12-h1-font:    Thuy_san_en_b;
}

/*
 * Redefining the variables is enough for HEADINGS but not for body text, and the
 * difference is easy to get wrong: reveal's theme declares
 * `font-family: var(--r-heading-font)` on the heading itself, so the variable is
 * resolved in the heading's own context and picks up the :lang() override. Body
 * text gets its family from `.reveal { font-family: var(--r-main-font) }` -- the
 * variable is resolved once, up on .reveal, and a lang-tagged descendant merely
 * INHERITS the already-resolved family. Restating the declaration on the tagged
 * element is what makes it re-resolve there.
 *
 * Low specificity (0,0,7) is deliberate and sufficient: a declaration ON an element
 * beats an inherited value whatever its specificity, so this only has to outrank
 * other rules that target this same element -- and it should lose to those.
 * Headings are excluded so it cannot hand an English heading the body face.
 */
[lang]:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {
  font-family: var(--r-main-font);
}

/*# sourceURL=webpack://./src/fonts.css */
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL3NyYy9mb250cy5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7RUFVRTs7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwQkU7O0FBRUYsa0ZBQWtGO0FBQ2xGO0VBQ0UscUJBQXFCO0VBQ3JCLDREQUErRTtFQUMvRSxtQkFBbUI7QUFDckI7QUFDQTtFQUNFLHFCQUFxQjtFQUNyQiw0REFBNEU7RUFDNUUsaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRSx1QkFBdUI7RUFDdkIsNERBQWlGO0VBQ2pGLGlCQUFpQjtBQUNuQjtBQUNBO0VBQ0UsdUJBQXVCO0VBQ3ZCLDREQUEyRTtFQUMzRSxtQkFBbUI7QUFDckI7QUFDQTtFQUNFLHVCQUF1QjtFQUN2Qiw0REFBd0U7RUFDeEUsaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRSx1QkFBdUI7RUFDdkIsNERBQTBFO0VBQzFFLGtCQUFrQjtFQUNsQiw2Q0FBNkM7QUFDL0M7O0FBRUEscUZBQXFGO0FBQ3JGO0VBQ0Usd0JBQXdCO0VBQ3hCLCtEQUF5RTtFQUN6RSxtQkFBbUI7QUFDckI7QUFDQTtFQUNFLHdCQUF3QjtFQUN4QiwrREFBeUU7RUFDekUsaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRSwwQkFBMEI7RUFDMUIsK0RBQThFO0VBQzlFLGlCQUFpQjtBQUNuQjtBQUNBO0VBQ0UsMEJBQTBCO0VBQzFCLCtEQUFpRjtFQUNqRixtQkFBbUI7QUFDckI7QUFDQTtFQUNFLDBCQUEwQjtFQUMxQixnRUFBOEU7RUFDOUUsaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRSwwQkFBMEI7RUFDMUIsZ0VBQWdGO0VBQ2hGLGtCQUFrQjtFQUNsQiw2Q0FBNkM7QUFDL0M7O0FBRUE7RUFDRSw0QkFBNEI7RUFDNUIsMEJBQTBCO0VBQzFCLDRCQUE0QjtBQUM5Qjs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztFQWdCRTtBQUNGOztFQUVFLCtCQUErQjtFQUMvQiw2QkFBNkI7RUFDN0IsK0JBQStCO0FBQ2pDOztBQUVBOzs7Ozs7Ozs7Ozs7OztFQWNFO0FBQ0Y7RUFDRSwrQkFBK0I7QUFDakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogRk9OVCBMQVlFUiDigJQgc2hhcmVkIGJ5IGV2ZXJ5IHBhZ2Ugb24gdGhlIHBsYXRmb3JtLlxuICpcbiAqIFNwbGl0IG91dCBvZiBzdHlsZS5jc3MgYmVjYXVzZSBzdHlsZS5jc3MgaXMgdGhlIHJldmVhbCBERUNLIHRoZW1lIChnYWluc2Jvcm9cbiAqIGJhY2tncm91bmQsIG5hdnksIHNsaWRlIHNpemluZykgYW5kIGxlY3R1cmVzLmh0bWwgLyBrMTIuaHRtbCAvIHRlYWNoZXIuaHRtbCBtdXN0XG4gKiBub3QgaW5oZXJpdCB0aGF0LCB5ZXQgdGhleSBzdGlsbCBuZWVkIHRoZSBAZm9udC1mYWNlIGRlY2xhcmF0aW9ucyBhbmQgdGhlXG4gKiBsYW5ndWFnZSB0b2tlbnMuIExvYWRpbmcgc3R5bGUuY3NzIHRoZXJlIHRvIGdldCBhdCB0aGUgZm9udHMgd291bGQgZHJhZyB0aGUgd2hvbGVcbiAqIGRlY2sgbG9vayB3aXRoIGl0LlxuICpcbiAqIExvYWQgb3JkZXIgb24gZXZlcnkgcGFnZTogOTguY3NzIC0+IGZvbnRzLmNzcyAtPiAocGFnZSBDU1MpIC0+IHdpbjk4X292ZXJyaWRlcy5jc3NcbiAqL1xuXG4vKlxuICogRk9OVFMg4oCUIG9uZSBwYWlyaW5nIHBlciBsYW5ndWFnZSwgYmVjYXVzZSB0aGUgY291cnNlIGlzIGJpbGluZ3VhbC5cbiAqXG4gKiBNZWFzdXJlZCB3aXRoIFBST0dSRVNTL3RlbXAvc2NyaXB0L2NoZWNrX2ZvbnRfdmkucHk6IEZ1dHVyYVN0ZCBjYXJyaWVzIDAvOTAgYW5kXG4gKiBBZG9iZUdhcmFtb25kUHJvIDAvOTAgb2YgdGhlIFZpZXRuYW1lc2UgdG9uZS1tYXJrIGNvZGVwb2ludHMgKFUrMUVBMC0xRUY5KS4gTm90XG4gKiBhIHJlbmRlcmluZyBudWFuY2Ug4oCUIHRoZSBnbHlwaHMgZG8gbm90IGV4aXN0LCBzbyBldmVyeSBhY2NlbnRlZCB3b3JkIGZlbGwgYmFja1xuICogdG8gYSBzeXN0ZW0gZm9udCBtaWQtc2VudGVuY2UgYW5kIFZpZXRuYW1lc2Ugc2xpZGVzIHJlbmRlcmVkIGluIHR3byB0eXBlZmFjZXMuXG4gKlxuICogTmVpdGhlciBmb250IGlzIGRyb3BwZWQ6IHRoZXkgYXJlIHRoZSBFTkdMSVNIIHBhaXJpbmcsIHdoZXJlIHRoZXkgYXJlIHBlcmZlY3RcbiAqIGFuZCB3aGVyZSB0aGUgZGVjaydzIG9yaWdpbmFsIGxvb2sgY2FtZSBmcm9tLiBWaWV0bmFtZXNlIGdldHMgZmFjZXMgdGhhdCBjYW5cbiAqIGFjdHVhbGx5IHNwZWxsIGl0LiBXaGljaCBwYWlyIGFwcGxpZXMgZm9sbG93cyB0aGUgYGxhbmdgIGF0dHJpYnV0ZSwgc28gYSBzaW5nbGVcbiAqIHNsaWRlIGNhbiBjYXJyeSBib3RoIGxhbmd1YWdlcyBhbmQgZWFjaCBwaWNrcyB1cCBpdHMgb3duIGZhY2U6XG4gKlxuICogICBWaWV0bmFtZXNlIChkZWZhdWx0KSAgICAgICAgICBFbmdsaXNoICg6bGFuZyhlbikpXG4gKiAgIFRodXlfc2FuICAgIEJlIFZpZXRuYW0gUHJvICAgIFRodXlfc2FuX2VuICAgIEZ1dHVyYVN0ZCBCb29rL0JvbGRcbiAqICAgVGh1eV9zYW5fYiAg4oCmIEV4dHJhQm9sZCAgICAgICBUaHV5X3Nhbl9lbl9iICBGdXR1cmFTdGQgRXh0cmFCb2xkXG4gKiAgIFRodXlfc2VyaWYgIEVCIEdhcmFtb25kICAgICAgIFRodXlfc2VyaWZfZW4gIEFkb2JlR2FyYW1vbmRQcm9cbiAqXG4gKiBDYWxsIHNpdGVzIHVzZSB0aGUgLS1yLW1haW4tZm9udCAvIC0tci1oZWFkaW5nLWZvbnQgLyAtLWsxMi1oMS1mb250IHZhcmlhYmxlc1xuICogYmVsb3csIG5ldmVyIGEgZmFtaWx5IG5hbWUgZGlyZWN0bHksIHNvIG5vdGhpbmcgZG93bnN0cmVhbSBoYXMgdG8ga25vdyBhXG4gKiBsYW5ndWFnZSBzd2l0Y2ggaGFwcGVuZWQuXG4gKlxuICogVGhlIFZpZXRuYW1lc2UgZmlsZXMgYXJlIHN1YnNldHRlZCAoTGF0aW4gKyBWaWV0bmFtZXNlIG9ubHkpIGFuZCB3b2ZmMi1jb21wcmVzc2VkXG4gKiBieSBQUk9HUkVTUy90ZW1wL3NjcmlwdC9mZXRjaF92aV9mb250cy5weSDigJQgMjYyIEtCIGZvciBhbGwgc2l4IHdlaWdodHMsIGxlc3MgdGhhblxuICogdGhlIGZvdXIgQWRvYmVHYXJhbW9uZCAub3RmIGZpbGVzIGFsb25lLiBUaGUgRW5nbGlzaCAub3RmIGFyZSB0aGUgb3JpZ2luYWxzLFxuICogdW50b3VjaGVkLCBhbmQgYXJlIG9ubHkgZG93bmxvYWRlZCBvbmNlIEVuZ2xpc2ggY29udGVudCBpcyBhY3R1YWxseSBvbiBzY3JlZW4uXG4gKi9cblxuLyogLS0tIFZpZXRuYW1lc2U6IEJlIFZpZXRuYW0gUHJvICsgRUIgR2FyYW1vbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogVGh1eV9zYW47XG4gIHNyYzogdXJsKFwiLi4vcmVzL2ZvbnQvQmVWaWV0bmFtUHJvL0JlVmlldG5hbVByby1SZWd1bGFyLndvZmYyXCIpIGZvcm1hdChcIndvZmYyXCIpO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xufVxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiBUaHV5X3NhbjtcbiAgc3JjOiB1cmwoXCIuLi9yZXMvZm9udC9CZVZpZXRuYW1Qcm8vQmVWaWV0bmFtUHJvLUJvbGQud29mZjJcIikgZm9ybWF0KFwid29mZjJcIik7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiBUaHV5X3Nhbl9iO1xuICBzcmM6IHVybChcIi4uL3Jlcy9mb250L0JlVmlldG5hbVByby9CZVZpZXRuYW1Qcm8tRXh0cmFCb2xkLndvZmYyXCIpIGZvcm1hdChcIndvZmYyXCIpO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogVGh1eV9zZXJpZjtcbiAgc3JjOiB1cmwoXCIuLi9yZXMvZm9udC9FQkdhcmFtb25kL0VCR2FyYW1vbmQtUmVndWxhci53b2ZmMlwiKSBmb3JtYXQoXCJ3b2ZmMlwiKTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbn1cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogVGh1eV9zZXJpZjtcbiAgc3JjOiB1cmwoXCIuLi9yZXMvZm9udC9FQkdhcmFtb25kL0VCR2FyYW1vbmQtQm9sZC53b2ZmMlwiKSBmb3JtYXQoXCJ3b2ZmMlwiKTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6IFRodXlfc2VyaWY7XG4gIHNyYzogdXJsKFwiLi4vcmVzL2ZvbnQvRUJHYXJhbW9uZC9FQkdhcmFtb25kLUl0YWxpYy53b2ZmMlwiKSBmb3JtYXQoXCJ3b2ZmMlwiKTtcbiAgZm9udC1zdHlsZTogSXRhbGljO1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6ICdrZXJuJywgJ3N3c2gnLCAnbGlnYSc7XG59XG5cbi8qIC0tLSBFbmdsaXNoOiB0aGUgb3JpZ2luYWwgcGFpcmluZy4gaHR0cHM6Ly93d3cuY2RuZm9udHMuY29tL2Z1dHVyYS1zdGQtNC5mb250IC0tICovXG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6IFRodXlfc2FuX2VuO1xuICBzcmM6IHVybChcIi4uL3Jlcy9mb250L2Z1dHVyYS1zdGQtNC9GdXR1cmFTdGRCb29rLm90ZlwiKSBmb3JtYXQoXCJvcGVudHlwZVwiKTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbn1cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogVGh1eV9zYW5fZW47XG4gIHNyYzogdXJsKFwiLi4vcmVzL2ZvbnQvZnV0dXJhLXN0ZC00L0Z1dHVyYVN0ZEJvbGQub3RmXCIpIGZvcm1hdChcIm9wZW50eXBlXCIpO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogVGh1eV9zYW5fZW5fYjtcbiAgc3JjOiB1cmwoXCIuLi9yZXMvZm9udC9mdXR1cmEtc3RkLTQvRnV0dXJhU3RkRXh0cmFCb2xkLm90ZlwiKSBmb3JtYXQoXCJvcGVudHlwZVwiKTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6IFRodXlfc2VyaWZfZW47XG4gIHNyYzogdXJsKFwiLi4vcmVzL2ZvbnQvQWRvYmVHYXJhbW9uZC9BR2FyYW1vbmRQcm8tUmVndWxhci5vdGZcIikgZm9ybWF0KFwib3BlbnR5cGVcIik7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6IFRodXlfc2VyaWZfZW47XG4gIHNyYzogdXJsKFwiLi4vcmVzL2ZvbnQvQWRvYmVHYXJhbW9uZC9BR2FyYW1vbmRQcm8tQm9sZC5vdGZcIikgZm9ybWF0KFwib3BlbnR5cGVcIik7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiBUaHV5X3NlcmlmX2VuO1xuICBzcmM6IHVybChcIi4uL3Jlcy9mb250L0Fkb2JlR2FyYW1vbmQvQUdhcmFtb25kUHJvLUl0YWxpYy5vdGZcIikgZm9ybWF0KFwib3BlbnR5cGVcIik7XG4gIGZvbnQtc3R5bGU6IEl0YWxpYztcbiAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiAna2VybicsICdzd3NoJywgJ2xpZ2EnO1xufVxuXG46cm9vdCB7XG4gIC0tci1tYWluLWZvbnQ6ICAgIFRodXlfc2VyaWY7XG4gIC0tci1oZWFkaW5nLWZvbnQ6IFRodXlfc2FuO1xuICAtLWsxMi1oMS1mb250OiAgICBUaHV5X3Nhbl9iO1xufVxuXG4vKlxuICogRW5nbGlzaCBjb250ZW50IG9wdHMgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCBGdXR1cmEvQWRvYmVHYXJhbW9uZCBwYWlyaW5nLiBNYXJrXG4gKiBpdCB1cCB3aXRoIGEgbGFuZyBhdHRyaWJ1dGUgYW5kIG5vdGhpbmcgZWxzZSBoYXMgdG8gY2hhbmdlOlxuICpcbiAqICAgPHNlY3Rpb24gbGFuZz1cImVuXCI+ICAgICAgICBhIHdob2xlIEVuZ2xpc2ggc2xpZGVcbiAqICAgPHNwYW4gbGFuZz1cImVuXCI+4oCmPC9zcGFuPiAgIG9uZSBFbmdsaXNoIHBocmFzZSBpbnNpZGUgYSBWaWV0bmFtZXNlIHNlbnRlbmNlXG4gKlxuICogOmxhbmcoKSByYXRoZXIgdGhhbiBbbGFuZz1cImVuXCJdIHNvIFwiZW4tVVNcIi9cImVuLUdCXCIgbWF0Y2ggdG9vLiBDdXN0b20gcHJvcGVydGllc1xuICogaW5oZXJpdCwgc28gdGFnZ2luZyB0aGUgb3V0ZXJtb3N0IGVsZW1lbnQgaXMgZW5vdWdoIGZvciBldmVyeXRoaW5nIHVuZGVyIGl0LCBhbmRcbiAqIHRoaXMgc3RheXMgcGVyLWVsZW1lbnQgLS0gYSBmdXR1cmUgbGFuZ3VhZ2Ugc3dpdGNoZXIgb25seSBoYXMgdG8gc2V0IGBsYW5nYCBvblxuICogPGh0bWw+IChvciBwZXIgc2xpZGUpIGZvciB0aGUgd2hvbGUgcGxhdGZvcm0gdG8gZm9sbG93LlxuICpcbiAqIFZpZXRuYW1lc2UgaXMgdGhlIERFRkFVTFQgKGJhcmUgOnJvb3QpIG9uIHB1cnBvc2U6IGl0IGlzIHRoZSBtYWpvcml0eSBvZiB0aGVcbiAqIG1hdGVyaWFsLCBhbmQgYW4gdW50YWdnZWQgVmlldG5hbWVzZSBzbGlkZSBtdXN0IG5ldmVyIGxhbmQgb24gYSBmb250IHRoYXQgaGFzXG4gKiBubyBWaWV0bmFtZXNlIGdseXBocy4gVW50YWdnZWQgRW5nbGlzaCwgYnkgY29udHJhc3QsIG1lcmVseSByZW5kZXJzIGluIHRoZVxuICogVmlldG5hbWVzZSBwYWlyIC0tIHdoaWNoIGlzIGxlZ2libGUsIGp1c3Qgbm90IHRoZSBpbnRlbmRlZCBsb29rLlxuICovXG46cm9vdDpsYW5nKGVuKSxcbjpsYW5nKGVuKSB7XG4gIC0tci1tYWluLWZvbnQ6ICAgIFRodXlfc2VyaWZfZW47XG4gIC0tci1oZWFkaW5nLWZvbnQ6IFRodXlfc2FuX2VuO1xuICAtLWsxMi1oMS1mb250OiAgICBUaHV5X3Nhbl9lbl9iO1xufVxuXG4vKlxuICogUmVkZWZpbmluZyB0aGUgdmFyaWFibGVzIGlzIGVub3VnaCBmb3IgSEVBRElOR1MgYnV0IG5vdCBmb3IgYm9keSB0ZXh0LCBhbmQgdGhlXG4gKiBkaWZmZXJlbmNlIGlzIGVhc3kgdG8gZ2V0IHdyb25nOiByZXZlYWwncyB0aGVtZSBkZWNsYXJlc1xuICogYGZvbnQtZmFtaWx5OiB2YXIoLS1yLWhlYWRpbmctZm9udClgIG9uIHRoZSBoZWFkaW5nIGl0c2VsZiwgc28gdGhlIHZhcmlhYmxlIGlzXG4gKiByZXNvbHZlZCBpbiB0aGUgaGVhZGluZydzIG93biBjb250ZXh0IGFuZCBwaWNrcyB1cCB0aGUgOmxhbmcoKSBvdmVycmlkZS4gQm9keVxuICogdGV4dCBnZXRzIGl0cyBmYW1pbHkgZnJvbSBgLnJldmVhbCB7IGZvbnQtZmFtaWx5OiB2YXIoLS1yLW1haW4tZm9udCkgfWAgLS0gdGhlXG4gKiB2YXJpYWJsZSBpcyByZXNvbHZlZCBvbmNlLCB1cCBvbiAucmV2ZWFsLCBhbmQgYSBsYW5nLXRhZ2dlZCBkZXNjZW5kYW50IG1lcmVseVxuICogSU5IRVJJVFMgdGhlIGFscmVhZHktcmVzb2x2ZWQgZmFtaWx5LiBSZXN0YXRpbmcgdGhlIGRlY2xhcmF0aW9uIG9uIHRoZSB0YWdnZWRcbiAqIGVsZW1lbnQgaXMgd2hhdCBtYWtlcyBpdCByZS1yZXNvbHZlIHRoZXJlLlxuICpcbiAqIExvdyBzcGVjaWZpY2l0eSAoMCwwLDcpIGlzIGRlbGliZXJhdGUgYW5kIHN1ZmZpY2llbnQ6IGEgZGVjbGFyYXRpb24gT04gYW4gZWxlbWVudFxuICogYmVhdHMgYW4gaW5oZXJpdGVkIHZhbHVlIHdoYXRldmVyIGl0cyBzcGVjaWZpY2l0eSwgc28gdGhpcyBvbmx5IGhhcyB0byBvdXRyYW5rXG4gKiBvdGhlciBydWxlcyB0aGF0IHRhcmdldCB0aGlzIHNhbWUgZWxlbWVudCAtLSBhbmQgaXQgc2hvdWxkIGxvc2UgdG8gdGhvc2UuXG4gKiBIZWFkaW5ncyBhcmUgZXhjbHVkZWQgc28gaXQgY2Fubm90IGhhbmQgYW4gRW5nbGlzaCBoZWFkaW5nIHRoZSBib2R5IGZhY2UuXG4gKi9cbltsYW5nXTpub3QoaDEpOm5vdChoMik6bm90KGgzKTpub3QoaDQpOm5vdChoNSk6bm90KGg2KSB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1yLW1haW4tZm9udCk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 */