AyuRewards
Track Order
My Account
Reviews
  • ALL PRODUCTS
    • Bestsellers
      • Balaayah Black Gram Body Booster - Body Oil for Dry Skin
      • Yauvari Amplified Youth-Spring - Face Oil for Aging Skin
      • iYURA Day & Night Face Oil Duo
      • Sandalwood Rose Eye Butter
      • Manjish Glow Elixir - Night-Time Face Oil
      • Kesaradi Oil - Daily Face Oil
    • Skincare
      • FACE
      • HAIR
      • BODY
      • Relaxation Tools
      • Face Cleansers
      • Eye Care
      • Face and Body Scrubs
      • Toners and Mists
    • Educational Courses
      • About Courses
      • Shop Courses
    • iYURA
      • About iYURA
      • Shop All iYURA
      • Dig Deeper Into Each iYURA Product
      • Can't Decide? Meet our Ayurvedic Expert for a Product Recommendation!
    • Brands
    • New in Store
      • Golden Years Face Serum
      • Cerabuild
      • iYUlips: 100% Natural Ayurvedic Lip Balms
      • OptimaLIV
  • FACE
  • BODY
  • HAIR
    • Limp Hair
    • Dry Hair
    • Thinning Hair
    • Flaky Scalp
    • Shop All Hair Care
  • BESTSELLERS
    • Balaayah Black Gram Body Booster - Body Oil for Dry Skin
    • Yauvari Amplified Youth-Spring - Face Oil for Aging Skin
    • iYURA Day & Night Face Oil Duo
    • Sandalwood Rose Eye Butter
    • Manjish Glow Elixir - Night-Time Face Oil
    • Kesaradi Oil - Daily Face Oil
  • REVIEWS
  • Help Center
  • Contact Us
  • AyuRewards
  • Login
  • Refer & Get Discounts
  • Track Order
  • Help Center
  • Contact Us
  • +1(678)-498-7248 TAE WhatsApp
  • Accessibility
  • Consultation
  • United States (USD $)
The Ayurveda Experience
0
  • Help Center
  • Contact Us
  • +1(678)-498-7248
  • Accessibility
  • Consultation
  • TAE WhatsApp
The Ayurveda Experience
▼
0 items in shopping cart
  • ALL PRODUCTS
  • FACE
  • BODY
  • HAIR
  • BESTSELLERS
  • REVIEWS
  • Login / Create an account
  • Help Center
  • Contact Us
  • AyuRewards
  • Refer & Get Discounts
  • Track Order
ALL PRODUCTS
  • SHOP BY CATEGORY
  • Face Oils & Serums
  • Eye Care
  • Cleansers
  • Masks
  • Scrubs & Exfoliators
  • Toners & Mists
  • Creams & Concentrates
  • Lip Care
  • Night Routine
  • Massage Tools
  • Dietary Supplements
  • Ghee
  • Vegan
  • SHOP BY BRAND
  • iYURA | Authentic Ayurvedic Skincare | Premium & 100% Natural
  • Ajara | Ayurveda-inspired Daily Skin Care | 100% Natural
  • Ayuttva | Supplements & Foods
  • A. Modernica | Ancient Ayurvedic Ingredients + Modern Skin-Science
  • The Ayurveda Experience | Learn Ayurveda
  • SHOP BY CATEGORY
    • Face Oils & Serums
    • Eye Care
    • Cleansers
    • Masks
    • Scrubs & Exfoliators
    • Toners & Mists
    • Creams & Concentrates
    • Lip Care
    • Night Routine
    • Massage Tools
    • Dietary Supplements
    • Ghee
    • Vegan
  • SHOP BY BRAND
    • iYURA | Authentic Ayurvedic Skincare | Premium & 100% Natural
    • Ajara | Ayurveda-inspired Daily Skin Care | 100% Natural
    • Ayuttva | Supplements & Foods
    • A. Modernica | Ancient Ayurvedic Ingredients + Modern Skin-Science
    • The Ayurveda Experience | Learn Ayurveda
  • FACE
    • SHOP BY SKIN TYPE
    • Dry Skin
    • Sensitive Skin
    • Combination Skin
    • Oily Skin
    • Eye Care
    • SHOP BY CONCERN
    • Aging: Wrinkles & Fine Lines
    • Dryness & Dehydration
    • Acne & Impurities
    • Blemishes & Pigmentation
    • Crow's Feet & Eye Wrinkles
    • Dark Under-Eyes
    • Pores
    • Dullness
    • Excess Oil
    • SHOP BY CATEGORY
    • Oils and Serums
    • Eye Care
    • Cleansers
    • Masks
    • Scrubs & Exfoliators
    • Toners & Mists
    • Creams & Concentrates
    • Lip Care
    • Massage Tools
    • HELP ME CHOOSE
    • Product Recommendation
  • SHOP BY SKIN TYPE
    • Dry Skin
    • Sensitive Skin
    • Combination Skin
    • Oily Skin
    • Eye Care
  • SHOP BY CONCERN
    • Aging: Wrinkles & Fine Lines
    • Dryness & Dehydration
    • Acne & Impurities
    • Blemishes & Pigmentation
    • Crow's Feet & Eye Wrinkles
    • Dark Under-Eyes
    • Pores
    • Dullness
    • Excess Oil
  • SHOP BY CATEGORY
    • Oils and Serums
    • Eye Care
    • Cleansers
    • Masks
    • Scrubs & Exfoliators
    • Toners & Mists
    • Creams & Concentrates
    • Lip Care
    • Massage Tools
  • HELP ME CHOOSE
    • Product Recommendation
  • BODY
    • SHOP BY CATEGORY
    • Moisturizing Oils
    • Natural Deodorant Replacement
    • Foot Care
    • Massage Tools
    • SHOP BY CONCERN
    • Dryness & Dehydration
    • Dark Spots & Blemishes
    • Razor Burn
    • Sensitivity
    • HELP ME CHOOSE
    • Product Recommendation
  • SHOP BY CATEGORY
    • Moisturizing Oils
    • Natural Deodorant Replacement
    • Foot Care
    • Massage Tools
  • SHOP BY CONCERN
    • Dryness & Dehydration
    • Dark Spots & Blemishes
    • Razor Burn
    • Sensitivity
  • HELP ME CHOOSE
    • Product Recommendation
  • HAIR
    • SHOP BY HAIR TYPE
    • Dry, Rough
    • Thinning
    • Limp, Lifeless
    • No Volume
    • SHOP BY CONCERN
    • Volume
    • Hair Loss
    • Hair Thinning
    • Dandruff
    • HELP ME CHOOSE
    • Product Recommendation
  • SHOP BY HAIR TYPE
    • Dry, Rough
    • Thinning
    • Limp, Lifeless
    • No Volume
  • SHOP BY CONCERN
    • Volume
    • Hair Loss
    • Hair Thinning
    • Dandruff
  • HELP ME CHOOSE
    • Product Recommendation
  • BESTSELLERS
    • BESTSELLING FACE CARE
    • Rufolia Periorbital Eyemulsion
    • Yauvari Amplified Youth Spring
    • Manjish Glow Elixir
    • Day & Night Face Oil Duo
    • Sandalwood Rose Eye Butter
    • Kesaradi Brightening Face Oil
    • IncogniGlow Youth Burst Duo
    • BESTSELLING BODY CARE
    • Balaayah Black Gram Body Booster
    • Mehfranz Eternally Fragrant Body Massage Oil
    • Shamanri Young Energy Body Oil
    • BESTSELLING HAIR CARE
    • Keranya Pure Black Seed Potent Hair Potion
    • Ambhring Age Embrace Revitalizer and Hair Oil
    • HELP ME CHOOSE
    • Product Recommendation
  • BESTSELLING FACE CARE
    • Rufolia Periorbital Eyemulsion
    • Yauvari Amplified Youth Spring
    • Manjish Glow Elixir
    • Day & Night Face Oil Duo
    • Sandalwood Rose Eye Butter
    • Kesaradi Brightening Face Oil
    • IncogniGlow Youth Burst Duo
  • BESTSELLING BODY CARE
    • Balaayah Black Gram Body Booster
    • Mehfranz Eternally Fragrant Body Massage Oil
    • Shamanri Young Energy Body Oil
  • BESTSELLING HAIR CARE
    • Keranya Pure Black Seed Potent Hair Potion
    • Ambhring Age Embrace Revitalizer and Hair Oil
  • HELP ME CHOOSE
    • Product Recommendation
  • Skip to content
    Woman holding Balaayah Black Gram Body Booster
    Bottle beside golden droplets of oil
    Applying the oil to neck and décolletage
    The bottle among floating amber droplets of oil
    Black gram lentils falling beside a copper bowl and the bottle
    Bottle with its printed outer tube
    Balaayah product image

    Image 1 of 7

    ★★★★★★★★★★ 4.2 Stars 400,000+ Bottles Sold Worldwide

    FOR SKIN THAT’S CHANGED AFTER 40

    Turn Low-Confidence Saggy, Crepey, Dry Skin on Your Arms & Legs into Firm, Glossy, Velvet-Soft Skin

    Perimenopause and menopause bring a drop in collagen and lipids that once helped skin look firm and plump. Balaayah is a 100% natural body oil powered by Black Gram, the “Black Gold” of Ayurveda, a centuries-old ingredient prized for mature skin.

    Get Firmer-Looking Skin →
    • 30-Day Money-Back
      Guarantee
    • Free
      Shipping
    • Free
      Gift

    5 Reasons Women Over 40 Are Choosing The “Black Gold” Body Booster

    As skin starts to look less firm and feels drier with age, the look of sagging, crepey skin sets in. That’s why increasingly dry, less firm-looking skin needs richer body care. Women across 20+ countries have chosen Balaayah Black Gram Body Booster for firmer-looking, velvet-soft, intensely moisturised skin.

    01/05

    Firms the Look of Saggy, Crepey Arms and Legs

    An average face routine has multiple steps, while arms and legs get none, even though it’s the same skin, aging just the same. Balaayah ends that gap, firming the look of sagging, crepey skin so arms and thighs look tighter and smoother.

    Looks tighterOn arms and thighs, where skin can start to look less firm first.
    Looks smootherCrepey texture, visibly softened.
    Oil massaged into the upper arm and shoulder
    ★★★★★

    “[the appearance of] wrinkles and slackness on my arms and legs is gradually improving”

    I bought one recently and the feel was so good I bought two more. I haven’t even finished the first, but [the appearance of] wrinkles and slackness on my arms and legs is gradually improving. The scent is to my taste and I love it.

    Katie
    Verified
    GET THE FIRMED-LOOK →
    • 100% Natural
    • Vegan
    • Dermatologically Tested
    • No Added Synthetic Chemicals

    02/05

    Softens Rough-Feeling Knees, Elbows and Heels

    Knees, elbows and heels are the places skin dries out first and stays dry longest, mostly because they get the least attention. Balaayah, massaged into the driest, most neglected areas, leaves skin velvety-soft to the touch with a healthy-looking glow.

    Velvety-softTo the touch, on the roughest-feeling patches.
    Healthy-looking glowWhere skin looked dull and dry.
    Oil massaged into the knee
    ★★★★★

    “very effective on aging dry skin especially on feet”

    This product was very effective on aging dry skin especially on feet. I am planning to buy this oil again and I highly recommend it for all men and female.

    Jayalakshmi
    Verified

    03/05

    Smooths the Look of the Neck & Décolletage

    The neck and chest are on show in almost every neckline, yet get less care than nearly any part of the body. Balaayah smooths the look of skin texture and reduces the appearance of fine lines, promoting a radiant, glossy finish. Smoother-looking skin, where every neckline shows it.

    Less Visible Fine LinesThe ones every neckline shows.
    Radiant, glossyA finish that shows, never a greasy one.
    The neck and décolletage
    ★★★★★

    “[the appearance of] fine neck lines stopped bothering me all day and my décolletage began to glow”

    For the last few years [the appearance of] dryness and fine lines on my neck stood out... I’d tried all sorts of creams and oils... I ordered this too, expecting nothing. Massaging my neck and décolletage after the bath, it sank in smoothly, non-greasy, so pleasant, and moist till the next morning... [the appearance of] fine neck lines stopped bothering me all day and my décolletage began to glow...I can confidently enjoy fashion that shows my neck and décolletage.

    Luna
    Verified
    GET A SMOOTHER-LOOKING NECKLINE →
    • Rooted in 5,000 Years of Ayurvedic Wisdom
    • Our Best-Loved Body Oil Worldwide

    04/05

    Intense, Long-Lasting Moisturisation

    Skin loses lipids with age, and that’s why it feels dry again so quickly, no matter how often ordinary body lotion is applied. Balaayah is an ultra-rich but non-sticky oil that keeps skin moisturised long after it’s applied. Richer care for that kind of loss.

    Ultra-richRich in the palm, long after it is applied.
    Non-stickyNo film, no transfer, no fade by morning.
    Drops of the oil beside the bottle
    ★★★★★

    “provides both moisture and hydration”

    Excellent products! Been using the products for about 2 weeks, it’s dual effect that provides both moisture and hydration has been easily absorbed and leaves skin glowing, yet non sticky skin.❤️

    Christine
    Verified

    05/05

    Naturally Brewed and Never Greasy

    Most body oils are described as natural, but what really matters is how the ingredients are handled. Balaayah is inspired by a traditional Ayurvedic method, where herbs are slow-cooked into a base oil so their full character makes it into the formula. So that “natural” isn’t just a label.

    Slow-cookedHerbs cooked into the base oil, the Ayurvedic way.
    Full characterSo “natural” is a method, not a label.
    The bottle against a warm amber ground

    The Ultimate Ultra-Rich, Non-Sticky Body Oil for Aging, Dry Skin

    An ultra-rich body oil — not the usual Moroccan, castor or almond. Balaayah is Ayurvedic artistry, led by Black Gram, the “Black Gold” prized for mature skin. It transforms the look of dry, aging skin, giving a firmer look and a velvety glow. Everything ordinary body care never was.

    Balaayah Black Gram Body Booster
    Introducing
    Balaayah Black Gram
    Body Booster
    Woman holding Balaayah Black Gram Body Booster
    Balaayah product image
    Bottle beside droplets of golden oil
    Close-up of the pump
    Balaayah product image
    Applying to the leg
    Bottle held in two hands
    The bottle beside a pool of golden oil
    The bottle standing among amber droplets
    Two bottles lying side by side
    Balaayah product image
    Balaayah product image

    Image 1 of 12

    ★★★★★★★★★★4.2/5250,000+ Users Worldwide

    ★★★★★★★★★★4.2/5250,000+ Users Worldwide

    iYURA’s

    Balaayah Black Gram Body Booster

    For Firmer-Looking, Mochi-Soft Skin with a Velvety Glow · 50ml

    • Firms the look of saggy, crepey skin
    • Reduces the appearance of fine lines and wrinkles
    • 100% natural & vegan
    • Powered by Black Gram and enriched with 10 other Ayurvedic actives, crafted inspired by traditional Ayurvedic methods.
    • Absorbs quickly to a non-greasy finish

    Special offer 🎁 Free gift: Mini Yauvari Youth Spring Black Gram-powered face oil that fights visible signs of aging

    Add to cart →
    • 30-Day Money-Back
      Guarantee
    • Free
      Shipping
    • Free
      Gift
    Guaranteed safe checkout — SSL encryption, privacy protected. Visa, Mastercard, Apple Pay, American Express, PayPal.

    A rich but non-sticky body oil for dry, aging skin, powered by Black Gram and enriched with 10 other Ayurvedic actives. Absorbs quickly to a velvety finish, leaving skin intensely moisturised, softer to the touch, and firmer-looking with regular use.

    Naturally scented with warm vanilla and frankincense — no synthetic fragrance. Formulated to be used all over the body, ideally as an after-bath ritual.

    Inspired by the traditional Ayurvedic method, with a formula rooted in 5,000 years of practice.

    1. Step 1Pump out as many drops of the oil as you need for your moisturisation needs.
    2. Step 2Massage it all over the body with downward motions until the oil is absorbed.
    3. Step 3You can use it as a body mask before showering or as a moisturizer after showering.

    Fragrance profile
    Vanilla
    Fragrance ingredients
    Frankincense oil, vanilla oil
    Colour
    Light yellow
    Texture
    Rich, non-greasy, velvety finish
    Total ingredients
    11
    Ayurvedic ingredients
    10

    Hero ingredients

    • Black GramVigna mungo
    • Velvet BeanMucuna pruriens
    • NutgrassCyperus rotundus

    Full List of Ingredients

    Sesamum Indicum [Sesame] Seed Oil, Sodium Chloride [Himalayan Rock Salt], Frankincense Oil, Vanilla Oil, Vigna Mungo [Black Gram] Seed Extract, Abutilon Indicum [Country Mallow] Extract, Cyperus Rotundus [Nut Grass] Tuber Extract, Ricinus Communis [Castor] Root Extract, Mucuna Pruriens [Velvet Bean] Seed Extract, Pluchea Lanceolata [Pluchea] Leaf Extract, Anethum Graveolens [Dill] Seed Extract.

    • Dermatologically tested
    • 100% natural
    • Vegan
    • No added synthetic chemicals
    • No added parabens
    • No mineral oil
    • Ayurvedic product

    Balaayah’s Black Gram-powered companion for the face. A rich, fast-absorbing Ayurvedic face oil formulated for dry, aging skin on the face, neck and décolleté.
    • Firms the look of saggy, crepey skin
    • Softens the appearance of fine lines

    iYURAAyurveda holds some of the most effective skincare formulations ever created — but many of them can feel heavy, unfamiliar, or hard to fit into a modern routine.

    iYURA takes those classical formulations and makes them work for the way people actually use skincare today. Rich formulas that absorb without residue. Traditional Ayurvedic actives without synthetic fillers. Authentic recipes made premium in texture, scent and finish — so you get the depth of Ayurveda without the compromise.

    Nothing comes close to what this “Black Gold” phenomenon has been doing!

    ★★★★★

    “fast, obvious results”

    I’ve never used a body-care oil with such fast, obvious results. It improved the look of my skin quickly, especially [the appearance of] the orange-peel texture, and made my skin look more elastic. Excellent!

    Carol
    Verified buyer
    ★★★★★

    “started to make my skin glow and look tighter”

    My skin is basically dry espy now that I am going 70. Black gram body oil started to make my skin glow and look tighter… I love the feeling!!! I am now on my second bottle.

    Maria
    Verified buyer
    ★★★★★

    “leaves the skin looking smooth, soft as silk”

    It is easy to use, I found that I prefer to put it on slightly damp skin… Its scent is gentle and it leaves the skin looking smooth, soft as silk and exceptionally pleasant!… I love them very much and I will definitely order more.

    Aricha
    Verified buyer
    ★★★★★

    “smoother-feeling, plumper-looking, younger-looking”

    It’s absorbed easily into the skin, smells wonderful and helps my skin feel smoother and look plumper and younger. I don’t know yet if it has any long lasting positive effects. But for now, I am pleasantly surprised.

    Vardit
    Verified buyer
    ★★★★★

    “after using one bottle, I noticed significant improvement”

    I have repurchased this Balaayah Moisturizing Oil many times already. I initially bought it to target [the appearance of] cellulite on my thighs, but after using one bottle, I noticed significant improvement in its appearance. I have already repurchased several bottles and will continue to use it consistently.

    Venus
    Verified buyer
    • 4.2 Stars
    • 250,000+ Happy Customers
    • 400,000+ Bottles Sold Worldwide

    There are so many body oils out there. What’s special about this one?

    This extraordinary concoction is a masterpiece of Ayurvedic artistry, it brings the intensive powers of 10 Ayurvedic ingredients and takes the whole game of skincare several notches up.

    Black GramVigna mungo

    Prized in Ayurveda for mature skin, Black Gram helps skin look firmer, plumper and more youthful, with lasting moisture and a smoother-looking finish — the ingredient that makes Balaayah stand apart.

    Himalayan Rock Salt

    Himalayan Rock Salt is mineral-rich and known for its hydrate-moisturise-occlude ‘triple effect’ — drawing in moisture, helping skin hold onto it, and sealing it in. It softens rough-feeling patches, with the surface looking freshly smoothed.

    Velvet BeanMucuna pruriens

    True to its name — the ingredient behind Balaayah’s velvet-soft finish. Nourishing, cooling and smoothing the look of skin, Velvet Bean helps firm the look of skin and leaves it looking brightened and refreshed.

    NutgrassCyperus rotundus

    The natural brightener in Balaayah. Nutgrass helps skin tone look more even and clear, reduces the appearance of visible signs of aging, and gives a youthful glow that grows with regular use

    CastorRicinus communis root

    A traditional Ayurvedic ingredient for mature skin. Vata-balancing Castor Root helps skin look firmer and more youthful, and grounds Balaayah’s formula in Ayurveda’s long tradition of care for skin that’s changed with age.

    Sesame OilSesamum indicum

    The nourishing base of Balaayah. A light, non-clogging oil that blends seamlessly with every other active in the formula, keeping skin soft, moisturised, and gently glowing with a light Ayurvedic touch.

    Frankincense OilBoswellia carterii

    A warm, earthy aromatic with a functional role. Frankincense Oil is known to help skin look toned and add a firmer, lifted look — a natural fit for formulas made for mature skin.

    Country MallowAbutilon indicum

    Also called Bala, meaning strength, a quality this plant has long been associated with in traditional Ayurvedic body care, treasured for centuries in formulations made for aging skin. It is the herb Balaayah is named after.

    PlucheaPluchea lanceolata

    Known in Ayurveda as Rasna, classified as a Vata-pacifying herb in classical texts, Pluchea has been used in traditional body oil preparations for centuries — a supporting active in Balaayah’s blend.

    DillAnethum graveolens

    Known in Ayurveda as Shatapushpa, or “hundred-flowered,” a herb classified in classical texts for its warming, grounding qualities. Dill has been used in Ayurvedic body preparations across generations, bringing subtle depth to the formula.

    • Rooted in 5,000 Years of Ayurvedic Wisdom
    • 100% Natural
    • Vegan

    FAQs

    Made for skin that’s changed with age — drier, less firm-looking, no longer responding to lotion the way it once did. Suits all skin types, including sensitive. Not for skin that’s naturally oily and comfortable all day; this will feel richer than needed.

    Formulated specifically for mature, but works well on normal and combination skin too, especially in air conditioned environments and cooler months.

    Best massaged in after a bath or shower. Absorbs quickly and doesn’t transfer, so it can be worn under clothing during the day too.

    Results build with consistent use, with some changes noticed sooner than others.

    In 1 day★★★★★

    It’s not oily at all and absorb into the skin totally make it feel so smooth and moist the next day, love it❤️

    Raena
    Verified buyer
    In 2 weeks★★★★★

    Been using the products for about 2 weeks, it’s dual effect that provides both moisture and hydration... leaves skin glowing, yet non sticky skin.❤️

    Christine
    Verified buyer
    With continued use★★★★★

    After using one bottle, I noticed significant improvement. I have already repurchased several bottles and will continue to use it consistently.

    Venus
    Verified buyer

    No. Rich in the palm, but absorbs quickly to a velvety finish, with no oily residue, no sticky film, and no transfer to clothes or bedding.

    ★★★★★

    I like the product. It isnt oily, yet it moisturises well. The fragrance is very pleasant and my dry skin is looking good now.

    Gurcharan
    Verified buyer
    ★★★★★

    Product is as expected, not greasy and the skin absorbs it immediately. Leaving my skin soft and supple.

    Tita
    Verified buyer
    ★★★★★

    It’s not oily at all and absorb into the skin totally make it feel so smooth and moist the next day, love it❤️

    Raena
    Verified buyer

    Yes, it is vegan, and no, it is not tested on animals. Balaayah is made with no synthetic chemicals, no added parabens and no mineral oil. Neither the ingredients nor the finished product are tested on animals.

    Balaayah is backed by a 30-day money-back guarantee. If it isn’t the right fit, return it within 30 days of delivery for a full refund.

    Get a free gift and a 30-day money-back guarantee
    Shop now
    Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIEJBTEFBWUFIIMK3IFRFQ0hOSUNBTCBCRUhBVklPVVIgRU5HSU5FIMK3IFVTQSBTVE9S RQogICBPbmx5IEVESVQgMDEgYmVsb3cgaXMgbWVhbnQgdG8gYmUgZWRpdGVkLiBFdmVyeXRoaW5nIGVsc2U6IGxlYXZlIGFsb25lLgogICDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZAgKi8KKGZ1bmN0aW9uKCl7CmlmKHdpbmRvdy5fX2JhbEJvb3RlZCl7cmV0dXJuO30gd2luZG93Ll9fYmFsQm9vdGVk PXRydWU7CmZ1bmN0aW9uIGJsb2NrKG5hbWUsZm4peyB0cnl7IGZuKCk7IH1jYXRjaChlKXsgaWYod2luZG93LmNvbnNvbGUpIGNvbnNvbGUud2FybignW0Jh bGFheWFoXSAnK25hbWUrJyBmYWlsZWQ6JyxlKTsgfSB9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgRURJVCAwMSDCtyBJTUFH RSBGSUxFUyArIFNIT1BJRlkgSEFORExFUyAgKHRoZSBvbmx5IHN0b3JlLXNwZWNpZmljIHZhbHVlcykKICAgc3RvcmUgOiB0aGUgc3RvcmVmcm9udCB0aGUg cGFnZSBsaXZlcyBvbiAobm8gdHJhaWxpbmcgc2xhc2gpLgogICBjZG4gICA6IHdoZXJlIHRoZSBiYWwtKiBpbWFnZSBmaWxlcyBhcmUgaG9zdGVkLiBUaGV5 IGN1cnJlbnRseSBsaXZlIGluIHRoZQogICAgICAgICAgIFNHIHN0b3JlJ3MgRmlsZXMsIHNvIHRoaXMgaG90bGlua3MgdGhlbS4gSWYgeW91IHVwbG9hZCB0 aGVtIHRvIHRoZQogICAgICAgICAgIFVTIHN0b3JlLCBjaGFuZ2UgdG86IGh0dHBzOi8vdGhlYXl1cnZlZGFleHBlcmllbmNlLmNvbS9jZG4vc2hvcC9maWxl cy8KICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCndpbmRvdy5CQUxfQ0ZHID0gewogIHN0b3JlOiAnaHR0cHM6Ly90aGVheXVydmVk YWV4cGVyaWVuY2UuY29tJywKICBjZG46ICAgJ2h0dHBzOi8vc2cudGhlYXl1cnZlZGFleHBlcmllbmNlLmNvbS9jZG4vc2hvcC9maWxlcy8nLAoKICBpbWc6 IHsKICAgIGNhcm91c2VsXzE6J2JhbC1zZy1jYXJvdXNlbC0wMS53ZWJwJywgY2Fyb3VzZWxfMjonYmFsLXNnLWNhcm91c2VsLTAyLndlYnAnLAogICAgY2Fy b3VzZWxfMzonYmFsLXNnLWNhcm91c2VsLTAzLndlYnAnLCBjYXJvdXNlbF80OidiYWwtc2ctY2Fyb3VzZWwtMDQud2VicCcsCiAgICBjYXJvdXNlbF81Oidi YWwtc2ctY2Fyb3VzZWwtMDUud2VicCcsIGNhcm91c2VsXzY6J2JhbC1zZy1jYXJvdXNlbC0wNi53ZWJwJywKICAgIGNhcm91c2VsXzc6J2JhbC1zZy1jYXJv dXNlbC0wNy53ZWJwJywgY2Fyb3VzZWxfODonYmFsLXNnLWNhcm91c2VsLTA4LndlYnAnLAogICAgcmVhc29uXzE6J2JhbC1yZWFzb24tMS53ZWJwJywgcmVh c29uXzI6J2JhbC1yZWFzb24tMi53ZWJwJywgcmVhc29uXzM6J2JhbC1yZWFzb24tMy53ZWJwJywKICAgIHJlYXNvbl80OidiYWwtcmVhc29uLTQud2VicCcs IHJlYXNvbl81OidiYWwtcmVhc29uLTUud2VicCcsCiAgICBnYWxsZXJ5XzE6J2JhbC1zZy1jYXJvdXNlbC0wMS53ZWJwJywgZ2FsbGVyeV8yOidiYWwtc2ct Z2FsbGVyeS0xMy01MG1sLndlYnAnLAogICAgZ2FsbGVyeV8zOidiYWwtc2ctY2Fyb3VzZWwtMDIud2VicCcsIGdhbGxlcnlfNDonYmFsLXNnLWNhcm91c2Vs LTAzLndlYnAnLAogICAgZ2FsbGVyeV81OidiYWwtc2ctY2Fyb3VzZWwtMDQud2VicCcsIGdhbGxlcnlfNjonYmFsLXNnLWdhbGxlcnktMTItNTBtbC53ZWJw JywKICAgIGdhbGxlcnlfNzonYmFsLXNnLWNhcm91c2VsLTA1LndlYnAnLCBnYWxsZXJ5Xzg6J2JhbC1zZy1jYXJvdXNlbC0wNi53ZWJwJywKICAgIGdhbGxl cnlfOTonYmFsLXNnLWNhcm91c2VsLTA3LndlYnAnLCBnYWxsZXJ5XzEwOidiYWwtc2ctY2Fyb3VzZWwtMDgud2VicCcsCiAgICBnYWxsZXJ5XzExOidiYWwt c2ctZ2FsbGVyeS0wOS53ZWJwJywgZ2FsbGVyeV8xMjonYmFsLXNnLWdhbGxlcnktMTAud2VicCcsCiAgICBnYWxsZXJ5XzEzOidiYWwtc2ctZ2FsbGVyeS0x MS53ZWJwJywKICAgIGhvd3RvXzE6J2JhbC1ob3d0by0xLndlYnAnLCBob3d0b18yOidiYWwtaG93dG8tMi53ZWJwJywgaG93dG9fMzonYmFsLWhvd3RvLTMu d2VicCcsCiAgICBob3d0b180OidiYWwtaG93dG8tNC53ZWJwJywgaG93dG9fNTonYmFsLWhvd3RvLTUud2VicCcsIGhvd3RvXzY6J2JhbC1ob3d0by02Lndl YnAnLAogICAgaW5ncmVkaWVudF8xOidiYWwtaW5ncmVkaWVudC0xLWJsYWNrLWdyYW0ud2VicCcsCiAgICBpbmdyZWRpZW50XzI6J2JhbC1pbmdyZWRpZW50 LTItaGltYWxheWFuLXJvY2stc2FsdC53ZWJwJywKICAgIGluZ3JlZGllbnRfMzonYmFsLWluZ3JlZGllbnQtMy12ZWx2ZXQtYmVhbi53ZWJwJywKICAgIGlu Z3JlZGllbnRfNDonYmFsLWluZ3JlZGllbnQtNC1udXRncmFzcy53ZWJwJywKICAgIGluZ3JlZGllbnRfNTonYmFsLWluZ3JlZGllbnQtNS1jYXN0b3Iud2Vi cCcsCiAgICBpbmdyZWRpZW50XzY6J2JhbC1pbmdyZWRpZW50LTYtc2VzYW1lLW9pbC53ZWJwJywKICAgIGluZ3JlZGllbnRfNzonYmFsLWluZ3JlZGllbnQt Ny1mcmFua2luY2Vuc2Utb2lsLndlYnAnLAogICAgaW5ncmVkaWVudF84OidiYWwtaW5ncmVkaWVudC04LWNvdW50cnktbWFsbG93LndlYnAnLAogICAgaW5n cmVkaWVudF85OidiYWwtaW5ncmVkaWVudC05LXBsdWNoZWEud2VicCcsCiAgICBpbmdyZWRpZW50XzEwOidiYWwtaW5ncmVkaWVudC0xMC1kaWxsLndlYnAn LAogICAgaXl1cmFfbG9nbzonYmFsLWl5dXJhLWxvZ28ud2VicCcsIG1hZGh1YmFuaV9kaXZpZGVyOidiYWwtbWFkaHViYW5pLWRpdmlkZXIud2VicCcsCiAg ICBzZWN0aW9uX2RpdmlkZXI6J2JhbC1hcnQtcGF0dGVybi53ZWJwJywgcGFja18xOidiYWwtcGFjay0xLndlYnAnLCBwYWNrXzI6J2JhbC1wYWNrLTIud2Vi cCcsCiAgICBwYXBlcjonYmFsLXBhcGVyLndlYnAnLCBzYWZlX2NoZWNrb3V0OidiYWwtc2FmZS1jaGVja291dC53ZWJwJywgc3RpY2t5X2JvdHRsZTonYmFs LXN0aWNreS1ib3R0bGUud2VicCcsCiAgICBhcnRfc3ByYXk6J2JhbC1hcnQtc3ByYXkud2VicCcsIGFydF9ibG9vbTonYmFsLWFydC1ibG9vbS53ZWJwJywg YXJ0X3BhdHRlcm46J2JhbC1hcnQtcGF0dGVybi53ZWJwJywKICAgIGZvbnRfcmVndWxhcjonYmFsLWZvbnQtMS53b2ZmMicsIGZvbnRfaXRhbGljOidiYWwt Zm9udC0yLndvZmYyJywgZm9udF9ib2xkOidiYWwtZm9udC0zLndvZmYyJywKICAgIGJyYW5jaF90ZXh0dXJlOidiYWwtYnJhbmNoLXRleHR1cmUtMS53ZWJw JwogIH0sCgogIC8qIEVESVQgMDFCIMK3IFNIT1BJRlkgUFJPRFVDVFMgKFVTIHN0b3JlKS4gTGl2ZSBwcmljZXMvdmFyaWFudHMgYXJlIGZldGNoZWQKICAg ICBmcm9tIDxzdG9yZT4vcHJvZHVjdHMvPGhhbmRsZT4uanM7IHRoZSBmYWxsYmFjayBpcyBvbmx5IHVzZWQgaWYgdGhhdCBmYWlscy4gKi8KICBwcm9kdWN0 X29uZV9ib3R0bGU6ICAnUEVORElORy01MG1sLW9uZScsCiAgcHJvZHVjdF90d29fYm90dGxlczogJ1BFTkRJTkctNTBtbC10d28nLAogIGZhbGxiYWNrOiB7 CiAgICBjdXJyZW5jeTonVVNEJywKICAgIG9uZTp7IGlkOidQRU5ESU5HXzUwTUxfMScsIHByaWNlOjI1MDAsIGNvbXBhcmU6MCwgYXZhaWxhYmxlOnRydWUg fSwKICAgIHR3bzp7IGlkOidQRU5ESU5HXzUwTUxfMicsIHByaWNlOjQ1MDAsIGNvbXBhcmU6MCwgICAgYXZhaWxhYmxlOnRydWUgfQogIH0KfTsKCi8qIOKU gOKUgCAxIMK3IGltYWdlcywgZm9udHMsIGxpdmUgcHJvZHVjdCBkYXRhIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwpibG9jaygnYXNzZXRzJyxmdW5jdGlvbigpewogIHZhciBDPXdpbmRv dy5CQUxfQ0ZHLCBJTUc9Qy5pbWd8fHt9LCBDRE49KEMuY2RufHwnJykucmVwbGFjZSgvXC8/JC8sJy8nKTsKICBmdW5jdGlvbiB1KGZpbGUpeyByZXR1cm4g ZmlsZSA/IENETitmaWxlIDogJyc7IH0KICB3aW5kb3cuQkFMX1VSTD11OwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNiYWwgaW1nW2RhdGEtYmFs XScpLmZvckVhY2goZnVuY3Rpb24oaW0pewogICAgdmFyIGY9SU1HW2ltLmdldEF0dHJpYnV0ZSgnZGF0YS1iYWwnKV07CiAgICBpZihmKXsgaW0uc3JjPXUo Zik7IH0KICAgIGVsc2UgeyBpbS5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOyB2YXIgYm94PWltLmNsb3Nlc3QoJy5pY2FyZC1pbScpOyBpZihib3gpIGJveC5j bGFzc0xpc3QuYWRkKCduby1pbWcnKTsgaW0uc3R5bGUuZGlzcGxheT0nbm9uZSc7IH0KICB9KTsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYmFs IGltZ1tkYXRhLWJhbC1maWxlXScpLmZvckVhY2goZnVuY3Rpb24oaW0peyBpbS5zcmM9dShpbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFsLWZpbGUnKSk7IH0p OwogIHZhciB0ZXg9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZW1UZXgnKTsKICBpZih0ZXgpeyB0ZXguc2V0QXR0cmlidXRlKCdocmVmJyx1KElNRy5i cmFuY2hfdGV4dHVyZSkpOyB0ZXguc2V0QXR0cmlidXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCd4bGluazpocmVmJyx1KElNRy5icmFu Y2hfdGV4dHVyZSkpOyB9CiAgdmFyIHN0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgc3QudGV4dENvbnRlbnQ9CiAgICAiQGZvbnQtZmFj ZXtmb250LWZhbWlseTonTGFya2VuJztzcmM6dXJsKCIrdShJTUcuZm9udF9yZWd1bGFyKSsiKSBmb3JtYXQoJ3dvZmYyJyk7Zm9udC13ZWlnaHQ6NDAwO2Zv bnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwfSIrCiAgICAiQGZvbnQtZmFjZXtmb250LWZhbWlseTonTGFya2VuJztzcmM6dXJsKCIrdShJTUcu Zm9udF9pdGFsaWMpKyIpIGZvcm1hdCgnd29mZjInKTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1kaXNwbGF5OnN3YXB9IisKICAg ICJAZm9udC1mYWNle2ZvbnQtZmFtaWx5OidMYXJrZW4nO3NyYzp1cmwoIit1KElNRy5mb250X2JvbGQpKyIpIGZvcm1hdCgnd29mZjInKTtmb250LXdlaWdo dDo4MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OnN3YXB9IisKICAgICI6cm9vdHstLWltZy1zcHJheTp1cmwoIit1KElNRy5hcnRfc3ByYXkp KyIpOy0taW1nLWJsb29tOnVybCgiK3UoSU1HLmFydF9ibG9vbSkrIik7LS1pbWctcGF0dGVybjp1cmwoIit1KElNRy5hcnRfcGF0dGVybikrIik7LS1wYXBl ci1pbWc6dXJsKCIrdShJTUcucGFwZXIpKyIpfSI7CiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdCk7Cn0pOwoKYmxvY2soJ3Byb2R1Y3RzJyxmdW5j dGlvbigpewogIHZhciBDPXdpbmRvdy5CQUxfQ0ZHLCBGQj1DLmZhbGxiYWNrfHx7fTsKICB2YXIgQ1VSPSh3aW5kb3cuU2hvcGlmeSYmU2hvcGlmeS5jdXJy ZW5jeSYmU2hvcGlmeS5jdXJyZW5jeS5hY3RpdmUpfHxGQi5jdXJyZW5jeXx8J1VTRCc7CiAgZnVuY3Rpb24gbW9uZXkoY2VudHMpewogICAgdmFyIHM7CiAg ICB0cnl7IHM9bmV3IEludGwuTnVtYmVyRm9ybWF0KCdlbi1VUycse3N0eWxlOidjdXJyZW5jeScsY3VycmVuY3k6Q1VSLGN1cnJlbmN5RGlzcGxheTonbmFy cm93U3ltYm9sJ30pLmZvcm1hdChjZW50cy8xMDApOyB9CiAgICBjYXRjaChlKXsgcz0nJCcrKGNlbnRzLzEwMCkudG9GaXhlZCgyKTsgfQogICAgcmV0dXJu IENVUj09PSdVU0QnID8gcyA6IHMrJyAnK0NVUjsKICB9CiAgZnVuY3Rpb24gcGlja1ZhcmlhbnQocCl7CiAgICBpZighcHx8IXAudmFyaWFudHN8fCFwLnZh cmlhbnRzLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcC52YXJpYW50cy5maWx0ZXIoZnVuY3Rpb24odil7cmV0dXJuIHYuYXZhaWxhYmxlfSlb MF18fHAudmFyaWFudHNbMF07CiAgfQogIGZ1bmN0aW9uIG5vcm0ocCxmYil7CiAgICB2YXIgdj1waWNrVmFyaWFudChwKTsKICAgIGlmKCF2KSByZXR1cm4g e2lkOmZiLmlkLHByaWNlOmZiLnByaWNlLGNvbXBhcmU6ZmIuY29tcGFyZXx8MCxhdmFpbGFibGU6ZmIuYXZhaWxhYmxlIT09ZmFsc2V9OwogICAgcmV0dXJu IHtpZDp2LmlkLHByaWNlOnYucHJpY2UsY29tcGFyZTp2LmNvbXBhcmVfYXRfcHJpY2V8fDAsYXZhaWxhYmxlOiEhdi5hdmFpbGFibGV9OwogIH0KICBmdW5j dGlvbiBzYW1lU3RvcmUoKXsKICAgIHRyeXsgcmV0dXJuIGxvY2F0aW9uLmhvc3QucmVwbGFjZSgvXnd3d1wuLywnJyk9PT0oQy5zdG9yZXx8JycpLnJlcGxh Y2UoL15odHRwcz86XC9cLy8sJycpLnJlcGxhY2UoL153d3dcLi8sJycpOyB9Y2F0Y2goZSl7IHJldHVybiBmYWxzZTsgfQogIH0KICBmdW5jdGlvbiBmZXRj aFAoaGFuZGxlKXsKICAgIHZhciBiYXNlID0gc2FtZVN0b3JlKCkgPyAnJyA6IChDLnN0b3JlfHwnJyk7CiAgICByZXR1cm4gZmV0Y2goYmFzZSsnL3Byb2R1 Y3RzLycraGFuZGxlKycuanMnLHtjcmVkZW50aWFsczonc2FtZS1vcmlnaW4nfSkKICAgICAgLnRoZW4oZnVuY3Rpb24ocil7IGlmKCFyLm9rKSB0aHJvdyAw OyByZXR1cm4gci5qc29uKCk7IH0pLmNhdGNoKGZ1bmN0aW9uKCl7IHJldHVybiBudWxsOyB9KTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyKG9uZSx0d28pewog ICAgdmFyIG9uZUhhc0Rpc2M9b25lLmNvbXBhcmU+b25lLnByaWNlLCBvbmVTYXZlPW9uZUhhc0Rpc2M/b25lLmNvbXBhcmUtb25lLnByaWNlOjAsCiAgICAg ICAgb25lUGN0PW9uZUhhc0Rpc2M/TWF0aC5yb3VuZChvbmVTYXZlKjEwMC9vbmUuY29tcGFyZSk6MDsKICAgIHZhciByZWY9dHdvLmNvbXBhcmU7IGlmKHJl Zjw9dHdvLnByaWNlKSByZWY9b25lLnByaWNlKjI7CiAgICB2YXIgdHdvU2F2ZT1yZWYtdHdvLnByaWNlLCB0d29QY3Q9TWF0aC5yb3VuZCh0d29TYXZlKjEw MC9yZWYpOwogICAgdmFyIGIxPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYWwgLmJhbC1wYWNrW2RhdGEtcGFjaz0ib25lIl0nKSwKICAgICAgICBiMj1k b2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFsIC5iYWwtcGFja1tkYXRhLXBhY2s9InR3byJdJyk7CiAgICBpZihiMSl7CiAgICAgIGIxLnF1ZXJ5U2VsZWN0 b3IoJy5iYWwtcGFjay1ibGsnKS5pbm5lckhUTUw9CiAgICAgICAgKG9uZUhhc0Rpc2M/JzxzcGFuIGNsYXNzPSJiYWwtcGFjay1zYXZlIj48Yj5TYXZlICcr b25lUGN0KyclPC9iPicrbW9uZXkob25lU2F2ZSkrJyBvZmY8L3NwYW4+PHNwYW4gY2xhc3M9ImJhbC1wYWNrLXdhcyI+Jyttb25leShvbmUuY29tcGFyZSkr Jzwvc3Bhbj4nOicnKSsKICAgICAgICAnPHNwYW4gY2xhc3M9ImJhbC1wYWNrLXAiPicrbW9uZXkob25lLnByaWNlKSsnPC9zcGFuPic7CiAgICAgIGIxLnNl dEF0dHJpYnV0ZSgnZGF0YS12aWQnLG9uZS5pZCk7IGIxLnNldEF0dHJpYnV0ZSgnZGF0YS1hdmFpbGFibGUnLFN0cmluZyhvbmUuYXZhaWxhYmxlKSk7CiAg ICAgIGlmKCFvbmUuYXZhaWxhYmxlKXsgYjEuZGlzYWJsZWQ9dHJ1ZTsgYjEuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywndHJ1ZScpOyB9CiAgICB9 CiAgICBpZihiMil7CiAgICAgIGIyLnF1ZXJ5U2VsZWN0b3IoJy5iYWwtcGFjay1ibGsnKS5pbm5lckhUTUw9CiAgICAgICAgJzxzcGFuIGNsYXNzPSJiYWwt cGFjay1zYXZlIj48Yj5TYXZlICcrdHdvUGN0KyclPC9iPicrbW9uZXkodHdvU2F2ZSkrJyBvZmY8L3NwYW4+PHNwYW4gY2xhc3M9ImJhbC1wYWNrLXdhcyI+ Jyttb25leShyZWYpKyc8L3NwYW4+JysKICAgICAgICAnPHNwYW4gY2xhc3M9ImJhbC1wYWNrLXAiPicrbW9uZXkodHdvLnByaWNlKSsnPC9zcGFuPic7CiAg ICAgIGIyLnNldEF0dHJpYnV0ZSgnZGF0YS12aWQnLHR3by5pZCk7IGIyLnNldEF0dHJpYnV0ZSgnZGF0YS1hdmFpbGFibGUnLFN0cmluZyh0d28uYXZhaWxh YmxlKSk7CiAgICAgIGlmKCF0d28uYXZhaWxhYmxlKXsgYjIuZGlzYWJsZWQ9dHJ1ZTsgYjIuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywndHJ1ZScp OyB9CiAgICB9CiAgICBpZihiMSYmYjIpeyBiMi5zZXRBdHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsU3RyaW5nKHR3by5hdmFpbGFibGUpKTsgYjEuc2V0QXR0 cmlidXRlKCdhcmlhLWNoZWNrZWQnLFN0cmluZyghdHdvLmF2YWlsYWJsZSkpOyB9CiAgICB2YXIgY3RhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvYi1j dGEnKTsKICAgIGlmKGN0YSkgY3RhLnNldEF0dHJpYnV0ZSgnaHJlZicsJy9jYXJ0L2FkZD9pZD0nKyh0d28uYXZhaWxhYmxlP3R3by5pZDpvbmUuaWQpKycm cXVhbnRpdHk9MScpOwogICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2JhbDpwcm9kdWN0cycpKTsKICB9CiAgcmVuZGVyKG5v cm0obnVsbCxGQi5vbmV8fHt9KSxub3JtKG51bGwsRkIudHdvfHx7fSkpOwogIFByb21pc2UuYWxsKFtmZXRjaFAoQy5wcm9kdWN0X29uZV9ib3R0bGUpLGZl dGNoUChDLnByb2R1Y3RfdHdvX2JvdHRsZXMpXSkudGhlbihmdW5jdGlvbihyKXsKICAgIGlmKHJbMF18fHJbMV0pIHJlbmRlcihub3JtKHJbMF0sRkIub25l fHx7fSksbm9ybShyWzFdLEZCLnR3b3x8e30pKTsKICB9KTsKfSk7CgovKiDilIDilIAgMiDCtyB1bmRvIFppcGlmeSB3cmFwcGVyIG92ZXJmbG93L3RyYW5z Zm9ybSAobmVlZGVkIGZvciBzdGlja3kgKyBwaW5uZWQgYm90dGxlKSDilIDilIAgKi8KYmxvY2soJ2hvc3QnLGZ1bmN0aW9uKCl7CiAgdmFyIHJvb3Q9ZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhbCcpOyBpZighcm9vdCkgcmV0dXJuOwogIGZ1bmN0aW9uIGNsZWFyKCl7CiAgICB2YXIgbj1yb290LnBhcmVudE5v ZGUsIGhvcHM9MDsKICAgIHdoaWxlKG4gJiYgbi5ub2RlVHlwZT09PTEgJiYgbiE9PWRvY3VtZW50LmJvZHkgJiYgaG9wcysrPDI0KXsKICAgICAgdmFyIHM9 Z2V0Q29tcHV0ZWRTdHlsZShuKTsKICAgICAgaWYocy5vdmVyZmxvdyE9PSd2aXNpYmxlJ3x8cy5vdmVyZmxvd1ghPT0ndmlzaWJsZSd8fHMub3ZlcmZsb3dZ IT09J3Zpc2libGUnKXsgbi5zdHlsZS5zZXRQcm9wZXJ0eSgnb3ZlcmZsb3cnLCd2aXNpYmxlJywnaW1wb3J0YW50Jyk7IH0KICAgICAgaWYocy50cmFuc2Zv cm0hPT0nbm9uZScpIG4uc3R5bGUuc2V0UHJvcGVydHkoJ3RyYW5zZm9ybScsJ25vbmUnLCdpbXBvcnRhbnQnKTsKICAgICAgaWYocy5maWx0ZXIhPT0nbm9u ZScpIG4uc3R5bGUuc2V0UHJvcGVydHkoJ2ZpbHRlcicsJ25vbmUnLCdpbXBvcnRhbnQnKTsKICAgICAgaWYocy5wZXJzcGVjdGl2ZSE9PSdub25lJykgbi5z dHlsZS5zZXRQcm9wZXJ0eSgncGVyc3BlY3RpdmUnLCdub25lJywnaW1wb3J0YW50Jyk7CiAgICAgIGlmKHMuY29udGFpbiE9PSdub25lJykgbi5zdHlsZS5z ZXRQcm9wZXJ0eSgnY29udGFpbicsJ25vbmUnLCdpbXBvcnRhbnQnKTsKICAgICAgaWYocy53aWxsQ2hhbmdlIT09J2F1dG8nKSBuLnN0eWxlLnNldFByb3Bl cnR5KCd3aWxsLWNoYW5nZScsJ2F1dG8nLCdpbXBvcnRhbnQnKTsKICAgICAgbi5jbGFzc0xpc3QuYWRkKCdiYWwtaG9zdCcpOwogICAgICBuPW4ucGFyZW50 Tm9kZTsKICAgIH0KICB9CiAgY2xlYXIoKTsgYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsY2xlYXIpOyBzZXRUaW1lb3V0KGNsZWFyLDEyMDApOwp9KTsKCnZh ciBSTT1tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7CgovKiDilIDilIAgMyDCtyBIMSB3b3JkIHJldmVh bCArIHNjcm9sbCByZXZlYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwpibG9jaygncmV2ZWFscycsZnVuY3Rpb24oKXsKICB2YXIgaDE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2gx Jyk7CiAgaWYoaDEmJiFSTSl7KGZ1bmN0aW9uIHdhbGsobil7CiAgICBbXS5zbGljZS5jYWxsKG4uY2hpbGROb2RlcykuZm9yRWFjaChmdW5jdGlvbihjKXsK ICAgICAgaWYoYy5ub2RlVHlwZT09PTMpewogICAgICAgIHZhciBmPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjLnRleHRD b250ZW50LnNwbGl0KC8oXHMrKS8pLmZvckVhY2goZnVuY3Rpb24odCl7CiAgICAgICAgICBpZighdClyZXR1cm47CiAgICAgICAgICBpZigvXlxzKyQvLnRl c3QodCkpe2YuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkpO3JldHVybn0KICAgICAgICAgIHZhciBzPWRvY3VtZW50LmNyZWF0ZUVs ZW1lbnQoJ3NwYW4nKTtzLmNsYXNzTmFtZT0ndyc7CiAgICAgICAgICB2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7aS50ZXh0Q29udGVudD10 O3MuYXBwZW5kQ2hpbGQoaSk7Zi5hcHBlbmRDaGlsZChzKTsKICAgICAgICB9KTsKICAgICAgICBjLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGYsYyk7CiAg ICAgIH0gZWxzZSBpZihjLm5vZGVUeXBlPT09MSkgd2FsayhjKTsKICAgIH0pOwogIH0pKGgxKTsKICBoMS5xdWVyeVNlbGVjdG9yQWxsKCcudz5pJykuZm9y RWFjaChmdW5jdGlvbihlbCxpKXtlbC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9KDAuMDUraSowLjAzMikrJ3MnfSk7fQogIGlmKCdJbnRlcnNlY3Rpb25PYnNl cnZlcicgaW4gd2luZG93KXsKICAgIHZhciBpbz1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZXMpe2VzLmZvckVhY2goZnVuY3Rpb24oZSl7 CiAgICAgIGlmKGUuaXNJbnRlcnNlY3Rpbmcpe2UudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2luJyk7aW8udW5vYnNlcnZlKGUudGFyZ2V0KX19KX0sCiAgICAg IHt0aHJlc2hvbGQ6LjEyLHJvb3RNYXJnaW46JzBweCAwcHggLTYlIDBweCd9KTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ydiwubWFzaywu ZGl2aWRlciwjaDEnKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKXtpby5vYnNlcnZlKGVsKX0pOwogIH1lbHNle2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5y diwubWFzaywuZGl2aWRlciwjaDEnKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKXtlbC5jbGFzc0xpc3QuYWRkKCdpbicpfSl9Cn0pOwoKLyog4pSA4pSAIDQgwrcg Y2Fyb3VzZWxzOiBvbmUgc2xpZGUgcGVyIHN3aXBlLCBpbmZpbml0ZSBsb29wLCBhdXRvcGxheSDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KZnVuY3Rp b24gc2xpZGVyKGtleSx0aHVtYnMpewogIHZhciB0cmFjaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyLScra2V5KTsgaWYoIXRyYWNrKXJldHVybjsK ICB2YXIgdmlldz10cmFjay5wYXJlbnRFbGVtZW50LAogICAgICBob3N0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRvdHM9Iicra2V5KyciXScp LAogICAgICBsaXZlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXItJytrZXkrJy1saXZlJyksCiAgICAgIHJlYWw9W10uc2xpY2UuY2FsbCh0cmFjay5j aGlsZHJlbiksIG49cmVhbC5sZW5ndGgsIGJ0bnM9W107CiAgaWYobjwyKXJldHVybjsKICB2YXIgaGVhZD1yZWFsWzBdLmNsb25lTm9kZSh0cnVlKSwgdGFp bD1yZWFsW24tMV0uY2xvbmVOb2RlKHRydWUpOwogIGhlYWQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTsgdGFpbC5zZXRBdHRyaWJ1dGUo J2FyaWEtaGlkZGVuJywndHJ1ZScpOwogIHRyYWNrLmFwcGVuZENoaWxkKGhlYWQpOyB0cmFjay5pbnNlcnRCZWZvcmUodGFpbCxyZWFsWzBdKTsKICB2YXIg YWxsPVtdLnNsaWNlLmNhbGwodHJhY2suY2hpbGRyZW4pOwogIHZhciBpPTEsIHc9MCwgYW5pbWF0aW5nPWZhbHNlLCBhdXRvVGltZXI9bnVsbCwgYXV0b1N0 b3BwZWQ9ZmFsc2UsIEFVVE9fTVM9NDIwMDsKICBmdW5jdGlvbiBtZWFzdXJlKCl7IHc9dmlldy5jbGllbnRXaWR0aDsgYWxsLmZvckVhY2goZnVuY3Rpb24o cyl7cy5zdHlsZS53aWR0aD13KydweCd9KTsgcGFpbnQoZmFsc2UpIH0KICBmdW5jdGlvbiBwYWludChhbmltKXsKICAgIGFuaW1hdGluZz0hIWFuaW0gJiYg IVJNOwogICAgdHJhY2suc3R5bGUudHJhbnNpdGlvbj1hbmltYXRpbmc/J3RyYW5zZm9ybSAuMjZzIGN1YmljLWJlemllciguMjIsLjksLjI0LDEpJzonbm9u ZSc7CiAgICB0cmFjay5zdHlsZS50cmFuc2Zvcm09J3RyYW5zbGF0ZTNkKCcrKC1pKncpKydweCwwLDApJzsKICB9CiAgZnVuY3Rpb24gbG9naWNhbCgpeyBy ZXR1cm4gKGktMStuKSVuIH0KICBmdW5jdGlvbiBzeW5jKCl7CiAgICB2YXIgTD1sb2dpY2FsKCk7CiAgICBidG5zLmZvckVhY2goZnVuY3Rpb24oYixrKXti LnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JyxTdHJpbmcoaz09PUwpKX0pOwogICAgaWYobGl2ZSlsaXZlLnRleHRDb250ZW50PSdJbWFnZSAnKyhMKzEp Kycgb2YgJytuOwogIH0KICBmdW5jdGlvbiBzZXR0bGUoKXsgaWYoIWFuaW1hdGluZykgcmV0dXJuOyBhbmltYXRpbmc9ZmFsc2U7IGlmKGk9PT0wKXsgaT1u IH0gZWxzZSBpZihpPT09bisxKXsgaT0xIH0gcGFpbnQoZmFsc2UpOyB2b2lkIHRyYWNrLm9mZnNldFdpZHRoOyB9CiAgZnVuY3Rpb24gc3RvcEF1dG8oKXth dXRvU3RvcHBlZD10cnVlO2lmKGF1dG9UaW1lcil7Y2xlYXJJbnRlcnZhbChhdXRvVGltZXIpO2F1dG9UaW1lcj1udWxsfX0KICBmdW5jdGlvbiBzdGFydEF1 dG8oKXsgaWYoUk18fGF1dG9TdG9wcGVkfHxuPDJ8fGF1dG9UaW1lcilyZXR1cm47IGF1dG9UaW1lcj1zZXRJbnRlcnZhbChmdW5jdGlvbigpeyBpZihkb2N1 bWVudC5oaWRkZW4pcmV0dXJuOyBnbygxLGZhbHNlKTsgfSxBVVRPX01TKTsgfQogIGZ1bmN0aW9uIHBhdXNlQXV0bygpe2lmKGF1dG9UaW1lcil7Y2xlYXJJ bnRlcnZhbChhdXRvVGltZXIpO2F1dG9UaW1lcj1udWxsfX0KICBmdW5jdGlvbiB3YXRjaEF1dG8oKXsKICAgIGlmKFJNfHxhdXRvU3RvcHBlZHx8bjwyKXJl dHVybjsKICAgIGlmKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KXsKICAgICAgdmFyIGFpbz1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVu Y3Rpb24oZXMpe2VzLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoYXV0b1N0b3BwZWQpe2Fpby5kaXNjb25uZWN0KCk7cGF1c2VBdXRvKCk7cmV0 dXJufQogICAgICAgIGlmKGUuaXNJbnRlcnNlY3Rpbmcpc3RhcnRBdXRvKCk7ZWxzZSBwYXVzZUF1dG8oKTsKICAgICAgfSl9LHtyb290Om51bGwscm9vdE1h cmdpbjonMHB4IDBweCAtMzAlIDBweCcsdGhyZXNob2xkOjB9KTsKICAgICAgYWlvLm9ic2VydmUodmlldyk7CiAgICB9ZWxzZXtzdGFydEF1dG8oKX0KICB9 CiAgZnVuY3Rpb24gZ28oZGlyLG1hbnVhbCl7IGlmKG1hbnVhbClzdG9wQXV0bygpOyBzZXR0bGUoKTsgaSs9ZGlyOyBwYWludCh0cnVlKTsgc3luYygpIH0K ICBmdW5jdGlvbiBqdW1wKEwsbWFudWFsKXsgaWYobWFudWFsKXN0b3BBdXRvKCk7IHNldHRsZSgpOyBpPUwrMTsgcGFpbnQodHJ1ZSk7IHN5bmMoKSB9CiAg dHJhY2suYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsZnVuY3Rpb24oZSl7CiAgICBpZihlLnByb3BlcnR5TmFtZSE9PSd0cmFuc2Zvcm0nKXJl dHVybjsKICAgIGFuaW1hdGluZz1mYWxzZTsKICAgIGlmKGk9PT0wKXsgaT1uOyBwYWludChmYWxzZSkgfSBlbHNlIGlmKGk9PT1uKzEpeyBpPTE7IHBhaW50 KGZhbHNlKSB9CiAgfSk7CiAgaWYoaG9zdCl7IGZvcih2YXIgaz0wO2s8bjtrKyspewogICAgdmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9u Jyk7IGIudHlwZT0nYnV0dG9uJzsKICAgIGIuc2V0QXR0cmlidXRlKCdyb2xlJywndGFiJyk7IGIuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLGs9PT0w Pyd0cnVlJzonZmFsc2UnKTsKICAgIGIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywnSW1hZ2UgJysoaysxKSsnIG9mICcrbik7CiAgICBpZih0aHVtYnMp eyB2YXIgaW09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7IGltLnNyYz1yZWFsW2tdLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpLmdldEF0dHJpYnV0ZSgn c3JjJyl8fCcnOyBpbS5hbHQ9Jyc7IGIuYXBwZW5kQ2hpbGQoaW0pIH0KICAgIChmdW5jdGlvbih0KXsgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVu Y3Rpb24oKXsganVtcCh0LHRydWUpIH0pIH0pKGspOwogICAgaG9zdC5hcHBlbmRDaGlsZChiKTsgYnRucy5wdXNoKGIpOwogIH19CiAgZG9jdW1lbnQucXVl cnlTZWxlY3RvckFsbCgnW2RhdGEtY2FyPSInK2tleSsnIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKG5hdil7CiAgICBuYXYuYWRkRXZlbnRMaXN0ZW5lcignY2xp Y2snLGZ1bmN0aW9uKGUpeyBlLnByZXZlbnREZWZhdWx0KCk7IGdvKHBhcnNlSW50KG5hdi5kYXRhc2V0LmRpciwxMCksdHJ1ZSkgfSl9KTsKICB0cmFjay5h ZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsKICAgIGlmKGUua2V5PT09J0Fycm93UmlnaHQnKXtlLnByZXZlbnREZWZhdWx0KCk7Z28o MSx0cnVlKX0KICAgIGlmKGUua2V5PT09J0Fycm93TGVmdCcpe2UucHJldmVudERlZmF1bHQoKTtnbygtMSx0cnVlKX19KTsKICB2YXIgc3g9MCxzeT0wLGR4 PTAsZG93bj1mYWxzZSxkZWNpZGVkPWZhbHNlLGhvcml6PWZhbHNlOwogIHZpZXcuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLGZ1bmN0aW9uKGUp ewogICAgaWYoZS50YXJnZXQuY2xvc2VzdCgnLmNhci1uYXYsLmNhci1kb3RzJykpcmV0dXJuOwogICAgaWYoYW5pbWF0aW5nKXJldHVybjsKICAgIHN0b3BB dXRvKCk7IGRvd249dHJ1ZTtkZWNpZGVkPWZhbHNlO2hvcml6PWZhbHNlO2R4PTA7c3g9ZS5jbGllbnRYO3N5PWUuY2xpZW50WTsKICB9KTsKICB2aWV3LmFk ZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJyxmdW5jdGlvbihlKXsKICAgIGlmKCFkb3duKXJldHVybjsKICAgIHZhciBteD1lLmNsaWVudFgtc3gsbXk9 ZS5jbGllbnRZLXN5OwogICAgaWYoIWRlY2lkZWQpewogICAgICBpZihNYXRoLmFicyhteCk8NiYmTWF0aC5hYnMobXkpPDYpcmV0dXJuOwogICAgICBkZWNp ZGVkPXRydWU7aG9yaXo9TWF0aC5hYnMobXgpPk1hdGguYWJzKG15KTsKICAgICAgaWYoaG9yaXope3RyYWNrLnN0eWxlLnRyYW5zaXRpb249J25vbmUnO3Ry eXt2aWV3LnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKX1jYXRjaCh4KXt9fQogICAgfQogICAgaWYoIWhvcml6KXJldHVybjsKICAgIGUucHJldmVu dERlZmF1bHQoKTsgZHg9bXg7CiAgICB0cmFjay5zdHlsZS50cmFuc2Zvcm09J3RyYW5zbGF0ZTNkKCcrKC1pKncrZHgpKydweCwwLDApJzsKICB9KTsKICBm dW5jdGlvbiByZWxlYXNlKCl7CiAgICBpZighZG93bilyZXR1cm47IGRvd249ZmFsc2U7IGlmKCFob3JpeilyZXR1cm47CiAgICB2YXIgVEg9TWF0aC5taW4o NjQsdyowLjE0KTsKICAgIGlmKGR4PD0tVEgpIGdvKDEsdHJ1ZSk7IGVsc2UgaWYoZHg+PVRIKSBnbygtMSx0cnVlKTsgZWxzZSBwYWludCh0cnVlKTsKICAg IGR4PTA7CiAgfQogIHZpZXcuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJyxyZWxlYXNlKTsKICB2aWV3LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJj YW5jZWwnLGZ1bmN0aW9uKCl7ZG93bj1mYWxzZX0pOwogIHZpZXcuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJyxyZWxlYXNlKTsKICBtZWFzdXJl KCk7IGFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsbWVhc3VyZSk7IHNldFRpbWVvdXQobWVhc3VyZSwzMDApOyBhZGRFdmVudExpc3RlbmVyKCdsb2FkJyxt ZWFzdXJlKTsKICB3YXRjaEF1dG8oKTsKfQpibG9jaygnY2Fyb3VzZWwtaGVybycsZnVuY3Rpb24oKXsgc2xpZGVyKCdoZXJvJyxmYWxzZSk7IH0pOwpibG9j aygnY2Fyb3VzZWwtb2InLGZ1bmN0aW9uKCl7IHNsaWRlcignb2InLHRydWUpOyB9KTsKCi8qIOKUgOKUgCA1IMK3IHBhY2sgc2VsZWN0aW9uICh0aGUgInJh ZGlvIGJ1dHRvbnMiKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIAgKi8KYmxvY2soJ3BhY2tzJyxmdW5jdGlvbigpewogIHZhciBwYWNrcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYmFsIC5iYWwtcGFjaycp LCBvYkN0YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb2ItY3RhJyk7CiAgZnVuY3Rpb24gcGFja0F2YWlsYWJsZShwKXsgcmV0dXJuIHAgJiYgIXAuZGlz YWJsZWQgJiYgcC5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSE9PSd0cnVlJyAmJiBwLmdldEF0dHJpYnV0ZSgnZGF0YS1hdmFpbGFibGUnKSE9PSdm YWxzZSc7IH0KICBmdW5jdGlvbiBsYWJlbEZvcihwKXsgcmV0dXJuIHAuZ2V0QXR0cmlidXRlKCdkYXRhLWN0YScpfHwnQWRkIHRvIGNhcnQnIH0KICBmdW5j dGlvbiBzZWxlY3RQYWNrKHApewogICAgaWYoIXBhY2tBdmFpbGFibGUocCkpIHJldHVybjsKICAgIHBhY2tzLmZvckVhY2goZnVuY3Rpb24oeCl7eC5zZXRB dHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsJ2ZhbHNlJyl9KTsKICAgIHAuc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCd0cnVlJyk7CiAgICBpZihvYkN0 YSAmJiBvYkN0YS5nZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScpIT09J3RydWUnKXsKICAgICAgb2JDdGEuZmlyc3RDaGlsZC50ZXh0Q29udGVudD1sYWJlbEZv cihwKSsnICc7CiAgICAgIG9iQ3RhLnNldEF0dHJpYnV0ZSgnaHJlZicsJy9jYXJ0L2FkZD9pZD0nK3AuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZCcpKycmcXVh bnRpdHk9MScpOwogICAgfQogIH0KICBwYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHApeyBwLnR5cGU9J2J1dHRvbic7IHAuYWRkRXZlbnRMaXN0ZW5lcignY2xp Y2snLGZ1bmN0aW9uKGUpeyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGVjdFBhY2socCk7IH0pOyB9KTsKICBmdW5jdGlvbiBpbml0U2VsKCl7CiAgICBpZigh b2JDdGEpIHJldHVybjsKICAgIHZhciBzZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JhbCAuYmFsLXBhY2tbYXJpYS1jaGVja2VkPSJ0cnVlIl0nKTsK ICAgIGlmKCFwYWNrQXZhaWxhYmxlKHNlbCkpIHNlbD1bXS5zbGljZS5jYWxsKHBhY2tzKS5maWx0ZXIocGFja0F2YWlsYWJsZSlbMF07CiAgICBpZihzZWwp IHNlbGVjdFBhY2soc2VsKTsKICB9CiAgaW5pdFNlbCgpOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JhbDpwcm9kdWN0cycsaW5pdFNlbCk7Cn0p OwoKLyog4pSA4pSAIDYgwrcgQ1RBIHJpcHBsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIAgKi8KYmxvY2soJ3JpcHBsZScsZnVuY3Rpb24oKXsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYmFsIC5jdGEnKS5mb3JFYWNoKGZ1 bmN0aW9uKGJ0bil7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLGZ1bmN0aW9uKGUpewogICAgICBpZihSTSlyZXR1cm47CiAgICAg IHZhciByPWJ0bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPU1hdGgubWF4KHIud2lkdGgsci5oZWlnaHQpKjIuMTsKICAgICAgdmFyIHM9ZG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgnc3BhbicpO3MuY2xhc3NOYW1lPSdyaXAnOwogICAgICBzLnN0eWxlLndpZHRoPXMuc3R5bGUuaGVpZ2h0PWQrJ3B4JzsKICAgICAg cy5zdHlsZS5sZWZ0PShlLmNsaWVudFgtci5sZWZ0LWQvMikrJ3B4Jzsgcy5zdHlsZS50b3A9KGUuY2xpZW50WS1yLnRvcC1kLzIpKydweCc7CiAgICAgIGJ0 bi5hcHBlbmRDaGlsZChzKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5yZW1vdmUoKX0sNjQwKTsKICAgIH0pOwogIH0pOwp9KTsKCi8qIOKUgOKUgCA3IMK3 IGFjY29yZGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmJsb2Nr KCdhY2NvcmRpb25zJyxmdW5jdGlvbigpewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNiYWwgLmFjYy1iJykuZm9yRWFjaChmdW5jdGlvbihiLGkp ewogICAgdmFyIHA9Yi5wYXJlbnROb2RlLm5leHRFbGVtZW50U2libGluZyxpZD0nYWNjcC0nK2k7CiAgICBwLmlkPWlkO2Iuc2V0QXR0cmlidXRlKCdhcmlh LWNvbnRyb2xzJyxpZCk7cC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdyZWdpb24nKTsgYi50eXBlPSdidXR0b24nOwogICAgYi5hZGRFdmVudExpc3RlbmVyKCdj bGljaycsZnVuY3Rpb24oZSl7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgdmFyIG9wZW49Yi5nZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQn KT09PSd0cnVlJzsKICAgICAgYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLFN0cmluZyghb3BlbikpOwogICAgICBwLnN0eWxlLmhlaWdodD1vcGVu PycwcHgnOnAuZmlyc3RFbGVtZW50Q2hpbGQub2Zmc2V0SGVpZ2h0KydweCc7CiAgICB9KTsKICB9KTsKICBhZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLGZ1 bmN0aW9uKCl7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYmFsIC5hY2MtYlthcmlhLWV4cGFuZGVkPSJ0cnVlIl0nKS5mb3JFYWNoKGZ1bmN0 aW9uKGIpewogICAgICB2YXIgcD1iLnBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nO3Auc3R5bGUuaGVpZ2h0PXAuZmlyc3RFbGVtZW50Q2hpbGQub2Zm c2V0SGVpZ2h0KydweCd9KX0pOwp9KTsKCi8qIOKUgOKUgCA4IMK3IHN0aWNreSBiYXI6IHNob3dzIG9ubHkgYWZ0ZXIgdGhlIG9yZGVyIGJveCDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KYmxvY2soJ3N0aWNreScsZnVuY3Rpb24oKXsKICB2 YXIgc3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0aWNreScpLCBhYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNjLW9iJyk7CiAgaWYoIXN0fHwh YWMpIHJldHVybjsKICB2YXIgcmFmPW51bGw7CiAgZnVuY3Rpb24gdG9wKGVsKXsgcmV0dXJuIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdp bmRvdy5zY3JvbGxZOyB9CiAgZnVuY3Rpb24gdXBkKCl7IHJhZj1udWxsOyBzdC5jbGFzc0xpc3QudG9nZ2xlKCdvbicsICh3aW5kb3cuc2Nyb2xsWSArIHdp bmRvdy5pbm5lckhlaWdodCk+dG9wKGFjKSk7IH0KICBhZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLGZ1bmN0aW9uKCl7IGlmKCFyYWYpIHJhZj1yZXF1ZXN0 QW5pbWF0aW9uRnJhbWUodXBkKTsgfSx7cGFzc2l2ZTp0cnVlfSk7CiAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyx1cGQpOyB1cGQoKTsKfSk7CgovKiDi lIDilIAgOSDCtyB0aGUgYW5pbWF0ZWQgcHJvZHVjdCBtb21lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmJsb2NrKCdtb21lbnQnLGZ1bmN0aW9uKCl7CiAgdmFy IFU9d2luZG93LkJBTF9VUkx8fGZ1bmN0aW9uKGYpe3JldHVybiBmfTsKICB2YXIgRlI9W107IGZvcih2YXIgZmk9MDtmaTwzNjtmaSsrKXsgRlIucHVzaChV KCdiYWwtZnJhbWUtJysoZmk8MTA/JzAnOicnKStmaSsnLndlYnAnKSk7IH0KICB2YXIgVz03MDAsIEg9MTQxNywgTj1GUi5sZW5ndGg7CiAgdmFyIGN2PWRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdicpOyBpZighY3YpIHJldHVybjsKICB2YXIgY3g9Y3YuZ2V0Q29udGV4dCgnMmQnLHthbHBoYTp0cnVlfSk7CiAg dmFyIGdsb3c9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dsb3cnKSwgdHlwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0eXBlJyksCiAgICAgIGtpY2s9 ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tpY2tlcicpLCBydWxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdydWxlJyksCiAgICAgIHBuPWRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKCdwbmFtZScpOwogIHZhciBpbWdzPVtdLCBsb2FkZWQ9MDsKICBGUi5mb3JFYWNoKGZ1bmN0aW9uKGIsaSl7IHZhciBpbT1uZXcg SW1hZ2UoKTsgaW0ub25sb2FkPWltLm9uZXJyb3I9ZnVuY3Rpb24oKXsgaWYoKytsb2FkZWQ9PT1OKSByZWFkeSgpOyB9OyBpbS5zcmM9YjsgaW1nc1tpXT1p bTsgfSk7CiAgdmFyIGN1cj0tMTsKICBmdW5jdGlvbiBkcmF3KGkpeyBpZihpPT09Y3VyKXJldHVybjsgY3VyPWk7IGN4LmNsZWFyUmVjdCgwLDAsVyxIKTsg dmFyIGltPWltZ3NbaV07IGlmKGltJiZpbS5jb21wbGV0ZSYmaW0ubmF0dXJhbFdpZHRoKSBjeC5kcmF3SW1hZ2UoaW0sMCwwLFcsSCk7IH0KICBmdW5jdGlv biBjbCh2LGEsYil7IHJldHVybiB2PGE/YToodj5iP2I6dik7IH0KICBmdW5jdGlvbiBzZyhwLGEsYil7IHJldHVybiBjbCgocC1hKS8oYi1hKSwwLDEpOyB9 CiAgZnVuY3Rpb24gb2ModCl7IHJldHVybiAxLU1hdGgucG93KDEtdCwzKTsgfQogIHZhciBCT1g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JyYW5jaEJv eCcpOwogIHZhciBTUDE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwMScpLCBTUDI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwMicpOwogIHZhciBM MT1TUDEuZ2V0VG90YWxMZW5ndGgoKSwgTDI9U1AyLmdldFRvdGFsTGVuZ3RoKCk7CiAgU1AxLnN0eWxlLnN0cm9rZURhc2hhcnJheT1MMTsgU1AyLnN0eWxl LnN0cm9rZURhc2hhcnJheT1MMjsKICB2YXIgQk1FVEE9W3sidCI6ICJsIiwgInMiOiAwLjUxMDQ2fSwgeyJ0IjogImwiLCAicyI6IDAuNTU2NDl9LCB7InQi OiAibCIsICJzIjogMC40MTQyM30sIHsidCI6ICJsIiwgInMiOiAwLjM0NzI4fSwgeyJ0IjogImwiLCAicyI6IDAuNjUyNzJ9LCB7InQiOiAibCIsICJzIjog MC42Nzc4Mn0sIHsidCI6ICJsIiwgInMiOiAwLjMxNzk5fSwgeyJ0IjogImwiLCAicyI6IDAuNjkwMzh9LCB7InQiOiAibCIsICJzIjogMC4zMDU0NH0sIHsi dCI6ICJsIiwgInMiOiAwLjY5NDU2fSwgeyJ0IjogImYiLCAicyI6IDAuMjg0NTJ9LCB7InQiOiAiZiIsICJzIjogMC43MTU0OH0sIHsidCI6ICJsIiwgInMi OiAwLjc0ODk1fSwgeyJ0IjogImwiLCAicyI6IDAuMjQ2ODZ9LCB7InQiOiAibCIsICJzIjogMC43OTA3OX0sIHsidCI6ICJsIiwgInMiOiAwLjIwOTIxfSwg eyJ0IjogImwiLCAicyI6IDAuODAzMzV9LCB7InQiOiAibCIsICJzIjogMC4xOTI0N30sIHsidCI6ICJsIiwgInMiOiAwLjgzMjY0fSwgeyJ0IjogImwiLCAi cyI6IDAuMTYzMTh9LCB7InQiOiAiZiIsICJzIjogMC4xNDY0NH0sIHsidCI6ICJsIiwgInMiOiAwLjg1Nzc0fSwgeyJ0IjogImwiLCAicyI6IDAuMTQyMjZ9 LCB7InQiOiAiZiIsICJzIjogMC44NjE5Mn0sIHsidCI6ICJsIiwgInMiOiAwLjg5OTU4fSwgeyJ0IjogImwiLCAicyI6IDAuMTAwNDJ9LCB7InQiOiAibCIs ICJzIjogMC4wOTYyM30sIHsidCI6ICJsIiwgInMiOiAwLjk0NTYxfSwgeyJ0IjogImwiLCAicyI6IDAuOTQ1NjF9LCB7InQiOiAibCIsICJzIjogMC4wNTQz OX0sIHsidCI6ICJsIiwgInMiOiAwLjA1NDM5fSwgeyJ0IjogImwiLCAicyI6IDAuOTU4MTZ9LCB7InQiOiAibCIsICJzIjogMC45NzA3MX0sIHsidCI6ICJs IiwgInMiOiAwLjAyOTI5fSwgeyJ0IjogImYiLCAicyI6IDEuMH0sIHsidCI6ICJmIiwgInMiOiAxLjB9LCB7InQiOiAiZiIsICJzIjogMC4wfSwgeyJ0Ijog ImYiLCAicyI6IDAuMH0sIHsidCI6ICJsIiwgInMiOiAxLjB9LCB7InQiOiAibCIsICJzIjogMS4wfSwgeyJ0IjogImwiLCAicyI6IDEuMH0sIHsidCI6ICJs IiwgInMiOiAxLjB9LCB7InQiOiAibCIsICJzIjogMS4wfSwgeyJ0IjogImwiLCAicyI6IDAuMH0sIHsidCI6ICJsIiwgInMiOiAwLjB9LCB7InQiOiAibCIs ICJzIjogMC4wfSwgeyJ0IjogImwiLCAicyI6IDAuMH0sIHsidCI6ICJsIiwgInMiOiAwLjB9XSwgUzA9MC40OTc5MTsKICB2YXIgQlBBUlRTPUJNRVRBLm1h cChmdW5jdGlvbihtLGkpeyByZXR1cm4ge2VsOmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicCcraSksIHQ6bS50LCBzOm0uc307IH0pOwogIHZhciBCU0g9 MC44NSwgQlJfUkVMPTEuMTIyNCwgQlJfQ1k9MC41MCwgQlJfQVI9MS4zMDc2OwogIHZhciBzdGFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhZ2Un KTsKICBmdW5jdGlvbiBsYXlvdXRCcmFuY2goKXsKICAgIHZhciBjdz1jdi5vZmZzZXRXaWR0aCwgY2g9Y3Yub2Zmc2V0SGVpZ2h0LCBjbF89Y3Yub2Zmc2V0 TGVmdCwgY3Q9Y3Yub2Zmc2V0VG9wOwogICAgdmFyIGJ3PU1hdGgubWluKGN3KkJSX1JFTCwgc3RhZ2UuY2xpZW50V2lkdGgqMC45OSksIGJoPWJ3KkJSX0FS OwogICAgQk9YLnN0eWxlLndpZHRoPWJ3KydweCc7IEJPWC5zdHlsZS5oZWlnaHQ9YmgrJ3B4JzsKICAgIEJPWC5zdHlsZS5sZWZ0PShjbF8tYncvMikrJ3B4 JzsgQk9YLnN0eWxlLnRvcD0oY3QrY2gqQlJfQ1ktYmgvMikrJ3B4JzsKICAgIEJPWC5zdHlsZS50cmFuc2Zvcm1PcmlnaW49JzUwJSAnKygoMC41KzAuMzgq Y2gvYmgpKjEwMCkudG9GaXhlZCgyKSsnJSc7CiAgfQogIHZhciBEVVI9MjQwMCwgVFA9MCwgdDA9MCwgcnVubmluZz1mYWxzZSwgc3RhcnRlZD1mYWxzZTsK ICBmdW5jdGlvbiB0aWNrKCl7IHZhciBlPShwZXJmb3JtYW5jZS5ub3coKS10MCkvRFVSOyBUUD1lPDA/MDooZT4xPzE6ZSk7IHVwZCgpOyBpZihUUDwxKXsg cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOyB9IGVsc2UgeyBydW5uaW5nPWZhbHNlOyB9IH0KICBmdW5jdGlvbiBHQVRFKCl7IHZhciB2PXBhcnNlRmxv YXQoZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoIi0tbW9tZW50LXN0YXJ0IikpOyByZXR1cm4g aXNOYU4odik/MC42Mjp2OyB9CiAgZnVuY3Rpb24gZ2F0ZSgpewogICAgaWYoc3RhcnRlZCkgcmV0dXJuOwogICAgaWYoc3RhZ2UuZ2V0Qm91bmRpbmdDbGll bnRSZWN0KCkudG9wIDw9IGlubmVySGVpZ2h0KkdBVEUoKSl7CiAgICAgIHN0YXJ0ZWQ9dHJ1ZTsKICAgICAgaWYoUk0peyBUUD0xOyB1cGQoKTsgfSBlbHNl IHsgdDA9cGVyZm9ybWFuY2Uubm93KCk7IHJ1bm5pbmc9dHJ1ZTsgdGljaygpOyB9CiAgICB9CiAgfQogIHZhciByYWY9bnVsbDsKICBmdW5jdGlvbiB1cGQo KXsKICAgIHJhZj1udWxsOyB2YXIgcD1UUDsKICAgIHZhciBrMT1zZyhwLDAuMDIsMC4xMSk7IGtpY2suc3R5bGUub3BhY2l0eT1rMS50b0ZpeGVkKDMpOyBr aWNrLnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlWSgnKygoMS1vYyhrMSkpKjE0KS50b0ZpeGVkKDIpKydweCknOwogICAgdmFyIGsyPXNnKHAsMC4xNCww LjI0KTsgcnVsZS5zdHlsZS53aWR0aD0ob2MoazIpKjE1MCkudG9GaXhlZCgxKSsncHgnOwogICAgdmFyIGszPXNnKHAsMC4xOCwwLjMwKTsgcG4uc3R5bGUu b3BhY2l0eT1rMy50b0ZpeGVkKDMpOyBwbi5zdHlsZS50cmFuc2Zvcm09J3RyYW5zbGF0ZVkoJysoKDEtb2MoazMpKSoxNikudG9GaXhlZCgyKSsncHgpJzsK ICAgIHZhciBrND1vYyhzZyhwLDAuMzAsMC41MikpOyB0eXAuc3R5bGUudHJhbnNmb3JtPSd0cmFuc2xhdGVZKCcrKCgxLWs0KSozNCkudG9GaXhlZCgyKSsn dmgpIHNjYWxlKCcrKDEtazQqMC4xMikudG9GaXhlZCg0KSsnKSc7CiAgICB2YXIgYXBwPXNnKHAsMC4zMiwwLjYyKSwgZWE9b2MoYXBwKTsKICAgIHZhciB0 PXNnKHAsMC4zMiwwLjkyKTsKICAgIHZhciBTUExJVD0xOCwgQj0wLjcwNDM7CiAgICB2YXIgaz0odDw9Qik/KHQvQikqU1BMSVQ6U1BMSVQrKCh0LUIpLygx LUIpKSooTi0xLVNQTElUKTsKICAgIGRyYXcoTWF0aC5yb3VuZChrKSk7CiAgICBjdi5zdHlsZS5vcGFjaXR5PXNnKHAsMC4zMiwwLjQyKS50b0ZpeGVkKDMp OwogICAgY3Yuc3R5bGUudHJhbnNmb3JtPSd0cmFuc2xhdGUoLTUwJSwnKygoMS1lYSkqOCkudG9GaXhlZCgyKSsndmgpIHNjYWxlKCcrKCgwLjU2KzAuNDQq ZWEpKkJTSCkudG9GaXhlZCg0KSsnKSc7CiAgICB2YXIgYmw9KDEtc2cocCwwLjMyLDAuNDQpKSoyLjY7IGN2LnN0eWxlLmZpbHRlcj0oUk18fGJsPDAuMDYp Pydub25lJzonYmx1cignK2JsLnRvRml4ZWQoMikrJ3B4KSc7CiAgICB2YXIgR3A9b2Moc2cocCwwLjUwLDAuOTApKSwgRz1HcCoxLjIwOwogICAgQk9YLnN0 eWxlLm9wYWNpdHk9KHNnKHAsMC41MCwwLjYwKSowLjYwKS50b0ZpeGVkKDMpOwogICAgdmFyIGJzYz0oMC41NiswLjQ0Km9jKHNnKHAsMC4zMiwwLjYyKSkp KkJTSDsgQk9YLnN0eWxlLnRyYW5zZm9ybT0nc2NhbGUoJytic2MudG9GaXhlZCg0KSsnKSc7CiAgICB2YXIgR3M9TWF0aC5taW4oMSxHKTsgU1AxLnN0eWxl LnN0cm9rZURhc2hvZmZzZXQ9KEwxKigxLUdzKSkudG9GaXhlZCgxKTsgU1AyLnN0eWxlLnN0cm9rZURhc2hvZmZzZXQ9KEwyKigxLUdzKSkudG9GaXhlZCgx KTsKICAgIGZvcih2YXIgYmkyPTA7YmkyPEJQQVJUUy5sZW5ndGg7YmkyKyspewogICAgICB2YXIgcT1CUEFSVFNbYmkyXTsgaWYoIXEuZWwpIGNvbnRpbnVl OwogICAgICB2YXIgcmVhY2g9TWF0aC5hYnMocS5zLVMwKS9NYXRoLm1heChTMCwxLVMwKTsKICAgICAgdmFyIHU9Y2woKEctcmVhY2gpLzAuMTYsMCwxKSwg ZT1vYyh1KSwgc3QyPXEuZWwuc3R5bGU7CiAgICAgIHN0Mi5vcGFjaXR5PWUudG9GaXhlZCgzKTsKICAgICAgaWYocS50PT09J2YnKXsKICAgICAgICB2YXIg b3Y9MSswLjA5Kk1hdGguc2luKE1hdGguUEkqTWF0aC5taW4oMSx1KjEuMTUpKTsKICAgICAgICBzdDIuY2xpcFBhdGg9J2NpcmNsZSgnKyhlKjYyKS50b0Zp eGVkKDEpKyclIGF0IDUwJSA1MCUpJzsKICAgICAgICBzdDIudHJhbnNmb3JtPSdzY2FsZSgnKygwLjQ1KzAuNTUqZSkqb3YrJykgcm90YXRlKCcrKCgxLWUp Ki0yMikudG9GaXhlZCgxKSsnZGVnKSc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3QyLnRyYW5zZm9ybT0nc2NhbGUoJysoMC4wOCswLjkyKmUpLnRvRml4 ZWQoMykrJykgcm90YXRlKCcrKCgxLWUpKihxLnM8UzA/OTotOSkpLnRvRml4ZWQoMSkrJ2RlZyknOwogICAgICB9CiAgICB9CiAgICB2YXIgZz1zZyhwLDAu MjgsMC44MCk7IGdsb3cuc3R5bGUub3BhY2l0eT0oZyowLjk1KS50b0ZpeGVkKDMpOyBnbG93LnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlKC01MCUsLTUw JSkgc2NhbGUoJysoMC44MCswLjIwKmcpLnRvRml4ZWQoMykrJyknOwogIH0KICBmdW5jdGlvbiBvblMoKXsgZ2F0ZSgpOyBpZighcnVubmluZyAmJiAhcmFm KSByYWY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZCk7IH0KICBmdW5jdGlvbiByZWFkeSgpeyBsYXlvdXRCcmFuY2goKTsgZHJhdygwKTsgdXBkKCk7IGFk ZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsb25TLHtwYXNzaXZlOnRydWV9KTsgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxmdW5jdGlvbigpeyBsYXlvdXRC cmFuY2goKTsgb25TKCk7IH0pOyBvblMoKTsgfQp9KTsKCi8qIOKUgOKUgCAxMCDCtyBzdGlja3kgYmFyIHByaWNlIG1pcnJvcnMgdGhlIHNlbGVjdGVkIHBh Y2sgKGRlc2t0b3ApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwpibG9jaygnc3RpY2t5LXByaWNlJyxmdW5jdGlvbigpewogIHZhciBvdXQ9ZG9j dW1lbnQucXVlcnlTZWxlY3RvcignI2JhbCAuc3RpY2t5LXAnKTsgaWYoIW91dCkgcmV0dXJuOwogIGZ1bmN0aW9uIHN5bmMoKXsKICAgIHZhciBwPWRvY3Vt ZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYWwgLmJhbC1wYWNrW2FyaWEtY2hlY2tlZD0idHJ1ZSJdOm5vdChbZGlzYWJsZWRdKScpIHx8IGRvY3VtZW50LnF1ZXJ5 U2VsZWN0b3IoJyNiYWwgLmJhbC1wYWNrOm5vdChbZGlzYWJsZWRdKScpOwogICAgdmFyIHY9cCAmJiBwLnF1ZXJ5U2VsZWN0b3IoJy5iYWwtcGFjay1wJyk7 IG91dC50ZXh0Q29udGVudD12P3YudGV4dENvbnRlbnQudHJpbSgpOicnOwogIH0KICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYmFsIC5iYWwtcGFj aycpLmZvckVhY2goZnVuY3Rpb24ocCl7IHAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7IHNldFRpbWVvdXQoc3luYywwKSB9KTsgfSk7 CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmFsOnByb2R1Y3RzJyxzeW5jKTsgc3luYygpOwp9KTsKCi8qIOKUgOKUgCAxMSDCtyBzbW9vdGggc2Ny b2xsIHRvIHRoZSBvcmRlciBib3gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmJsb2NrKCdzY3JvbGwnLGZ1bmN0aW9uKCl7CiAgdmFyIG9yZGVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlk KCdvcmRlcicpOyBpZighb3JkZXIpIHJldHVybjsKICB2YXIgb3JkZXJPZmZzZXQ9NTQ7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2JhbCBhW2hy ZWY9IiNvcmRlciJdJykuZm9yRWFjaChmdW5jdGlvbihsaW5rKXsKICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAg ICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHZhciB5PW9yZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAr IHdpbmRvdy5wYWdlWU9mZnNldCAtIG9yZGVyT2Zmc2V0OwogICAgICB0cnl7IHdpbmRvdy5zY3JvbGxUbyh7dG9wOk1hdGgubWF4KDAseSksYmVoYXZpb3I6 Uk0/J2F1dG8nOidzbW9vdGgnfSk7IH1jYXRjaChlcnIpeyB3aW5kb3cuc2Nyb2xsVG8oMCxNYXRoLm1heCgwLHkpKTsgfQogICAgfSx0cnVlKTsKICB9KTsK fSk7CgovKiDilIDilIAgMTIgwrcgYWRkIHRvIGNhcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSAICovCmJsb2NrKCdjYXJ0JyxmdW5jdGlvbigpewogIHZhciBidG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29iLWN0YScpOyBpZighYnRuKSByZXR1 cm47CiAgdmFyIGFycm93PWJ0bi5xdWVyeVNlbGVjdG9yKCcuYXInKTsKICBmdW5jdGlvbiBzZXRCdG5UZXh0KHRleHQpeyBidG4uZmlyc3RDaGlsZC50ZXh0 Q29udGVudD10ZXh0KycgJzsgaWYoYXJyb3cpIGFycm93LnRleHRDb250ZW50PScnOyB9CiAgZnVuY3Rpb24gZ29DYXJ0KHVybCl7IHNldEJ0blRleHQoJ0dv aW5nIHRvIGNhcnQuLi4nKTsgc2V0VGltZW91dChmdW5jdGlvbigpeyBsb2NhdGlvbi5ocmVmPXVybDsgfSwxMjApOyB9CiAgZnVuY3Rpb24gY2hvc2VuKCl7 CiAgICB2YXIgcD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFsIC5iYWwtcGFja1thcmlhLWNoZWNrZWQ9InRydWUiXTpub3QoW2Rpc2FibGVkXSknKSB8 fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFsIC5iYWwtcGFjazpub3QoW2Rpc2FibGVkXSknKTsKICAgIHJldHVybiBwICYmIHAuZ2V0QXR0cmlidXRl KCdkYXRhLXZpZCcpOwogIH0KICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgdmFyIGlkPWNob3NlbigpOyBpZighaWQp IHJldHVybjsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGlmKGJ0bi5kYXRhc2V0LmJ1c3k9PT0ndHJ1ZScpIHJldHVybjsKICAgIGJ0bi5kYXRhc2V0 LmJ1c3k9J3RydWUnOyBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWJ1c3knLCd0cnVlJyk7IGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCd0cnVl Jyk7CiAgICBzZXRCdG5UZXh0KCdBZGRpbmcgdG8gY2FydC4uLicpOwogICAgZmV0Y2goJy9jYXJ0L2FkZC5qcycse21ldGhvZDonUE9TVCcsY3JlZGVudGlh bHM6J3NhbWUtb3JpZ2luJyxoZWFkZXJzOnsnQ29udGVudC1UeXBlJzonYXBwbGljYXRpb24vanNvbid9LAogICAgICBib2R5OkpTT04uc3RyaW5naWZ5KHtp ZDpOdW1iZXIoaWQpLHF1YW50aXR5OjF9KX0pCiAgICAgIC50aGVuKGZ1bmN0aW9uKHIpeyBpZighci5vaykgdGhyb3cgMDsgZ29DYXJ0KCcvY2FydCcpOyB9 KQogICAgICAuY2F0Y2goZnVuY3Rpb24oKXsgZ29DYXJ0KCcvY2FydC9hZGQ/aWQ9JytpZCsnJnF1YW50aXR5PTEnKTsgfSk7CiAgfSk7Cn0pOwoKaWYod2lu ZG93LmNvbnNvbGUpIGNvbnNvbGUuaW5mbygnW0JhbGFheWFoXSBlbmdpbmUgYm9vdGVkJyk7Cn0pKCk7Cg==

    Restore your harmony, every day

    • IOS
    • Google Play Store
    • Email us: care@theayurvedaexperience.com
    • Call us: +1(678)-498-7248
    QUICK LINKS
    • Help Center

    • Search

    • Home

    • All Products

    • About Us

    • Become an Affiliate

    • Get SMS/WhatsApp updates

    POLICIES
    • Shipping & Delivery

    • Privacy Policy

    • Exchanges & Refunds

    • Terms of Use

    • Accessibility Statement

    CUSTOMER SERVICES
    • Contact Us

    • My Account

    • Track Your Order

    • AyuRewards

    • Referral Program

    • Book A Consultation

    The Ayurveda Experience Footer Image

    © 2026 The Ayurveda Experience

    American Express Apple Pay Diners Club Discover Google Pay Mastercard PayPal Shop Pay Venmo Visa

    * Disclaimer: Please click here to see the usage of cookies. Packaging may vary from images shown on the website. Results may vary from person to person. In compliance with FTC rulings, we cannot guarantee that these results are typical. Images used across the website are for representation purpose only. The user experiences displayed on this page, if any, are a small sample of the thousands of accounts sent to us by people who have used products and materials developed by Transformative Learning Pte. Ltd. Nothing on this website may be viewed as the diagnosis or treatment of any medical disease whatsoever. If you have a health condition or may be allergic to herbs, please check with your physician before using the products. Please read the list of ingredients carefully and identify any ingredients that you may be allergic to. Patch test products before use.
    The contents of the educational video courses on this website are the opinions of the authors based on their learning and experiences. The Ayurveda Experience is not liable or responsible for the suggestions made herein, as this content is meant only for educational purposes. Please consult your primary care physician before implementing any change in your diet or lifestyle. For any further information please contact care@theayurvedaexperience.com

    Having trouble adding items to your cart? This can happen due to browser settings. Click below to fix it.

    Account

    For You
    Orders
    Profile