{
    "hints": {
        "optin(asset)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "optin2(asset,asset)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "setup(uint64,address,address,uint64,uint64,uint64,asset,uint64,asset,uint64,uint64,uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "lower_fee(uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "get_account_buy_total(address)uint64": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "buy()void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "withdraw(uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "withdraw_fees(uint64)void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "end()void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "close()void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "delete_boxes(byte[][])void": {
            "call_config": {
                "no_op": "CALL"
            }
        },
        "get_meta(application)string": {
            "read_only": true,
            "call_config": {
                "no_op": "CALL"
            }
        },
        "get_state()(uint32,uint64,address,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,address,uint64,uint64,byte[],uint8,byte[],uint8)": {
            "read_only": true,
            "call_config": {
                "no_op": "CALL"
            },
            "structs": {
                "output": {
                    "name": "State",
                    "elements": [
                        [
                            "bench_id",
                            "uint32"
                        ],
                        [
                            "app_id",
                            "uint64"
                        ],
                        [
                            "owner_addr",
                            "address"
                        ],
                        [
                            "time_start",
                            "uint64"
                        ],
                        [
                            "original_time_start",
                            "uint64"
                        ],
                        [
                            "time_end",
                            "uint64"
                        ],
                        [
                            "original_time_end",
                            "uint64"
                        ],
                        [
                            "selling_asset",
                            "uint64"
                        ],
                        [
                            "selling_amount",
                            "uint64"
                        ],
                        [
                            "remaining_amount",
                            "uint64"
                        ],
                        [
                            "purchase_asset",
                            "uint64"
                        ],
                        [
                            "purchase_price_per_100m",
                            "uint64"
                        ],
                        [
                            "purchase_limit",
                            "uint64"
                        ],
                        [
                            "fee_bps",
                            "uint64"
                        ],
                        [
                            "fee_addr",
                            "address"
                        ],
                        [
                            "fees_accrued",
                            "uint64"
                        ],
                        [
                            "cancellable",
                            "uint64"
                        ],
                        [
                            "selling_asset_unit_name",
                            "byte[]"
                        ],
                        [
                            "selling_asset_decimals",
                            "uint8"
                        ],
                        [
                            "purchase_asset_unit_name",
                            "byte[]"
                        ],
                        [
                            "purchase_asset_decimals",
                            "uint8"
                        ]
                    ]
                }
            }
        },
        "get_state_with_meta(application)(uint32,uint64,address,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,address,uint64,uint64,byte[],uint8,byte[],uint8,address,uint64,string)": {
            "read_only": true,
            "call_config": {
                "no_op": "CALL"
            },
            "structs": {
                "output": {
                    "name": "StateWithMeta",
                    "elements": [
                        [
                            "bench_id",
                            "uint32"
                        ],
                        [
                            "app_id",
                            "uint64"
                        ],
                        [
                            "owner_addr",
                            "address"
                        ],
                        [
                            "time_start",
                            "uint64"
                        ],
                        [
                            "original_time_start",
                            "uint64"
                        ],
                        [
                            "time_end",
                            "uint64"
                        ],
                        [
                            "original_time_end",
                            "uint64"
                        ],
                        [
                            "selling_asset",
                            "uint64"
                        ],
                        [
                            "selling_amount",
                            "uint64"
                        ],
                        [
                            "remaining_amount",
                            "uint64"
                        ],
                        [
                            "purchase_asset",
                            "uint64"
                        ],
                        [
                            "purchase_price_per_100m",
                            "uint64"
                        ],
                        [
                            "purchase_limit",
                            "uint64"
                        ],
                        [
                            "fee_bps",
                            "uint64"
                        ],
                        [
                            "fee_addr",
                            "address"
                        ],
                        [
                            "fees_accrued",
                            "uint64"
                        ],
                        [
                            "cancellable",
                            "uint64"
                        ],
                        [
                            "selling_asset_unit_name",
                            "byte[]"
                        ],
                        [
                            "selling_asset_decimals",
                            "uint8"
                        ],
                        [
                            "purchase_asset_unit_name",
                            "byte[]"
                        ],
                        [
                            "purchase_asset_decimals",
                            "uint8"
                        ],
                        [
                            "caller",
                            "address"
                        ],
                        [
                            "caller_purchase_box",
                            "uint64"
                        ],
                        [
                            "meta",
                            "string"
                        ]
                    ]
                }
            }
        }
    },
    "source": {
        "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmVuY2guY29udHJhY3QuQmVuY2guX19hbGdvcHlfZW50cnlwb2ludF93aXRoX2luaXQoKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDYgMiAxMDAwMDAwMDAKICAgIGJ5dGVjYmxvY2sgInB1cmNoYXNlX2Fzc2V0IiAic2VsbGluZ19hc3NldCIgInRpbWVfZW5kIiAib3duZXJfYWRkciIgImZlZXNfYWNjcnVlZCIgInJlbWFpbmluZ19hbW91bnQiICJ0aW1lX3N0YXJ0IiAicHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0iICJmZWVfYnBzIiAiZmVlX2FkZHIiICJzZWxsaW5nX2Ftb3VudCIgInB1cmNoYXNlX2xpbWl0IiAiaWQiICJvcmlnaW5hbF90aW1lX3N0YXJ0IiAib3JpZ2luYWxfdGltZV9lbmQiICJjYW5jZWxsYWJsZSIgMHgxNTFmN2M3NSAweDQxNGM0NzRmICJFUlI6T1BUIFNORCIgIkVSUjpPVkVSIiAiRVJSOlBSSUNFIDAiICJFUlI6VU5BVVRIIiAiRVJSOk5PVCBPVkVSIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBzZWxmLm93bmVyX2FkZHIgPSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICBieXRlY18zIC8vICJvd25lcl9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBzZWxmLmlkID0gVUludDY0KDApCiAgICBieXRlYyAxMiAvLyAiaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozOAogICAgLy8gc2VsZi50aW1lX3N0YXJ0ID0gVUludDY0KDApCiAgICBieXRlYyA2IC8vICJ0aW1lX3N0YXJ0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzkKICAgIC8vIHNlbGYub3JpZ2luYWxfdGltZV9zdGFydCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTMgLy8gIm9yaWdpbmFsX3RpbWVfc3RhcnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi50aW1lX2VuZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MQogICAgLy8gc2VsZi5vcmlnaW5hbF90aW1lX2VuZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTQgLy8gIm9yaWdpbmFsX3RpbWVfZW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDMKICAgIC8vIHNlbGYuc2VsbGluZ19hc3NldCA9IEFzc2V0KCkKICAgIGJ5dGVjXzEgLy8gInNlbGxpbmdfYXNzZXQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0NAogICAgLy8gc2VsZi5zZWxsaW5nX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAic2VsbGluZ19hbW91bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5yZW1haW5pbmdfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gInJlbWFpbmluZ19hbW91bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0NwogICAgLy8gc2VsZi5wdXJjaGFzZV9hc3NldCA9IEFzc2V0KCkKICAgIGJ5dGVjXzAgLy8gInB1cmNoYXNlX2Fzc2V0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDgKICAgIC8vIHNlbGYucHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0gPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAicHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0OQogICAgLy8gc2VsZi5wdXJjaGFzZV9saW1pdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMSAvLyAicHVyY2hhc2VfbGltaXQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo1MQogICAgLy8gc2VsZi5mZWVfYnBzID0gVUludDY0KDEwKQogICAgYnl0ZWMgOCAvLyAiZmVlX2JwcyIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NTIKICAgIC8vIHNlbGYuZmVlX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjIDkgLy8gImZlZV9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmZlZXNfYWNjcnVlZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNCAvLyAiZmVlc19hY2NydWVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NTUKICAgIC8vIHNlbGYuY2FuY2VsbGFibGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gImNhbmNlbGxhYmxlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NTgKICAgIC8vIHNlbGYudmVyc2lvbiA9IFVJbnQ2NCgyKQogICAgcHVzaGJ5dGVzICJ2ZXJzaW9uIgogICAgaW50Y18zIC8vIDIKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNAogICAgLy8gY2xhc3MgQmVuY2goQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxOQogICAgcHVzaGJ5dGVzcyAweDdmMTlmOWQ0IDB4ZjAxNzU1ZjYgMHgxYTY2MWRlZCAweDFhMGM5Nzg3IDB4ZTA5YWYwOTMgMHg0ODAzM2EwOCAweDIxZjFkZGZmIDB4MGQxMzE3NTEgMHgyYzA5ZjNhNSAweDk2NTYwNDdhIDB4MWFhZGI4MzAgMHg3NzA0Njc5MCAweDdlYTc1NDYxIDB4MTMwYzE5YWQgLy8gbWV0aG9kICJvcHRpbihhc3NldCl2b2lkIiwgbWV0aG9kICJvcHRpbjIoYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAic2V0dXAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxhc3NldCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAibG93ZXJfZmVlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnZXRfYWNjb3VudF9idXlfdG90YWwoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImJ1eSgpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXcodWludDY0KXZvaWQiLCBtZXRob2QgIndpdGhkcmF3X2ZlZXModWludDY0KXZvaWQiLCBtZXRob2QgImVuZCgpdm9pZCIsIG1ldGhvZCAiY2xvc2UoKXZvaWQiLCBtZXRob2QgImRlbGV0ZV9ib3hlcyhieXRlW11bXSl2b2lkIiwgbWV0aG9kICJnZXRfbWV0YShhcHBsaWNhdGlvbilzdHJpbmciLCBtZXRob2QgImdldF9zdGF0ZSgpKHVpbnQzMix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LHVpbnQ2NCxieXRlW10sdWludDgsYnl0ZVtdLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3N0YXRlX3dpdGhfbWV0YShhcHBsaWNhdGlvbikodWludDMyLHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50OCxieXRlW10sdWludDgsYWRkcmVzcyx1aW50NjQsc3RyaW5nKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0aW5fcm91dGVANSBtYWluX29wdGluMl9yb3V0ZUA2IG1haW5fc2V0dXBfcm91dGVANyBtYWluX2xvd2VyX2ZlZV9yb3V0ZUA4IG1haW5fZ2V0X2FjY291bnRfYnV5X3RvdGFsX3JvdXRlQDkgbWFpbl9idXlfcm91dGVAMTAgbWFpbl93aXRoZHJhd19yb3V0ZUAxMSBtYWluX3dpdGhkcmF3X2ZlZXNfcm91dGVAMTIgbWFpbl9lbmRfcm91dGVAMTMgbWFpbl9jbG9zZV9yb3V0ZUAxNCBtYWluX2RlbGV0ZV9ib3hlc19yb3V0ZUAxNSBtYWluX2dldF9tZXRhX3JvdXRlQDE2IG1haW5fZ2V0X3N0YXRlX3JvdXRlQDE3IG1haW5fZ2V0X3N0YXRlX3dpdGhfbWV0YV9yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBjbGFzcyBCZW5jaChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfc3RhdGVfd2l0aF9tZXRhX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM4NQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzQKICAgIC8vIGNsYXNzIEJlbmNoKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozODUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3N0YXRlX3dpdGhfbWV0YQogICAgYnl0ZWMgMTYgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3N0YXRlX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zdGF0ZQogICAgYnl0ZWMgMTYgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X21ldGFfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzI4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNAogICAgLy8gY2xhc3MgQmVuY2goQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbWV0YQogICAgYnl0ZWMgMTYgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZGVsZXRlX2JveGVzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMwOQogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzQKICAgIC8vIGNsYXNzIEJlbmNoKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzA5CiAgICAvLyBAYWJpbWV0aG9kCiAgICBjYWxsc3ViIGRlbGV0ZV9ib3hlcwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyOTEKICAgIC8vIEBhYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBjbG9zZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9lbmRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjgxCiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZW5kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3dpdGhkcmF3X2ZlZXNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mjc0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNAogICAgLy8gY2xhc3MgQmVuY2goQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNzQKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgd2l0aGRyYXdfZmVlcwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl93aXRoZHJhd19yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNjQKICAgIC8vIEBhYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBjbGFzcyBCZW5jaChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFiaW1ldGhvZAogICAgY2FsbHN1YiB3aXRoZHJhdwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9idXlfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTY1CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYnV5CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2J1eV90b3RhbF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzQKICAgIC8vIGNsYXNzIEJlbmNoKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTUwCiAgICAvLyBAYWJpbWV0aG9kCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2J1eV90b3RhbAogICAgYnl0ZWMgMTYgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fbG93ZXJfZmVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBjbGFzcyBCZW5jaChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGxvd2VyX2ZlZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXR1cF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBjbGFzcyBCZW5jaChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo3MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldHVwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wdGluMl9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBjbGFzcyBCZW5jaChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo2NQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIG9wdGluMgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRpbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBjbGFzcyBCZW5jaChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBvcHRpbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzQKICAgIC8vIGNsYXNzIEJlbmNoKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5vcHRpbihhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo2MC02MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgb3B0aW4oc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NjIKICAgIC8vIGN1c3RvbS5lbnN1cmUoVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCBTKCJFUlI6T1BUIFNORCIpKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wdGluX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBjdXN0b20uZW5zdXJlKFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgUygiRVJSOk9QVCBTTkQiKSkKICAgIGJ5dGVjIDE4IC8vICJFUlI6T1BUIFNORCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3B0aW5fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9zZW5kLnB5OjYKICAgIC8vIGF4ZmVyKGFzc2V0LCBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCBVSW50NjQoMCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBheGZlcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmNvbW1vbi5zZW5kLmF4ZmVyKGFzc2V0OiB1aW50NjQsIHJlY2VpdmVyOiBieXRlcywgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmF4ZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9zZW5kLnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGF4ZmVyKGFzc2V0OiBBc3NldCwgcmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6MjAtMjIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LCBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwgYXNzZXRfYW1vdW50PWFtb3VudCwgZmVlPTAKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vc2VuZC5weToyMAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6MjEKICAgIC8vIHhmZXJfYXNzZXQ9YXNzZXQsIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLCBhc3NldF9hbW91bnQ9YW1vdW50LCBmZWU9MAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6MjAtMjIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LCBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwgYXNzZXRfYW1vdW50PWFtb3VudCwgZmVlPTAKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6MjMKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJlbmNoLmNvbnRyYWN0LkJlbmNoLm9wdGluMihhc3NldDogdWludDY0LCBhc3NldDI6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0aW4yOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBvcHRpbjIoc2VsZiwgYXNzZXQ6IEFzc2V0LCBhc3NldDI6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NjcKICAgIC8vIGN1c3RvbS5lbnN1cmUoVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCBTKCJFUlI6T1BUIFNORCIpKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wdGluMl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo2NwogICAgLy8gY3VzdG9tLmVuc3VyZShUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsIFMoIkVSUjpPUFQgU05EIikpCiAgICBieXRlYyAxOCAvLyAiRVJSOk9QVCBTTkQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wdGluMl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6NgogICAgLy8gYXhmZXIoYXNzZXQsIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsIFVJbnQ2NCgwKSkKICAgIGZyYW1lX2RpZyAtMgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGF4ZmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBheGZlcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJlbmNoLmNvbnRyYWN0LkJlbmNoLnNldHVwKGlkOiB1aW50NjQsIG93bmVyX2FkZHI6IGJ5dGVzLCBmZWVfYWRkcjogYnl0ZXMsIGZlZV9icHM6IHVpbnQ2NCwgdGltZV9zdGFydDogdWludDY0LCB0aW1lX2VuZDogdWludDY0LCBzZWxsaW5nX2Fzc2V0OiB1aW50NjQsIHNlbGxpbmdfYW1vdW50OiB1aW50NjQsIHB1cmNoYXNlX2Fzc2V0OiB1aW50NjQsIHB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtOiB1aW50NjQsIHB1cmNoYXNlX2xpbWl0OiB1aW50NjQsIGNhbmNlbGxhYmxlOiB1aW50NjQpIC0+IHZvaWQ6CnNldHVwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjcxLTg2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzZXR1cCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGlkOiBVSW50NjQsICAjIG5vcWE6QTAwMgogICAgLy8gICAgIG93bmVyX2FkZHI6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICBmZWVfYWRkcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIGZlZV9icHM6IFVJbnQ2NCwKICAgIC8vICAgICB0aW1lX3N0YXJ0OiBVSW50NjQsCiAgICAvLyAgICAgdGltZV9lbmQ6IFVJbnQ2NCwKICAgIC8vICAgICBzZWxsaW5nX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBzZWxsaW5nX2Ftb3VudDogVUludDY0LAogICAgLy8gICAgIHB1cmNoYXNlX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBwdXJjaGFzZV9wcmljZV9wZXJfMTAwbTogVUludDY0LAogICAgLy8gICAgIHB1cmNoYXNlX2xpbWl0OiBVSW50NjQsCiAgICAvLyAgICAgY2FuY2VsbGFibGU6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDEyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo4NwogICAgLy8gY3VzdG9tLmVuc3VyZShHbG9iYWwuemVyb19hZGRyZXNzID09IHNlbGYub3duZXJfYWRkciwgUygiRVJSOklOSVRFRCIpKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3duZXJfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vd25lcl9hZGRyIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBzZXR1cF9hZnRlcl9pZl9lbHNlQDU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6ODcKICAgIC8vIGN1c3RvbS5lbnN1cmUoR2xvYmFsLnplcm9fYWRkcmVzcyA9PSBzZWxmLm93bmVyX2FkZHIsIFMoIkVSUjpJTklURUQiKSkKICAgIHB1c2hieXRlcyAiRVJSOklOSVRFRCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKc2V0dXBfYWZ0ZXJfaWZfZWxzZUA1NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo4OAogICAgLy8gY3VzdG9tLmVuc3VyZShUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsIFMoIkVSUjpPUFQgU05EIikpCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogc2V0dXBfYWZ0ZXJfaWZfZWxzZUA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBjdXN0b20uZW5zdXJlKFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgUygiRVJSOk9QVCBTTkQiKSkKICAgIGJ5dGVjIDE4IC8vICJFUlI6T1BUIFNORCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKc2V0dXBfYWZ0ZXJfaWZfZWxzZUA2MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5pZCA9IGlkCiAgICBieXRlYyAxMiAvLyAiaWQiCiAgICBmcmFtZV9kaWcgLTEyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLm93bmVyX2FkZHIgPSBvd25lcl9hZGRyLm5hdGl2ZQogICAgYnl0ZWNfMyAvLyAib3duZXJfYWRkciIKICAgIGZyYW1lX2RpZyAtMTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZmVlX2FkZHIgPSBmZWVfYWRkci5uYXRpdmUKICAgIGJ5dGVjIDkgLy8gImZlZV9hZGRyIgogICAgZnJhbWVfZGlnIC0xMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5mZWVfYnBzID0gZmVlX2JwcwogICAgYnl0ZWMgOCAvLyAiZmVlX2JwcyIKICAgIGZyYW1lX2RpZyAtOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo5NQogICAgLy8gaWYgdGltZV9zdGFydCA+IDAgYW5kIHRpbWVfZW5kID4gMDoKICAgIGZyYW1lX2RpZyAtOAogICAgYnogc2V0dXBfYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ6IHNldHVwX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBjdXN0b20uZW5zdXJlKHRpbWVfc3RhcnQgPCB0aW1lX2VuZCwgUyhlcnJfc3RhcnRfYWZ0ZXJfZW5kKSkKICAgIGZyYW1lX2RpZyAtOAogICAgZnJhbWVfZGlnIC03CiAgICA8CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogc2V0dXBfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6OTYKICAgIC8vIGN1c3RvbS5lbnN1cmUodGltZV9zdGFydCA8IHRpbWVfZW5kLCBTKGVycl9zdGFydF9hZnRlcl9lbmQpKQogICAgcHVzaGJ5dGVzICJFUlI6U1RBUlQgQUZURVIgRU5EIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpzZXR1cF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6OTcKICAgIC8vIGlmIHRpbWVfZW5kID4gMDoKICAgIGZyYW1lX2RpZyAtNwogICAgYnogc2V0dXBfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6OTgKICAgIC8vIGN1c3RvbS5lbnN1cmUoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCB0aW1lX2VuZCwgUyhlcnJfZW5kX2luX3Bhc3QpKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZnJhbWVfZGlnIC03CiAgICA8CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogc2V0dXBfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6OTgKICAgIC8vIGN1c3RvbS5lbnN1cmUoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCB0aW1lX2VuZCwgUyhlcnJfZW5kX2luX3Bhc3QpKQogICAgcHVzaGJ5dGVzICJFUlI6RU5EIElOIFBBU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnNldHVwX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo5OQogICAgLy8gaWYgc2VsZi50aW1lX2VuZCA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInRpbWVfZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZW5kIGV4aXN0cwogICAgYm56IHNldHVwX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gY3VzdG9tLmVuc3VyZShjYW5jZWxsYWJsZSA9PSAxLCBTKCJFUlI6Q0FOQ0VMIFcvTyBFTkQgVElNRSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBzZXR1cF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMDAKICAgIC8vIGN1c3RvbS5lbnN1cmUoY2FuY2VsbGFibGUgPT0gMSwgUygiRVJSOkNBTkNFTCBXL08gRU5EIFRJTUUiKSkKICAgIHB1c2hieXRlcyAiRVJSOkNBTkNFTCBXL08gRU5EIFRJTUUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnNldHVwX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMDIKICAgIC8vIHNlbGYudGltZV9zdGFydCA9IHRpbWVfc3RhcnQKICAgIGJ5dGVjIDYgLy8gInRpbWVfc3RhcnQiCiAgICBmcmFtZV9kaWcgLTgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTAzCiAgICAvLyBzZWxmLm9yaWdpbmFsX3RpbWVfc3RhcnQgPSB0aW1lX3N0YXJ0CiAgICBieXRlYyAxMyAvLyAib3JpZ2luYWxfdGltZV9zdGFydCIKICAgIGZyYW1lX2RpZyAtOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMDQKICAgIC8vIHNlbGYudGltZV9lbmQgPSB0aW1lX2VuZAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBmcmFtZV9kaWcgLTcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTA1CiAgICAvLyBzZWxmLm9yaWdpbmFsX3RpbWVfZW5kID0gdGltZV9lbmQKICAgIGJ5dGVjIDE0IC8vICJvcmlnaW5hbF90aW1lX2VuZCIKICAgIGZyYW1lX2RpZyAtNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyAjIGlmIHNlbGxpbmcgYXNzZXQgaXMgYW4gQVNBLCB2YWxpZGF0ZSBpdCBpcyBpbmRlZWQgYW4gQVNBCiAgICAvLyBpZiBzZWxsaW5nX2Fzc2V0LmlkICE9IDA6CiAgICBmcmFtZV9kaWcgLTYKICAgIGJ6IHNldHVwX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gdmFsaWRhdGUuYXNzZXQoc2VsbGluZ19hc3NldCwgUygiRVJSOlNFTEwgQUlEIikpCiAgICBmcmFtZV9kaWcgLTYKICAgIHB1c2hieXRlcyAiRVJSOlNFTEwgQUlEIgogICAgY2FsbHN1YiBhc3NldAoKc2V0dXBfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjExMAogICAgLy8gc2VsZi5zZWxsaW5nX2Fzc2V0ID0gc2VsbGluZ19hc3NldAogICAgYnl0ZWNfMSAvLyAic2VsbGluZ19hc3NldCIKICAgIGZyYW1lX2RpZyAtNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyAtNQogICAgYm56IHNldHVwX2FmdGVyX2lmX2Vsc2VANDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMTIKICAgIC8vIGN1c3RvbS5lbnN1cmUoc2VsbGluZ19hbW91bnQgPiAwLCBTKCJFUlI6U0VMTCBBTVQgMCIpKQogICAgcHVzaGJ5dGVzICJFUlI6U0VMTCBBTVQgMCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKc2V0dXBfYWZ0ZXJfaWZfZWxzZUA0MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMTMKICAgIC8vIHNlbGYuc2VsbGluZ19hbW91bnQgPSBzZWxsaW5nX2Ftb3VudAogICAgYnl0ZWMgMTAgLy8gInNlbGxpbmdfYW1vdW50IgogICAgZnJhbWVfZGlnIC01CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjExNAogICAgLy8gc2VsZi5yZW1haW5pbmdfYW1vdW50ID0gc2VsbGluZ19hbW91bnQKICAgIGJ5dGVjIDUgLy8gInJlbWFpbmluZ19hbW91bnQiCiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTE2LTExNwogICAgLy8gIyBpZiBwdXJjaGFzaW5nIGFzc2V0IGlzIGFuIEFTQSwgdmFsaWRhdGUgaXQgaXMgaW5kZWVkIGFuIEFTQQogICAgLy8gaWYgcHVyY2hhc2VfYXNzZXQuaWQgIT0gMDoKICAgIGZyYW1lX2RpZyAtNAogICAgYnogc2V0dXBfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjExOAogICAgLy8gdmFsaWRhdGUuYXNzZXQocHVyY2hhc2VfYXNzZXQsIFMoIkVSUjpQVVIgQUlEIikpCiAgICBmcmFtZV9kaWcgLTQKICAgIHB1c2hieXRlcyAiRVJSOlBVUiBBSUQiCiAgICBjYWxsc3ViIGFzc2V0CgpzZXR1cF9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjExOQogICAgLy8gc2VsZi5wdXJjaGFzZV9hc3NldCA9IHB1cmNoYXNlX2Fzc2V0CiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyAtMwogICAgYm56IHNldHVwX2FmdGVyX2lmX2Vsc2VAMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMjEtMTIyCiAgICAvLyAjIHByaWNlIGNhbiBub3QgYmUgemVybwogICAgLy8gY3VzdG9tLmVuc3VyZShwdXJjaGFzZV9wcmljZV9wZXJfMTAwbSA+IDAsIFMoIkVSUjpQUklDRSAwIikpCiAgICBieXRlYyAyMCAvLyAiRVJSOlBSSUNFIDAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnNldHVwX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTIzCiAgICAvLyBzZWxmLnB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtID0gcHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0KICAgIGJ5dGVjIDcgLy8gInB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtIgogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gc2VsZi5wdXJjaGFzZV9saW1pdCA9IHB1cmNoYXNlX2xpbWl0CiAgICBieXRlYyAxMSAvLyAicHVyY2hhc2VfbGltaXQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjYW5jZWxsYWJsZSBjYW4gYmUgemVybyBvciBvbmUKICAgIC8vIGN1c3RvbS5lbnN1cmUoY2FuY2VsbGFibGUgPT0gMCBvciBjYW5jZWxsYWJsZSA9PSAxLCBTKCJFUlI6UFJJQ0UgMCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBieiBzZXR1cF9ib29sX3RydWVAMTMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBzZXR1cF9ib29sX2ZhbHNlQDE0CgpzZXR1cF9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQoKc2V0dXBfYm9vbF9tZXJnZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBzZXR1cF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjYW5jZWxsYWJsZSBjYW4gYmUgemVybyBvciBvbmUKICAgIC8vIGN1c3RvbS5lbnN1cmUoY2FuY2VsbGFibGUgPT0gMCBvciBjYW5jZWxsYWJsZSA9PSAxLCBTKCJFUlI6UFJJQ0UgMCIpKQogICAgYnl0ZWMgMjAgLy8gIkVSUjpQUklDRSAwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpzZXR1cF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5jYW5jZWxsYWJsZSA9IGNhbmNlbGxhYmxlCiAgICBieXRlYyAxNSAvLyAiY2FuY2VsbGFibGUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjQ2CiAgICAvLyBpZiBzZWxmLnNlbGxpbmdfYXNzZXQgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzZWxsaW5nX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlbGxpbmdfYXNzZXQgZXhpc3RzCiAgICBibnogc2V0dXBfZWxzZV9ib2R5QDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjQ4CiAgICAvLyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLmJhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gLSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLm1pbl9iYWxhbmNlCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNDgtMjQ5CiAgICAvLyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLmJhbGFuY2UKICAgIC8vIC0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5taW5fYmFsYW5jZQogICAgLQoKc2V0dXBfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYmVuY2guY29udHJhY3QuQmVuY2guYXZhaWxhYmxlX3NlbGxpbmdfYmFsYW5jZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMzMKICAgIC8vIHNlbGYuYXZhaWxhYmxlX3NlbGxpbmdfYmFsYW5jZSgpID09IHNlbGxpbmdfYW1vdW50LAogICAgZnJhbWVfZGlnIC01CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHNldHVwX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxMzQKICAgIC8vIFMoIkVSUjpTRUxMIEFNVCIpLAogICAgcHVzaGJ5dGVzICJFUlI6U0VMTCBBTVQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnNldHVwX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gIyBpZiBidXllcnMgd2lsbCB1c2UgYW4gQVNBLCBlbnN1cmUgd2UgYXJlIG9wdGVkIGluCiAgICAvLyBpZiBwdXJjaGFzZV9hc3NldC5pZCAhPSAwOgogICAgZnJhbWVfZGlnIC00CiAgICBieiBzZXR1cF9hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTQwCiAgICAvLyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLmlzX29wdGVkX2luKHB1cmNoYXNlX2Fzc2V0KSwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogc2V0dXBfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gUygiRVJSOlBVUiBPUFRJTiIpLAogICAgcHVzaGJ5dGVzICJFUlI6UFVSIE9QVElOIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpzZXR1cF9hZnRlcl9pZl9lbHNlQDE3OgogICAgcmV0c3ViCgpzZXR1cF9lbHNlX2JvZHlAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjUyCiAgICAvLyByZXR1cm4gc2VsZi5zZWxsaW5nX2Fzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic2VsbGluZ19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWxsaW5nX2Fzc2V0IGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTMzCiAgICAvLyBzZWxmLmF2YWlsYWJsZV9zZWxsaW5nX2JhbGFuY2UoKSA9PSBzZWxsaW5nX2Ftb3VudCwKICAgIGIgc2V0dXBfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYmVuY2guY29udHJhY3QuQmVuY2guYXZhaWxhYmxlX3NlbGxpbmdfYmFsYW5jZUAyMQoKc2V0dXBfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIHNldHVwX2Jvb2xfbWVyZ2VAMTUKCgovLyBzbWFydF9jb250cmFjdHMuY29tbW9uLnZhbGlkYXRlLmFzc2V0KGFzc2V0OiB1aW50NjQsIGVycl9tc2c6IGJ5dGVzKSAtPiB2b2lkOgphc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vdmFsaWRhdGUucHk6OC05CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2V0KGFzc2V0OiBBc3NldCwgZXJyX21zZzogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3ZhbGlkYXRlLnB5OjEwLTEyCiAgICAvLyAjIFByb3h5IGZvciBhc3NldCBleGlzdGVuY2UgY2hlY2sgVE9ETwogICAgLy8gIyBUT0RPIFRoaXMgd2lsbCBwcm9iYWJseSB0aHJvdyBhIG5vbi1jdXN0b20gZXJyb3IgaWYgd2UgYWNjZXNzIC50b3RhbCBvZiBub3QtYW4tYXNzZXQKICAgIC8vIGN1c3RvbS5lbnN1cmUoYXNzZXQudG90YWwgPiAwLCBlcnJfbXNnKQogICAgZnJhbWVfZGlnIC0yCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhc3NldF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgZnJhbWVfZGlnIC0xCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmVuY2guY29udHJhY3QuQmVuY2gubG93ZXJfZmVlKG5ld19mZWVfYnBzOiB1aW50NjQpIC0+IHZvaWQ6Cmxvd2VyX2ZlZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxNDQtMTQ1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBsb3dlcl9mZWUoc2VsZiwgbmV3X2ZlZV9icHM6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gc2VsZi5hc3NlcnRfc2VuZGVyX2ZlZV9hZGRyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X3NlbmRlcl9mZWVfYWRkcgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gY3VzdG9tLmVuc3VyZShuZXdfZmVlX2JwcyA8IHNlbGYuZmVlX2JwcywgUygiRVJSOk9WRVJGRUUiKSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJmZWVfYnBzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZV9icHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBsb3dlcl9mZWVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTQ3CiAgICAvLyBjdXN0b20uZW5zdXJlKG5ld19mZWVfYnBzIDwgc2VsZi5mZWVfYnBzLCBTKCJFUlI6T1ZFUkZFRSIpKQogICAgcHVzaGJ5dGVzICJFUlI6T1ZFUkZFRSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKbG93ZXJfZmVlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxNDgKICAgIC8vIHNlbGYuZmVlX2JwcyA9IG5ld19mZWVfYnBzCiAgICBieXRlYyA4IC8vICJmZWVfYnBzIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJlbmNoLmNvbnRyYWN0LkJlbmNoLmFzc2VydF9zZW5kZXJfZmVlX2FkZHIoKSAtPiB2b2lkOgphc3NlcnRfc2VuZGVyX2ZlZV9hZGRyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQzOS00NDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3NlbmRlcl9mZWVfYWRkcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDQxCiAgICAvLyBjdXN0b20uZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5mZWVfYWRkciwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImZlZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZV9hZGRyIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhc3NlcnRfc2VuZGVyX2ZlZV9hZGRyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gY3VzdG9tLmVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuZmVlX2FkZHIsIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDIxIC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NlcnRfc2VuZGVyX2ZlZV9hZGRyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5nZXRfYWNjb3VudF9idXlfdG90YWwoYWNjb3VudDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF9idXlfdG90YWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIGdldF9hY2NvdW50X2J1eV90b3RhbChzZWxmLCBhY2NvdW50OiBhcmM0LkFkZHJlc3MpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTUyCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi5fZ2V0X2FjY291bnRfYnV5X3RvdGFsKGFjY291bnQ9YWNjb3VudC5uYXRpdmUpKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYWNjb3VudF9idXlfdG90YWwKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5fZ2V0X2FjY291bnRfYnV5X3RvdGFsKGFjY291bnQ6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9nZXRfYWNjb3VudF9idXlfdG90YWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2FjY291bnRfYnV5X3RvdGFsKHNlbGYsIGFjY291bnQ6IEFjY291bnQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gaWYgYWNjb3VudCBpbiBzZWxmLnB1cmNoYXNlczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2FjY291bnRfYnV5X3RvdGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTU3CiAgICAvLyByZXR1cm4gc2VsZi5wdXJjaGFzZXNbYWNjb3VudF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgpfZ2V0X2FjY291bnRfYnV5X3RvdGFsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5idXkoKSAtPiB2b2lkOgpidXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTY1LTE2NgogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIGJ1eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE2Ny0xNjgKICAgIC8vICMgaWYgdGhlcmUgaXMgYSBzZXQgc3RhcnRfdGltZSwgY2hlY2sgdGhhdCBpdCBoYXMgZWxhcHNlZAogICAgLy8gaWYgc2VsZi50aW1lX3N0YXJ0ID4gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ0aW1lX3N0YXJ0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfc3RhcnQgZXhpc3RzCiAgICBieiBidXlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTcwCiAgICAvLyBzZWxmLnRpbWVfc3RhcnQgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIFMoIkVSUjpOT1QgU1RBUlRFRCIpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidGltZV9zdGFydCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX3N0YXJ0IGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBidXlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTcwCiAgICAvLyBzZWxmLnRpbWVfc3RhcnQgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIFMoIkVSUjpOT1QgU1RBUlRFRCIpCiAgICBwdXNoYnl0ZXMgIkVSUjpOT1QgU1RBUlRFRCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYnV5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxNzMtMTc0CiAgICAvLyAjIGlmIHRoZXJlIGlzIGEgc2V0IGVuZF90aW1lLCBjaGVjayB0aGF0IGl0IGhhcyBub3QgZWxhcHNlZAogICAgLy8gaWYgc2VsZi50aW1lX2VuZCA+IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9lbmQgZXhpc3RzCiAgICBieiBidXlfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTc1CiAgICAvLyBjdXN0b20uZW5zdXJlKHNlbGYudGltZV9lbmQgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgUygiRVJSOkVOREVEIikpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9lbmQgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYnV5X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gY3VzdG9tLmVuc3VyZShzZWxmLnRpbWVfZW5kID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIFMoIkVSUjpFTkRFRCIpKQogICAgcHVzaGJ5dGVzICJFUlI6RU5ERUQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmJ1eV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTc3LTE3OAogICAgLy8gIyB2YWxpZGF0ZSBwYXltZW50IGFuZCBnZXQgYW1vdW50IHNlbnQKICAgIC8vIHB1cmNoYXNlX3R4bl9pbmRleCA9IFR4bi5ncm91cF9pbmRleCAtIFVJbnQ2NCgxKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYucHVyY2hhc2VfYXNzZXQgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIGJueiBidXlfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxODAKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gdmFsaWRhdGUucGF5bWVudChwdXJjaGFzZV90eG5faW5kZXgpCiAgICBmcmFtZV9kaWcgNQogICAgY2FsbHN1YiBwYXltZW50CiAgICBmcmFtZV9idXJ5IDQKCmJ1eV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTg0LTE4NQogICAgLy8gIyB3ZSBoYXZlIHBlci1hY2NvdW50IGJ1eSBsaW1pdHMsIHRyYWNraW5nIHF0eSBpbiBwdXJjaGFzZSBhc3NldCBhbW91bnRzCiAgICAvLyBpZiBzZWxmLnB1cmNoYXNlX2xpbWl0OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJwdXJjaGFzZV9saW1pdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9saW1pdCBleGlzdHMKICAgIGJ6IGJ1eV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyBnZXQgdGhlIHB1cmNoYXNlZCBhbW91bnQgc28gZmFyCiAgICAvLyBleGlzdGluZyA9IHNlbGYuX2dldF9hY2NvdW50X2J1eV90b3RhbChUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfZ2V0X2FjY291bnRfYnV5X3RvdGFsCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE4OC0xOTEKICAgIC8vICMgaWYgd2UgYXJlIHNlbGxpbmcgZm9yIEFMR08sIHNraXAgTUJSIHZlcmlmaWNhdGlvbgogICAgLy8gIyBpZiB3ZSBhcmUgc2VsbGluZyBmb3IgYW4gYXNzZXQsIGVhY2ggcHVyY2hhc2VzIG5lZWRzIE1CUgogICAgLy8gIyBpZiB1c2VyIGhhcyBleGlzdGluZyBxdW90YSwgdGhleSBoYXZlIHBhaWQgZm9yIGJveAogICAgLy8gaWYgZXhpc3RpbmcgPT0gMDoKICAgIGJueiBidXlfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gbWJyX3R4bl9pbmRleCA9IFR4bi5ncm91cF9pbmRleCAtIFVJbnQ2NCgyKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTk0CiAgICAvLyB2YWxpZGF0ZS5wYXltZW50KG1icl90eG5faW5kZXgpID49IFVJbnQ2NChQVVJDSEFTRV9CT1hfQ09TVCksCiAgICBjYWxsc3ViIHBheW1lbnQKICAgIHB1c2hpbnQgMTg1MDAgLy8gMTg1MDAKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYnV5X2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToxOTUKICAgIC8vIFMoIkVSUjpNQlIiKSwKICAgIHB1c2hieXRlcyAiRVJSOk1CUiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYnV5X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTk5CiAgICAvLyBleGlzdGluZyArIHBheW1lbnRfYW1vdW50IDw9IHNlbGYucHVyY2hhc2VfbGltaXQsIFMoIkVSUjpRVU9UQSIpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInB1cmNoYXNlX2xpbWl0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnB1cmNoYXNlX2xpbWl0IGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBidXlfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZXhpc3RpbmcgKyBwYXltZW50X2Ftb3VudCA8PSBzZWxmLnB1cmNoYXNlX2xpbWl0LCBTKCJFUlI6UVVPVEEiKQogICAgcHVzaGJ5dGVzICJFUlI6UVVPVEEiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmJ1eV9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjIwMS0yMDIKICAgIC8vICMgc2F2ZSB0aGUgcHVyY2hhc2VkIGFtb3VudCBzbyBmYXIKICAgIC8vIHNlbGYuc2V0X2FjY291bnRfYnV5X3RvdGFsKFR4bi5zZW5kZXIsIGV4aXN0aW5nICsgcGF5bWVudF9hbW91bnQpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTYzCiAgICAvLyBzZWxmLnB1cmNoYXNlc1thY2NvdW50XSA9IGFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGJveF9wdXQKCmJ1eV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjIwNi0yMDcKICAgIC8vIHBheW1lbnRfYW1vdW50CiAgICAvLyAqIEJpZ1VJbnQoMTAwXzAwMF8wMDApCiAgICBmcmFtZV9kaWcgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gKiBCaWdVSW50KDEwMF8wMDBfMDAwKQogICAgcHVzaGJ5dGVzIDB4MDVmNWUxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMDYtMjA3CiAgICAvLyBwYXltZW50X2Ftb3VudAogICAgLy8gKiBCaWdVSW50KDEwMF8wMDBfMDAwKQogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMDgKICAgIC8vIC8vIEJpZ1VJbnQoc2VsZi5wdXJjaGFzZV9wcmljZV9wZXJfMTAwbSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwdXJjaGFzZV9wcmljZV9wZXJfMTAwbSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9wcmljZV9wZXJfMTAwbSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMDYtMjA4CiAgICAvLyBwYXltZW50X2Ftb3VudAogICAgLy8gKiBCaWdVSW50KDEwMF8wMDBfMDAwKQogICAgLy8gLy8gQmlnVUludChzZWxmLnB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtKQogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMDQtMjEwCiAgICAvLyBzZWxsX2Ftb3VudCA9IG9wLmJ0b2koCiAgICAvLyAgICAgKAogICAgLy8gICAgICAgICBwYXltZW50X2Ftb3VudAogICAgLy8gICAgICAgICAqIEJpZ1VJbnQoMTAwXzAwMF8wMDApCiAgICAvLyAgICAgICAgIC8vIEJpZ1VJbnQoc2VsZi5wdXJjaGFzZV9wcmljZV9wZXJfMTAwbSkKICAgIC8vICAgICApLmJ5dGVzCiAgICAvLyApCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGJ1eV9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjEyCiAgICAvLyBjdXN0b20uZW5zdXJlKHNlbGxfYW1vdW50ID4gMCwgUygiRVJSOlpFUk8gQU1UIikpCiAgICBwdXNoYnl0ZXMgIkVSUjpaRVJPIEFNVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYnV5X2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjEzCiAgICAvLyBjdXN0b20uZW5zdXJlKHNlbGxfYW1vdW50IDw9IHNlbGYucmVtYWluaW5nX2Ftb3VudCwgUygiRVJSOk9WRVJTRUxMIikpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAicmVtYWluaW5nX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZW1haW5pbmdfYW1vdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYnV5X2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMTMKICAgIC8vIGN1c3RvbS5lbnN1cmUoc2VsbF9hbW91bnQgPD0gc2VsZi5yZW1haW5pbmdfYW1vdW50LCBTKCJFUlI6T1ZFUlNFTEwiKSkKICAgIHB1c2hieXRlcyAiRVJSOk9WRVJTRUxMIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpidXlfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMTUtMjE2CiAgICAvLyAjIGlmIG5vdCBzY2hlZHVsZWQgc3RhcnQsIHNldCB0byBmaXJzdCBzYWxlCiAgICAvLyBpZiBzZWxmLnRpbWVfc3RhcnQgPT0gMCBhbmQgc2VsZi5yZW1haW5pbmdfYW1vdW50ID09IHNlbGYuc2VsbGluZ19hbW91bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidGltZV9zdGFydCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX3N0YXJ0IGV4aXN0cwogICAgYm56IGJ1eV9hZnRlcl9pZl9lbHNlQDE0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAicmVtYWluaW5nX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZW1haW5pbmdfYW1vdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZWxsaW5nX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWxsaW5nX2Ftb3VudCBleGlzdHMKICAgID09CiAgICBieiBidXlfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gc2VsZi50aW1lX3N0YXJ0ID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGJ5dGVjIDYgLy8gInRpbWVfc3RhcnQiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAoKYnV5X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLnJlbWFpbmluZ19hbW91bnQgPSBzZWxmLnJlbWFpbmluZ19hbW91bnQgLSBzZWxsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInJlbWFpbmluZ19hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVtYWluaW5nX2Ftb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyA2CiAgICAtCiAgICBieXRlYyA1IC8vICJyZW1haW5pbmdfYW1vdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyAjIGF1dG8gZW5kOiBpZiB0aGUgcmVtYWluZGVyIGlzIG5vdCBidXlhYmxlCiAgICAvLyBpZiBzZWxmLnJlbWFpbmluZ19hbW91bnQgPCBzZWxmLmdldF9sZWFzdF9wdXJjaGFzYWJsZV9hbW91bnQoKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJyZW1haW5pbmdfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVtYWluaW5nX2Ftb3VudCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMzItMjM2CiAgICAvLyAjIGNhbGN1bGF0ZSB0aGUgZXhhY3QgcHJpY2Ugb2YgYSBzaW5nbGUgdW5pdCBvZiB0aGUgc2VsbGluZyBhc3NldAogICAgLy8gIyB1c2VkIHRvIGNhbGN1bGF0ZSBkdXN0IHRocmVzaG9sZCwgYWZ0ZXIgd2hpY2ggd2UgY2FsbCB0aGUgY29udHJhY3QgZG9uZQogICAgLy8gIyBhcyB0aGVyZSBpcyBubyBidXlhYmxlIGFtb3VudCBsZWZ0CiAgICAvLyAjIGUuZy4gcmV0dXJucyBBTFBIQSBhbW91bnQgY29ycmVzcG9uZGluZyB0byAwLjAwMDAwMSBVU0RDCiAgICAvLyBiYXNlID0gVUludDY0KDEwMF8wMDBfMDAwKSAvLyBzZWxmLnB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAicHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0gZXhpc3RzCiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwCiAgICBzd2FwCiAgICAvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gaWYgYmFzZSA9PSAwIG9yIFVJbnQ2NCgxMDBfMDAwXzAwMCkgJSBiYXNlID4gVUludDY0KDApCiAgICBieiBidXlfYm9vbF90cnVlQDE5CiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwCiAgICBmcmFtZV9kaWcgMQogICAgJQogICAgYnogYnV5X2Jvb2xfZmFsc2VAMjAKCmJ1eV9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKYnV5X2Jvb2xfbWVyZ2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjQyCiAgICAvLyByZXR1cm4gYmFzZSArIHJvdW5kaW5nCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjIyMC0yMjEKICAgIC8vICMgYXV0byBlbmQ6IGlmIHRoZSByZW1haW5kZXIgaXMgbm90IGJ1eWFibGUKICAgIC8vIGlmIHNlbGYucmVtYWluaW5nX2Ftb3VudCA8IHNlbGYuZ2V0X2xlYXN0X3B1cmNoYXNhYmxlX2Ftb3VudCgpOgogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IGJ1eV9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjIyCiAgICAvLyBzZWxmLnRpbWVfZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGJ5dGVjXzIgLy8gInRpbWVfZW5kIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKCmJ1eV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjIyNC0yMjUKICAgIC8vICMgc2VuZCB0aGUgdG9rZW5zIG9yIGFsZ28KICAgIC8vIHNlbmQuc2VuZChzZWxmLnNlbGxpbmdfYXNzZXQuaWQsIFR4bi5zZW5kZXIsIHNlbGxfYW1vdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInNlbGxpbmdfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2VsbGluZ19hc3NldCBleGlzdHMKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyA2CiAgICBjYWxsc3ViIHNlbmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyMjcKICAgIC8vIGZlZV9hbW91bnQgPSBzZWxmLmZlZV9icHMgKiBwYXltZW50X2Ftb3VudCAvLyAxMDAwMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImZlZV9icHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlX2JwcyBleGlzdHMKICAgIGZyYW1lX2RpZyA0CiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLmZlZXNfYWNjcnVlZCA9IHNlbGYuZmVlc19hY2NydWVkICsgZmVlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImZlZXNfYWNjcnVlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mZWVzX2FjY3J1ZWQgZXhpc3RzCiAgICArCiAgICBieXRlYyA0IC8vICJmZWVzX2FjY3J1ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpidXlfYm9vbF9mYWxzZUAyMDoKICAgIGludGNfMCAvLyAwCiAgICBiIGJ1eV9ib29sX21lcmdlQDIxCgpidXlfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MTgyCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHZhbGlkYXRlLmF4ZmVyKHB1cmNoYXNlX3R4bl9pbmRleCwgc2VsZi5wdXJjaGFzZV9hc3NldCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vdmFsaWRhdGUucHk6MTcKICAgIC8vIGF4ZmVyX3R4biA9IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uKGF4ZmVyX3R4bl9pZHgpCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vdmFsaWRhdGUucHk6MTgKICAgIC8vIGN1c3RvbS5lbnN1cmUoYXhmZXJfdHhuLnhmZXJfYXNzZXQgPT0gZXhwZWN0ZWRfYXNzZXQsIFMoIkVSUjpBWEZFUiBJRCIpKQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGJ1eV9hZnRlcl9pZl9lbHNlQDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3ZhbGlkYXRlLnB5OjE4CiAgICAvLyBjdXN0b20uZW5zdXJlKGF4ZmVyX3R4bi54ZmVyX2Fzc2V0ID09IGV4cGVjdGVkX2Fzc2V0LCBTKCJFUlI6QVhGRVIgSUQiKSkKICAgIHB1c2hieXRlcyAiRVJSOkFYRkVSIElEIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpidXlfYWZ0ZXJfaWZfZWxzZUA0MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vdmFsaWRhdGUucHk6MjAKICAgIC8vIGF4ZmVyX3R4bi5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZnJhbWVfZGlnIDUKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGJ1eV9hZnRlcl9pZl9lbHNlQDQ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3ZhbGlkYXRlLnB5OjIxCiAgICAvLyBTKCJFUlI6QVhGRVIgUkNWIiksCiAgICBwdXNoYnl0ZXMgIkVSUjpBWEZFUiBSQ1YiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmJ1eV9hZnRlcl9pZl9lbHNlQDQ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi92YWxpZGF0ZS5weToyMwogICAgLy8gcmV0dXJuIGF4ZmVyX3R4bi5hc3NldF9hbW91bnQKICAgIGZyYW1lX2RpZyA1CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZnJhbWVfYnVyeSA0CiAgICBiIGJ1eV9hZnRlcl9pZl9lbHNlQDcKCgovLyBzbWFydF9jb250cmFjdHMuY29tbW9uLnZhbGlkYXRlLnBheW1lbnQodHhuX2lkeDogdWludDY0KSAtPiB1aW50NjQ6CnBheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3ZhbGlkYXRlLnB5OjI2LTI3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHBheW1lbnQodHhuX2lkeDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vdmFsaWRhdGUucHk6MjgKICAgIC8vIHBheV90eG4gPSBndHhuLlBheW1lbnRUcmFuc2FjdGlvbih0eG5faWR4KQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi92YWxpZGF0ZS5weTozMAogICAgLy8gcGF5X3R4bi5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcGF5bWVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vdmFsaWRhdGUucHk6MzEKICAgIC8vIFMoIkVSUjpQQVkgUkNWIiksCiAgICBwdXNoYnl0ZXMgIkVSUjpQQVkgUkNWIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpwYXltZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vdmFsaWRhdGUucHk6MzMKICAgIC8vIHJldHVybiBwYXlfdHhuLmFtb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5jb21tb24uc2VuZC5zZW5kKGFzc2V0X2lkOiB1aW50NjQsIHJlY2VpdmVyOiBieXRlcywgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnNlbmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6OS0xMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBzZW5kKGFzc2V0X2lkOiBVSW50NjQsIHJlY2VpdmVyOiBBY2NvdW50LCBhbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9zZW5kLnB5OjExLTEyCiAgICAvLyAjIFNlbmQgYWxnbyBvciBBU0EgcGF5bWVudAogICAgLy8gaWYgYXNzZXRfaWQgPT0gMDoKICAgIGZyYW1lX2RpZyAtMwogICAgYm56IHNlbmRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vc2VuZC5weTo0MAogICAgLy8gaXR4bi5QYXltZW50KHJlY2VpdmVyPXJlY2VpdmVyLCBhbW91bnQ9YW1vdW50LCBmZWU9MCkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgpzZW5kX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9zZW5kLnB5OjE1CiAgICAvLyBheGZlcihBc3NldChhc3NldF9pZCksIHJlY2VpdmVyLCBhbW91bnQpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGF4ZmVyCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmVuY2guY29udHJhY3QuQmVuY2gud2l0aGRyYXcoYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CndpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI2NC0yNjUKICAgIC8vIEBhYmltZXRob2QKICAgIC8vIGRlZiB3aXRoZHJhdyhzZWxmLCBhbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI2NgogICAgLy8gc2VsZi5hc3NlcnRfc2VuZGVyX293bmVyX29yX2ZlZV9hZGRyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gY3VzdG9tLmVuc3VyZShzZWxmLmF2YWlsYWJsZV9wdXJjaGFzZV9iYWxhbmNlKCkgPj0gYW1vdW50LCBTKCJFUlI6T1ZFUiIpKQogICAgY2FsbHN1YiBhdmFpbGFibGVfcHVyY2hhc2VfYmFsYW5jZQogICAgZnJhbWVfZGlnIC0xCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHdpdGhkcmF3X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gY3VzdG9tLmVuc3VyZShzZWxmLmF2YWlsYWJsZV9wdXJjaGFzZV9iYWxhbmNlKCkgPj0gYW1vdW50LCBTKCJFUlI6T1ZFUiIpKQogICAgYnl0ZWMgMTkgLy8gIkVSUjpPVkVSIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgp3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjY5CiAgICAvLyBzZWxmLmF2YWlsYWJsZV9wdXJjaGFzZV9iYWxhbmNlKCkgLSBhbW91bnQgPj0gc2VsZi5mZWVzX2FjY3J1ZWQsCiAgICBjYWxsc3ViIGF2YWlsYWJsZV9wdXJjaGFzZV9iYWxhbmNlCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJmZWVzX2FjY3J1ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlc19hY2NydWVkIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNzAKICAgIC8vIFMoIkVSUjpPVkVSIiksCiAgICBieXRlYyAxOSAvLyAiRVJSOk9WRVIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNzIKICAgIC8vIHNlbmQuc2VuZChzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkLCBzZWxmLm93bmVyX2FkZHIsIGFtb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm93bmVyX2FkZHIgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgc2VuZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJlbmNoLmNvbnRyYWN0LkJlbmNoLmFzc2VydF9zZW5kZXJfb3duZXJfb3JfZmVlX2FkZHIoKSAtPiB2b2lkOgphc3NlcnRfc2VuZGVyX293bmVyX29yX2ZlZV9hZGRyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQ0Ny00NDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDUwCiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYuZmVlX2FkZHIgb3IgVHhuLnNlbmRlciA9PSBzZWxmLm93bmVyX2FkZHIsCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZmVlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYm56IGFzc2VydF9zZW5kZXJfb3duZXJfb3JfZmVlX2FkZHJfYm9vbF90cnVlQDIKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm93bmVyX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYnogYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcl9ib29sX2ZhbHNlQDMKCmFzc2VydF9zZW5kZXJfb3duZXJfb3JfZmVlX2FkZHJfYm9vbF90cnVlQDI6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcl9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcl9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0NTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDIxIC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NlcnRfc2VuZGVyX293bmVyX29yX2ZlZV9hZGRyX2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcl9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfc2VuZGVyX293bmVyX29yX2ZlZV9hZGRyX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5hdmFpbGFibGVfcHVyY2hhc2VfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKYXZhaWxhYmxlX3B1cmNoYXNlX2JhbGFuY2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjU0LTI1NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhdmFpbGFibGVfcHVyY2hhc2VfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNTYKICAgIC8vIGlmIHNlbGYucHVyY2hhc2VfYXNzZXQgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIGJueiBhdmFpbGFibGVfcHVyY2hhc2VfYmFsYW5jZV9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5iYWxhbmNlCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNTkKICAgIC8vIC0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5taW5fYmFsYW5jZQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjU4LTI1OQogICAgLy8gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5iYWxhbmNlCiAgICAvLyAtIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MubWluX2JhbGFuY2UKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNTctMjYwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYmFsYW5jZQogICAgLy8gICAgIC0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5taW5fYmFsYW5jZQogICAgLy8gKQogICAgcmV0c3ViCgphdmFpbGFibGVfcHVyY2hhc2VfYmFsYW5jZV9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNjIKICAgIC8vIHJldHVybiBzZWxmLnB1cmNoYXNlX2Fzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHVyY2hhc2VfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfYXNzZXQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC53aXRoZHJhd19mZWVzKGFtb3VudDogdWludDY0KSAtPiB2b2lkOgp3aXRoZHJhd19mZWVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vIEBhYmltZXRob2QKICAgIC8vIGRlZiB3aXRoZHJhd19mZWVzKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mjc2CiAgICAvLyBzZWxmLmFzc2VydF9zZW5kZXJfZmVlX2FkZHIoKQogICAgY2FsbHN1YiBhc3NlcnRfc2VuZGVyX2ZlZV9hZGRyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mjc3CiAgICAvLyBjdXN0b20uZW5zdXJlKGFtb3VudCA8PSBzZWxmLmZlZXNfYWNjcnVlZCwgUygiRVJSOk9WRVIiKSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJmZWVzX2FjY3J1ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlc19hY2NydWVkIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHdpdGhkcmF3X2ZlZXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mjc3CiAgICAvLyBjdXN0b20uZW5zdXJlKGFtb3VudCA8PSBzZWxmLmZlZXNfYWNjcnVlZCwgUygiRVJSOk9WRVIiKSkKICAgIGJ5dGVjIDE5IC8vICJFUlI6T1ZFUiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKd2l0aGRyYXdfZmVlc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mjc4CiAgICAvLyBzZW5kLnNlbmQoc2VsZi5wdXJjaGFzZV9hc3NldC5pZCwgVHhuLnNlbmRlciwgYW1vdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInB1cmNoYXNlX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnB1cmNoYXNlX2Fzc2V0IGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHNlbmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyNzkKICAgIC8vIHNlbGYuZmVlc19hY2NydWVkID0gc2VsZi5mZWVzX2FjY3J1ZWQgLSBhbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJmZWVzX2FjY3J1ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlc19hY2NydWVkIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBieXRlYyA0IC8vICJmZWVzX2FjY3J1ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJlbmNoLmNvbnRyYWN0LkJlbmNoLmVuZCgpIC0+IHZvaWQ6CmVuZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyODEtMjgyCiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgZW5kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyODMKICAgIC8vIHNlbGYuYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcigpCiAgICBjYWxsc3ViIGFzc2VydF9zZW5kZXJfb3duZXJfb3JfZmVlX2FkZHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyODQtMjg1CiAgICAvLyAjIGlmIG5vdCBzb2xkIG91dCwgY2hlY2sgdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBlbmQgaXQKICAgIC8vIGlmIHNlbGYucmVtYWluaW5nX2Ftb3VudCA+IDAgYW5kIHNlbGYuY2FuY2VsbGFibGUgPT0gMCBhbmQgc2VsZi50aW1lX2VuZCA+IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAicmVtYWluaW5nX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZW1haW5pbmdfYW1vdW50IGV4aXN0cwogICAgYnogZW5kX2FmdGVyX2lmX2Vsc2VANAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJjYW5jZWxsYWJsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jYW5jZWxsYWJsZSBleGlzdHMKICAgIGJueiBlbmRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9lbmQgZXhpc3RzCiAgICBieiBlbmRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mjg2CiAgICAvLyBjdXN0b20uZW5zdXJlKHNlbGYudGltZV9lbmQgPCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgUygiRVJSOk5PVCBPVkVSIikpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9lbmQgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZW5kX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gY3VzdG9tLmVuc3VyZShzZWxmLnRpbWVfZW5kIDwgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIFMoIkVSUjpOT1QgT1ZFUiIpKQogICAgYnl0ZWMgMjIgLy8gIkVSUjpOT1QgT1ZFUiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZW5kX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyODgKICAgIC8vIGlmIHNlbGYudGltZV9lbmQgPT0gMCBvciBzZWxmLnRpbWVfZW5kID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9lbmQgZXhpc3RzCiAgICBieiBlbmRfaWZfYm9keUA2CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9lbmQgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBieiBlbmRfYWZ0ZXJfaWZfZWxzZUA3CgplbmRfaWZfYm9keUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gc2VsZi50aW1lX2VuZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBieXRlY18yIC8vICJ0aW1lX2VuZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CgplbmRfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJlbmNoLmNvbnRyYWN0LkJlbmNoLmNsb3NlKCkgLT4gdm9pZDoKY2xvc2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyOTMKICAgIC8vIHNlbGYuYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcigpCiAgICBjYWxsc3ViIGFzc2VydF9zZW5kZXJfb3duZXJfb3JfZmVlX2FkZHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyOTQKICAgIC8vIHNlbGYuYXNzZXJ0X2VuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2VuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mjk1CiAgICAvLyBpZiBzZWxmLmZlZXNfYWNjcnVlZCA+IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZmVlc19hY2NydWVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZXNfYWNjcnVlZCBleGlzdHMKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gc2VuZC5zZW5kKHNlbGYucHVyY2hhc2VfYXNzZXQuaWQsIHNlbGYuZmVlX2FkZHIsIHNlbGYuZmVlc19hY2NydWVkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInB1cmNoYXNlX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnB1cmNoYXNlX2Fzc2V0IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImZlZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZV9hZGRyIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImZlZXNfYWNjcnVlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mZWVzX2FjY3J1ZWQgZXhpc3RzCiAgICBjYWxsc3ViIHNlbmQKCmNsb3NlX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyOTcKICAgIC8vIGlmIHNlbGYucHVyY2hhc2VfYXNzZXQuaWQgIT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gc2VsZi5vd25lcl9hZGRyLmlzX29wdGVkX2luKHNlbGYucHVyY2hhc2VfYXNzZXQpLCBTKCJFUlI6T1BUSU5QIikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm93bmVyX2FkZHIgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHVyY2hhc2VfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfYXNzZXQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTEKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGNsb3NlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weToyOTkKICAgIC8vIHNlbGYub3duZXJfYWRkci5pc19vcHRlZF9pbihzZWxmLnB1cmNoYXNlX2Fzc2V0KSwgUygiRVJSOk9QVElOUCIpCiAgICBwdXNoYnl0ZXMgIkVSUjpPUFRJTlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmNsb3NlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzAxCiAgICAvLyBzZW5kLmF4ZmVyX2Nsb3Nlb3V0KHNlbGYucHVyY2hhc2VfYXNzZXQsIHNlbGYub3duZXJfYWRkcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm93bmVyX2FkZHIgZXhpc3RzCiAgICBjYWxsc3ViIGF4ZmVyX2Nsb3Nlb3V0CgpjbG9zZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzAyCiAgICAvLyBpZiBzZWxmLnNlbGxpbmdfYXNzZXQuaWQgIT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzZWxsaW5nX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlbGxpbmdfYXNzZXQgZXhpc3RzCiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMDQKICAgIC8vIHNlbGYub3duZXJfYWRkci5pc19vcHRlZF9pbihzZWxmLnNlbGxpbmdfYXNzZXQpLCBTKCJFUlI6T1BUSU5TIikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm93bmVyX2FkZHIgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic2VsbGluZ19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWxsaW5nX2Fzc2V0IGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBjbG9zZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMDQKICAgIC8vIHNlbGYub3duZXJfYWRkci5pc19vcHRlZF9pbihzZWxmLnNlbGxpbmdfYXNzZXQpLCBTKCJFUlI6T1BUSU5TIikKICAgIHB1c2hieXRlcyAiRVJSOk9QVElOUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEyCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMwNgogICAgLy8gc2VuZC5heGZlcl9jbG9zZW91dChzZWxmLnNlbGxpbmdfYXNzZXQsIHNlbGYub3duZXJfYWRkcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzZWxsaW5nX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlbGxpbmdfYXNzZXQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3duZXJfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vd25lcl9hZGRyIGV4aXN0cwogICAgY2FsbHN1YiBheGZlcl9jbG9zZW91dAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gc2VuZC5hbGdvX2Nsb3Nlb3V0KHNlbGYub3duZXJfYWRkcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm93bmVyX2FkZHIgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6NDYtNDgKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1yZWNlaXZlciwgYW1vdW50PTAsIGNsb3NlX3JlbWFpbmRlcl90bz1yZWNlaXZlciwgZmVlPTAKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6NDcKICAgIC8vIHJlY2VpdmVyPXJlY2VpdmVyLCBhbW91bnQ9MCwgY2xvc2VfcmVtYWluZGVyX3RvPXJlY2VpdmVyLCBmZWU9MAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6NDYKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vc2VuZC5weTo0NwogICAgLy8gcmVjZWl2ZXI9cmVjZWl2ZXIsIGFtb3VudD0wLCBjbG9zZV9yZW1haW5kZXJfdG89cmVjZWl2ZXIsIGZlZT0wCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vc2VuZC5weTo0Ni00OAogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPXJlY2VpdmVyLCBhbW91bnQ9MCwgY2xvc2VfcmVtYWluZGVyX3RvPXJlY2VpdmVyLCBmZWU9MAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5hc3NlcnRfZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfZW5kZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDM1LTQzNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQzNwogICAgLy8gY3VzdG9tLmVuc3VyZShzZWxmLnRpbWVfZW5kIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBTKCJFUlI6Tk9UIE9WRVIiKSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJ0aW1lX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2VuZCBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMQogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYXNzZXJ0X2VuZGVkX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQzNwogICAgLy8gY3VzdG9tLmVuc3VyZShzZWxmLnRpbWVfZW5kIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBTKCJFUlI6Tk9UIE9WRVIiKSkKICAgIGJ5dGVjIDIyIC8vICJFUlI6Tk9UIE9WRVIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL2N1c3RvbS5weToxMgogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTMKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFzc2VydF9lbmRlZF9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuY29tbW9uLnNlbmQuYXhmZXJfY2xvc2VvdXQoYXNzZXQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IGJ5dGVzKSAtPiB2b2lkOgpheGZlcl9jbG9zZW91dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vc2VuZC5weToyNi0yNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBheGZlcl9jbG9zZW91dChhc3NldDogQXNzZXQsIHJlY2VpdmVyOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29tbW9uL3NlbmQucHk6MjgtMzQKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXJlY2VpdmVyLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9zZW5kLnB5OjMxCiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9zZW5kLnB5OjI4CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vc2VuZC5weTozMwogICAgLy8gZmVlPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vc2VuZC5weToyOC0zNAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgYXNzZXRfY2xvc2VfdG89cmVjZWl2ZXIsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9zZW5kLnB5OjM1CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5kZWxldGVfYm94ZXMoYm94X25hbWVzOiBieXRlcykgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIEBhYmltZXRob2QKICAgIC8vIGRlZiBkZWxldGVfYm94ZXMoc2VsZiwgYm94X25hbWVzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LkR5bmFtaWNCeXRlc10pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gc2VsZi5hc3NlcnRfZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMTIKICAgIC8vIHNlbGYuYXNzZXJ0X3NlbmRlcl9vd25lcl9vcl9mZWVfYWRkcigpCiAgICBjYWxsc3ViIGFzc2VydF9zZW5kZXJfb3duZXJfb3JfZmVlX2FkZHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMTMKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKGJveF9uYW1lcy5sZW5ndGgpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCgpkZWxldGVfYm94ZXNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UoYm94X25hbWVzLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBieiBkZWxldGVfYm94ZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMTQKICAgIC8vIGN1c3RvbS5lbnN1cmUob3AuQm94LmRlbGV0ZShib3hfbmFtZXNbaWR4XS5uYXRpdmUpLCBTKCJFUlI6Qk9YREVMIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAyIDAKICAgIGJveF9kZWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBkZWxldGVfYm94ZXNfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzE0CiAgICAvLyBjdXN0b20uZW5zdXJlKG9wLkJveC5kZWxldGUoYm94X25hbWVzW2lkeF0ubmF0aXZlKSwgUygiRVJSOkJPWERFTCIpKQogICAgcHVzaGJ5dGVzICJFUlI6Qk9YREVMIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpkZWxldGVfYm94ZXNfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UoYm94X25hbWVzLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBkZWxldGVfYm94ZXNfZm9yX2hlYWRlckAxCgpkZWxldGVfYm94ZXNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmVuY2guY29udHJhY3QuQmVuY2guZ2V0X21ldGEocmVnaXN0cnlfYXBwOiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfbWV0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMjgtMzI5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X21ldGEoc2VsZiwgcmVnaXN0cnlfYXBwOiBBcHBsaWNhdGlvbikgLT4gYXJjNC5TdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMzAKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfbWV0YShyZWdpc3RyeV9hcHApCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9tZXRhCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmVuY2guY29udHJhY3QuQmVuY2guX2dldF9tZXRhKHJlZ2lzdHJ5X2FwcDogdWludDY0KSAtPiBieXRlczoKX2dldF9tZXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMzMi0zMzMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9tZXRhKHNlbGYsIHJlZ2lzdHJ5X2FwcDogQXBwbGljYXRpb24pIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzM0CiAgICAvLyBjdXN0b20uZW5zdXJlKHJlZ2lzdHJ5X2FwcC5hZGRyZXNzID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsIFMoIkVSUjpSRUdfQVBQIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjExCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBfZ2V0X21ldGFfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzM0CiAgICAvLyBjdXN0b20uZW5zdXJlKHJlZ2lzdHJ5X2FwcC5hZGRyZXNzID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsIFMoIkVSUjpSRUdfQVBQIikpCiAgICBwdXNoYnl0ZXMgIkVSUjpSRUdfQVBQIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbW1vbi9jdXN0b20ucHk6MTIKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb21tb24vY3VzdG9tLnB5OjEzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpfZ2V0X21ldGFfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gaWQ9YXJjNC5VSW50MzIoc2VsZi5pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImlkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlkIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMjAKICAgIC8vIG9yaWdpbmFsX3RpbWVfc3RhcnQ9YXJjNC5VSW50MzIoc2VsZi5vcmlnaW5hbF90aW1lX3N0YXJ0KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAib3JpZ2luYWxfdGltZV9zdGFydCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcmlnaW5hbF90aW1lX3N0YXJ0IGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMjEKICAgIC8vIG9yaWdpbmFsX3RpbWVfZW5kPWFyYzQuVUludDMyKHNlbGYub3JpZ2luYWxfdGltZV9lbmQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJvcmlnaW5hbF90aW1lX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcmlnaW5hbF90aW1lX2VuZCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNCA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzI1CiAgICAvLyBzZWxsaW5nX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2VsbGluZ19hc3NldC5pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic2VsbGluZ19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWxsaW5nX2Fzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gc2VsbGluZ19hbW91bnQ9YXJjNC5VSW50NjQoc2VsZi5zZWxsaW5nX2Ftb3VudCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInNlbGxpbmdfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlbGxpbmdfYW1vdW50IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcHVyY2hhc2VfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5wdXJjaGFzZV9hc3NldC5pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHVyY2hhc2VfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzIzCiAgICAvLyBwdXJjaGFzZV9wcmljZV9wZXJfMTAwbT1hcmM0LlVJbnQ2NChzZWxmLnB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwdXJjaGFzZV9wcmljZV9wZXJfMTAwbSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9wcmljZV9wZXJfMTAwbSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMTgtMzI2CiAgICAvLyByZXR1cm4gUmVnaXN0cnlLZXkoCiAgICAvLyAgICAgaWQ9YXJjNC5VSW50MzIoc2VsZi5pZCksCiAgICAvLyAgICAgb3JpZ2luYWxfdGltZV9zdGFydD1hcmM0LlVJbnQzMihzZWxmLm9yaWdpbmFsX3RpbWVfc3RhcnQpLAogICAgLy8gICAgIG9yaWdpbmFsX3RpbWVfZW5kPWFyYzQuVUludDMyKHNlbGYub3JpZ2luYWxfdGltZV9lbmQpLAogICAgLy8gICAgIHB1cmNoYXNlX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYucHVyY2hhc2VfYXNzZXQuaWQpLAogICAgLy8gICAgIHB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtPWFyYzQuVUludDY0KHNlbGYucHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0pLAogICAgLy8gICAgIHNlbGxpbmdfYW1vdW50PWFyYzQuVUludDY0KHNlbGYuc2VsbGluZ19hbW91bnQpLAogICAgLy8gICAgIHNlbGxpbmdfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZWxsaW5nX2Fzc2V0LmlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNgogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozMzYtMzM4CiAgICAvLyBtZXRhLCBhdHhuID0gYWJpX2NhbGwoCiAgICAvLyAgICAgcmVnaXN0cnlfY29udHJhY3QuUmVnaXN0cnkuZ2V0X21ldGEsIHJlZ2lzdHJ5X2tleSwgYXBwX2lkPXJlZ2lzdHJ5X2FwcC5pZAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweDEzNDk0YTRlIC8vIG1ldGhvZCAiZ2V0X21ldGEoKHVpbnQzMix1aW50MzIsdWludDMyLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgMTYgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gcmV0dXJuIG1ldGEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5nZXRfc3RhdGUoKSAtPiBieXRlczoKZ2V0X3N0YXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0MS0zNDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc3RhdGUoc2VsZikgLT4gU3RhdGU6CiAgICBwcm90byAwIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzQ0CiAgICAvLyBiZW5jaF9pZD1hcmM0LlVJbnQzMihzZWxmLmlkKSwKICAgIGR1cG4gMwogICAgYnl0ZWMgMTIgLy8gImlkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlkIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNDUKICAgIC8vIGFwcF9pZD1hcmM0LlVJbnQ2NChHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCksCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNDYtMzQ3CiAgICAvLyAjIFN0YXRlIGluZm8KICAgIC8vIG93bmVyX2FkZHI9YXJjNC5BZGRyZXNzKHNlbGYub3duZXJfYWRkciksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3duZXJfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vd25lcl9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gdGltZV9zdGFydD1hcmM0LlVJbnQ2NChzZWxmLnRpbWVfc3RhcnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRpbWVfc3RhcnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9zdGFydCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNDkKICAgIC8vIG9yaWdpbmFsX3RpbWVfc3RhcnQ9YXJjNC5VSW50NjQoc2VsZi5vcmlnaW5hbF90aW1lX3N0YXJ0KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAib3JpZ2luYWxfdGltZV9zdGFydCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcmlnaW5hbF90aW1lX3N0YXJ0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM1MAogICAgLy8gdGltZV9lbmQ9YXJjNC5VSW50NjQoc2VsZi50aW1lX2VuZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9lbmQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzUxCiAgICAvLyBvcmlnaW5hbF90aW1lX2VuZD1hcmM0LlVJbnQ2NChzZWxmLm9yaWdpbmFsX3RpbWVfZW5kKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAib3JpZ2luYWxfdGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3JpZ2luYWxfdGltZV9lbmQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzUyCiAgICAvLyBzZWxsaW5nX2Fzc2V0PWFyYzQuVUludDY0KHNlbGYuc2VsbGluZ19hc3NldC5pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic2VsbGluZ19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWxsaW5nX2Fzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gc2VsbGluZ19hbW91bnQ9YXJjNC5VSW50NjQoc2VsZi5zZWxsaW5nX2Ftb3VudCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInNlbGxpbmdfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlbGxpbmdfYW1vdW50IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gcmVtYWluaW5nX2Ftb3VudD1hcmM0LlVJbnQ2NChzZWxmLnJlbWFpbmluZ19hbW91bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInJlbWFpbmluZ19hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVtYWluaW5nX2Ftb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNTUKICAgIC8vIHB1cmNoYXNlX2Fzc2V0PWFyYzQuVUludDY0KHNlbGYucHVyY2hhc2VfYXNzZXQuaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInB1cmNoYXNlX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnB1cmNoYXNlX2Fzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcHVyY2hhc2VfcHJpY2VfcGVyXzEwMG09YXJjNC5VSW50NjQoc2VsZi5wdXJjaGFzZV9wcmljZV9wZXJfMTAwbSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAicHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0gZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzU3CiAgICAvLyBwdXJjaGFzZV9saW1pdD1hcmM0LlVJbnQ2NChzZWxmLnB1cmNoYXNlX2xpbWl0KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicHVyY2hhc2VfbGltaXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfbGltaXQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzU4CiAgICAvLyBmZWVfYnBzPWFyYzQuVUludDY0KHNlbGYuZmVlX2JwcyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiZmVlX2JwcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mZWVfYnBzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM1OQogICAgLy8gZmVlX2FkZHI9YXJjNC5BZGRyZXNzKHNlbGYuZmVlX2FkZHIpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImZlZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZV9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gZmVlc19hY2NydWVkPWFyYzQuVUludDY0KHNlbGYuZmVlc19hY2NydWVkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJmZWVzX2FjY3J1ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlc19hY2NydWVkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gY2FuY2VsbGFibGU9YXJjNC5VSW50NjQoc2VsZi5jYW5jZWxsYWJsZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImNhbmNlbGxhYmxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNhbmNlbGxhYmxlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM3MAogICAgLy8gaWYgc2VsZi5zZWxsaW5nX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInNlbGxpbmdfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2VsbGluZ19hc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNjktMzcxCiAgICAvLyBzZWxmLnNlbGxpbmdfYXNzZXQudW5pdF9uYW1lCiAgICAvLyBpZiBzZWxmLnNlbGxpbmdfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyBlbHNlIEJ5dGVzKGIiQUxHTyIpCiAgICBieiBnZXRfc3RhdGVfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzY5CiAgICAvLyBzZWxmLnNlbGxpbmdfYXNzZXQudW5pdF9uYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic2VsbGluZ19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWxsaW5nX2Fzc2V0IGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCgpnZXRfc3RhdGVfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM2OC0zNzIKICAgIC8vIHNlbGxpbmdfYXNzZXRfdW5pdF9uYW1lPWFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIHNlbGYuc2VsbGluZ19hc3NldC51bml0X25hbWUKICAgIC8vICAgICBpZiBzZWxmLnNlbGxpbmdfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyAgICAgZWxzZSBCeXRlcyhiIkFMR08iKQogICAgLy8gKSwKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNjUKICAgIC8vIGlmIHNlbGYuc2VsbGluZ19hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzZWxsaW5nX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlbGxpbmdfYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzY0LTM2NgogICAgLy8gc2VsZi5zZWxsaW5nX2Fzc2V0LmRlY2ltYWxzCiAgICAvLyBpZiBzZWxmLnNlbGxpbmdfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyBlbHNlIFVJbnQ2NCg2KQogICAgYnogZ2V0X3N0YXRlX3Rlcm5hcnlfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gc2VsZi5zZWxsaW5nX2Fzc2V0LmRlY2ltYWxzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic2VsbGluZ19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWxsaW5nX2Fzc2V0IGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCgpnZXRfc3RhdGVfdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM2Mi0zNjcKICAgIC8vICMgQXNzZXQgaW5mb3JtYXRpb24KICAgIC8vIHNlbGxpbmdfYXNzZXRfZGVjaW1hbHM9YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLnNlbGxpbmdfYXNzZXQuZGVjaW1hbHMKICAgIC8vICAgICBpZiBzZWxmLnNlbGxpbmdfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyAgICAgZWxzZSBVSW50NjQoNikKICAgIC8vICksCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzgwCiAgICAvLyBpZiBzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInB1cmNoYXNlX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnB1cmNoYXNlX2Fzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM3OS0zODEKICAgIC8vIHNlbGYucHVyY2hhc2VfYXNzZXQudW5pdF9uYW1lCiAgICAvLyBpZiBzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgLy8gZWxzZSBCeXRlcyhiIkFMR08iKSAgIyBBTEdPCiAgICBieiBnZXRfc3RhdGVfdGVybmFyeV9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mzc5CiAgICAvLyBzZWxmLnB1cmNoYXNlX2Fzc2V0LnVuaXRfbmFtZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInB1cmNoYXNlX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnB1cmNoYXNlX2Fzc2V0IGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCgpnZXRfc3RhdGVfdGVybmFyeV9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM3OC0zODIKICAgIC8vIHB1cmNoYXNlX2Fzc2V0X3VuaXRfbmFtZT1hcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICBzZWxmLnB1cmNoYXNlX2Fzc2V0LnVuaXRfbmFtZQogICAgLy8gICAgIGlmIHNlbGYucHVyY2hhc2VfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyAgICAgZWxzZSBCeXRlcyhiIkFMR08iKSAgIyBBTEdPCiAgICAvLyApLAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gaWYgc2VsZi5wdXJjaGFzZV9hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNzQtMzc2CiAgICAvLyBzZWxmLnB1cmNoYXNlX2Fzc2V0LmRlY2ltYWxzCiAgICAvLyBpZiBzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgLy8gZWxzZSBVSW50NjQoNikgICMgQUxHTwogICAgYnogZ2V0X3N0YXRlX3Rlcm5hcnlfZmFsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNzQKICAgIC8vIHNlbGYucHVyY2hhc2VfYXNzZXQuZGVjaW1hbHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwoKZ2V0X3N0YXRlX3Rlcm5hcnlfbWVyZ2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzczLTM3NwogICAgLy8gcHVyY2hhc2VfYXNzZXRfZGVjaW1hbHM9YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLnB1cmNoYXNlX2Fzc2V0LmRlY2ltYWxzCiAgICAvLyAgICAgaWYgc2VsZi5wdXJjaGFzZV9hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIC8vICAgICBlbHNlIFVJbnQ2NCg2KSAgIyBBTEdPCiAgICAvLyApLAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNDMtMzgzCiAgICAvLyByZXR1cm4gU3RhdGUoCiAgICAvLyAgICAgYmVuY2hfaWQ9YXJjNC5VSW50MzIoc2VsZi5pZCksCiAgICAvLyAgICAgYXBwX2lkPWFyYzQuVUludDY0KEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkKSwKICAgIC8vICAgICAjIFN0YXRlIGluZm8KICAgIC8vICAgICBvd25lcl9hZGRyPWFyYzQuQWRkcmVzcyhzZWxmLm93bmVyX2FkZHIpLAogICAgLy8gICAgIHRpbWVfc3RhcnQ9YXJjNC5VSW50NjQoc2VsZi50aW1lX3N0YXJ0KSwKICAgIC8vICAgICBvcmlnaW5hbF90aW1lX3N0YXJ0PWFyYzQuVUludDY0KHNlbGYub3JpZ2luYWxfdGltZV9zdGFydCksCiAgICAvLyAgICAgdGltZV9lbmQ9YXJjNC5VSW50NjQoc2VsZi50aW1lX2VuZCksCiAgICAvLyAgICAgb3JpZ2luYWxfdGltZV9lbmQ9YXJjNC5VSW50NjQoc2VsZi5vcmlnaW5hbF90aW1lX2VuZCksCiAgICAvLyAgICAgc2VsbGluZ19hc3NldD1hcmM0LlVJbnQ2NChzZWxmLnNlbGxpbmdfYXNzZXQuaWQpLAogICAgLy8gICAgIHNlbGxpbmdfYW1vdW50PWFyYzQuVUludDY0KHNlbGYuc2VsbGluZ19hbW91bnQpLAogICAgLy8gICAgIHJlbWFpbmluZ19hbW91bnQ9YXJjNC5VSW50NjQoc2VsZi5yZW1haW5pbmdfYW1vdW50KSwKICAgIC8vICAgICBwdXJjaGFzZV9hc3NldD1hcmM0LlVJbnQ2NChzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkKSwKICAgIC8vICAgICBwdXJjaGFzZV9wcmljZV9wZXJfMTAwbT1hcmM0LlVJbnQ2NChzZWxmLnB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtKSwKICAgIC8vICAgICBwdXJjaGFzZV9saW1pdD1hcmM0LlVJbnQ2NChzZWxmLnB1cmNoYXNlX2xpbWl0KSwKICAgIC8vICAgICBmZWVfYnBzPWFyYzQuVUludDY0KHNlbGYuZmVlX2JwcyksCiAgICAvLyAgICAgZmVlX2FkZHI9YXJjNC5BZGRyZXNzKHNlbGYuZmVlX2FkZHIpLAogICAgLy8gICAgIGZlZXNfYWNjcnVlZD1hcmM0LlVJbnQ2NChzZWxmLmZlZXNfYWNjcnVlZCksCiAgICAvLyAgICAgY2FuY2VsbGFibGU9YXJjNC5VSW50NjQoc2VsZi5jYW5jZWxsYWJsZSksCiAgICAvLyAgICAgIyBBc3NldCBpbmZvcm1hdGlvbgogICAgLy8gICAgIHNlbGxpbmdfYXNzZXRfZGVjaW1hbHM9YXJjNC5VSW50OCgKICAgIC8vICAgICAgICAgc2VsZi5zZWxsaW5nX2Fzc2V0LmRlY2ltYWxzCiAgICAvLyAgICAgICAgIGlmIHNlbGYuc2VsbGluZ19hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIC8vICAgICAgICAgZWxzZSBVSW50NjQoNikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNlbGxpbmdfYXNzZXRfdW5pdF9uYW1lPWFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgICAgICBzZWxmLnNlbGxpbmdfYXNzZXQudW5pdF9uYW1lCiAgICAvLyAgICAgICAgIGlmIHNlbGYuc2VsbGluZ19hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIC8vICAgICAgICAgZWxzZSBCeXRlcyhiIkFMR08iKQogICAgLy8gICAgICksCiAgICAvLyAgICAgcHVyY2hhc2VfYXNzZXRfZGVjaW1hbHM9YXJjNC5VSW50OCgKICAgIC8vICAgICAgICAgc2VsZi5wdXJjaGFzZV9hc3NldC5kZWNpbWFscwogICAgLy8gICAgICAgICBpZiBzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgLy8gICAgICAgICBlbHNlIFVJbnQ2NCg2KSAgIyBBTEdPCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwdXJjaGFzZV9hc3NldF91bml0X25hbWU9YXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgICAgIHNlbGYucHVyY2hhc2VfYXNzZXQudW5pdF9uYW1lCiAgICAvLyAgICAgICAgIGlmIHNlbGYucHVyY2hhc2VfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyAgICAgICAgIGVsc2UgQnl0ZXMoYiJBTEdPIikgICMgQUxHTwogICAgLy8gICAgICksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDYKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDgKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDkKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEzCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTUKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDE2CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxNwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTgKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDE5CiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwYmEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE4NiAvLyAxODYKICAgICsKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfc3RhdGVfdGVybmFyeV9mYWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNzYKICAgIC8vIGVsc2UgVUludDY0KDYpICAjIEFMR08KICAgIGludGNfMiAvLyA2CiAgICBiIGdldF9zdGF0ZV90ZXJuYXJ5X21lcmdlQDEyCgpnZXRfc3RhdGVfdGVybmFyeV9mYWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM4MQogICAgLy8gZWxzZSBCeXRlcyhiIkFMR08iKSAgIyBBTEdPCiAgICBieXRlYyAxNyAvLyAweDQxNGM0NzRmCiAgICBiIGdldF9zdGF0ZV90ZXJuYXJ5X21lcmdlQDkKCmdldF9zdGF0ZV90ZXJuYXJ5X2ZhbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6MzY2CiAgICAvLyBlbHNlIFVJbnQ2NCg2KQogICAgaW50Y18yIC8vIDYKICAgIGIgZ2V0X3N0YXRlX3Rlcm5hcnlfbWVyZ2VANgoKZ2V0X3N0YXRlX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozNzEKICAgIC8vIGVsc2UgQnl0ZXMoYiJBTEdPIikKICAgIGJ5dGVjIDE3IC8vIDB4NDE0YzQ3NGYKICAgIGIgZ2V0X3N0YXRlX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iZW5jaC5jb250cmFjdC5CZW5jaC5nZXRfc3RhdGVfd2l0aF9tZXRhKHJlZ2lzdHJ5X2FwcDogdWludDY0KSAtPiBieXRlczoKZ2V0X3N0YXRlX3dpdGhfbWV0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozODUtMzg2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3N0YXRlX3dpdGhfbWV0YShzZWxmLCByZWdpc3RyeV9hcHA6IEFwcGxpY2F0aW9uKSAtPiBTdGF0ZVdpdGhNZXRhOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mzg3CiAgICAvLyBtZXRhID0gc2VsZi5fZ2V0X21ldGEocmVnaXN0cnlfYXBwKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfbWV0YQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gYmVuY2hfaWQ9YXJjNC5VSW50MzIoc2VsZi5pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImlkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlkIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozOTAKICAgIC8vIGFwcF9pZD1hcmM0LlVJbnQ2NChHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCksCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozOTEtMzkyCiAgICAvLyAjIFN0YXRlIGluZm8KICAgIC8vIG93bmVyX2FkZHI9YXJjNC5BZGRyZXNzKHNlbGYub3duZXJfYWRkciksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3duZXJfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vd25lcl9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM5MwogICAgLy8gdGltZV9zdGFydD1hcmM0LlVJbnQ2NChzZWxmLnRpbWVfc3RhcnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRpbWVfc3RhcnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9zdGFydCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozOTQKICAgIC8vIG9yaWdpbmFsX3RpbWVfc3RhcnQ9YXJjNC5VSW50NjQoc2VsZi5vcmlnaW5hbF90aW1lX3N0YXJ0KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAib3JpZ2luYWxfdGltZV9zdGFydCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcmlnaW5hbF90aW1lX3N0YXJ0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gdGltZV9lbmQ9YXJjNC5VSW50NjQoc2VsZi50aW1lX2VuZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9lbmQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mzk2CiAgICAvLyBvcmlnaW5hbF90aW1lX2VuZD1hcmM0LlVJbnQ2NChzZWxmLm9yaWdpbmFsX3RpbWVfZW5kKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAib3JpZ2luYWxfdGltZV9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3JpZ2luYWxfdGltZV9lbmQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6Mzk3CiAgICAvLyBzZWxsaW5nX2Fzc2V0PWFyYzQuVUludDY0KHNlbGYuc2VsbGluZ19hc3NldC5pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic2VsbGluZ19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWxsaW5nX2Fzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM5OAogICAgLy8gc2VsbGluZ19hbW91bnQ9YXJjNC5VSW50NjQoc2VsZi5zZWxsaW5nX2Ftb3VudCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInNlbGxpbmdfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlbGxpbmdfYW1vdW50IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVtYWluaW5nX2Ftb3VudD1hcmM0LlVJbnQ2NChzZWxmLnJlbWFpbmluZ19hbW91bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInJlbWFpbmluZ19hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVtYWluaW5nX2Ftb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MDAKICAgIC8vIHB1cmNoYXNlX2Fzc2V0PWFyYzQuVUludDY0KHNlbGYucHVyY2hhc2VfYXNzZXQuaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInB1cmNoYXNlX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnB1cmNoYXNlX2Fzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gcHVyY2hhc2VfcHJpY2VfcGVyXzEwMG09YXJjNC5VSW50NjQoc2VsZi5wdXJjaGFzZV9wcmljZV9wZXJfMTAwbSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAicHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0gZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDAyCiAgICAvLyBwdXJjaGFzZV9saW1pdD1hcmM0LlVJbnQ2NChzZWxmLnB1cmNoYXNlX2xpbWl0KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicHVyY2hhc2VfbGltaXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfbGltaXQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDAzCiAgICAvLyBmZWVfYnBzPWFyYzQuVUludDY0KHNlbGYuZmVlX2JwcyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiZmVlX2JwcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mZWVfYnBzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gZmVlX2FkZHI9YXJjNC5BZGRyZXNzKHNlbGYuZmVlX2FkZHIpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImZlZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZV9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQwNQogICAgLy8gZmVlc19hY2NydWVkPWFyYzQuVUludDY0KHNlbGYuZmVlc19hY2NydWVkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJmZWVzX2FjY3J1ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlc19hY2NydWVkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gY2FuY2VsbGFibGU9YXJjNC5VSW50NjQoc2VsZi5jYW5jZWxsYWJsZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImNhbmNlbGxhYmxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNhbmNlbGxhYmxlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQxNwogICAgLy8gaWYgc2VsZi5zZWxsaW5nX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInNlbGxpbmdfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2VsbGluZ19hc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MTYtNDE4CiAgICAvLyBzZWxmLnNlbGxpbmdfYXNzZXQudW5pdF9uYW1lCiAgICAvLyBpZiBzZWxmLnNlbGxpbmdfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyBlbHNlIEJ5dGVzKGIiQUxHTyIpCiAgICBieiBnZXRfc3RhdGVfd2l0aF9tZXRhX3Rlcm5hcnlfZmFsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQxNgogICAgLy8gc2VsZi5zZWxsaW5nX2Fzc2V0LnVuaXRfbmFtZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInNlbGxpbmdfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2VsbGluZ19hc3NldCBleGlzdHMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwoKZ2V0X3N0YXRlX3dpdGhfbWV0YV90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDE1LTQxOQogICAgLy8gc2VsbGluZ19hc3NldF91bml0X25hbWU9YXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgc2VsZi5zZWxsaW5nX2Fzc2V0LnVuaXRfbmFtZQogICAgLy8gICAgIGlmIHNlbGYuc2VsbGluZ19hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIC8vICAgICBlbHNlIEJ5dGVzKGIiQUxHTyIpCiAgICAvLyApLAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQxMgogICAgLy8gaWYgc2VsZi5zZWxsaW5nX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInNlbGxpbmdfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2VsbGluZ19hc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MTEtNDEzCiAgICAvLyBzZWxmLnNlbGxpbmdfYXNzZXQuZGVjaW1hbHMKICAgIC8vIGlmIHNlbGYuc2VsbGluZ19hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIC8vIGVsc2UgVUludDY0KDYpICAjIEFMR08KICAgIGJ6IGdldF9zdGF0ZV93aXRoX21ldGFfdGVybmFyeV9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDExCiAgICAvLyBzZWxmLnNlbGxpbmdfYXNzZXQuZGVjaW1hbHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzZWxsaW5nX2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlbGxpbmdfYXNzZXQgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKCmdldF9zdGF0ZV93aXRoX21ldGFfdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQwOS00MTQKICAgIC8vICMgQXNzZXQgaW5mb3JtYXRpb24KICAgIC8vIHNlbGxpbmdfYXNzZXRfZGVjaW1hbHM9YXJjNC5VSW50OCgKICAgIC8vICAgICBzZWxmLnNlbGxpbmdfYXNzZXQuZGVjaW1hbHMKICAgIC8vICAgICBpZiBzZWxmLnNlbGxpbmdfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyAgICAgZWxzZSBVSW50NjQoNikgICMgQUxHTwogICAgLy8gKSwKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MjcKICAgIC8vIGlmIHNlbGYucHVyY2hhc2VfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHVyY2hhc2VfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDI2LTQyOAogICAgLy8gc2VsZi5wdXJjaGFzZV9hc3NldC51bml0X25hbWUKICAgIC8vIGlmIHNlbGYucHVyY2hhc2VfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyBlbHNlIEJ5dGVzKGIiQUxHTyIpCiAgICBieiBnZXRfc3RhdGVfd2l0aF9tZXRhX3Rlcm5hcnlfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gc2VsZi5wdXJjaGFzZV9hc3NldC51bml0X25hbWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwoKZ2V0X3N0YXRlX3dpdGhfbWV0YV90ZXJuYXJ5X21lcmdlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDI1LTQyOQogICAgLy8gcHVyY2hhc2VfYXNzZXRfdW5pdF9uYW1lPWFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIHNlbGYucHVyY2hhc2VfYXNzZXQudW5pdF9uYW1lCiAgICAvLyAgICAgaWYgc2VsZi5wdXJjaGFzZV9hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIC8vICAgICBlbHNlIEJ5dGVzKGIiQUxHTyIpCiAgICAvLyApLAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gaWYgc2VsZi5wdXJjaGFzZV9hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwdXJjaGFzZV9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wdXJjaGFzZV9hc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MjEtNDIzCiAgICAvLyBzZWxmLnB1cmNoYXNlX2Fzc2V0LmRlY2ltYWxzCiAgICAvLyBpZiBzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgLy8gZWxzZSBVSW50NjQoNikgICMgQUxHTwogICAgYnogZ2V0X3N0YXRlX3dpdGhfbWV0YV90ZXJuYXJ5X2ZhbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmVuY2gvY29udHJhY3QucHk6NDIxCiAgICAvLyBzZWxmLnB1cmNoYXNlX2Fzc2V0LmRlY2ltYWxzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHVyY2hhc2VfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHVyY2hhc2VfYXNzZXQgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKCmdldF9zdGF0ZV93aXRoX21ldGFfdGVybmFyeV9tZXJnZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MjAtNDI0CiAgICAvLyBwdXJjaGFzZV9hc3NldF9kZWNpbWFscz1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYucHVyY2hhc2VfYXNzZXQuZGVjaW1hbHMKICAgIC8vICAgICBpZiBzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgLy8gICAgIGVsc2UgVUludDY0KDYpICAjIEFMR08KICAgIC8vICksCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQzMC00MzEKICAgIC8vICMgQ2FsbGVyIHNwZWNpZmljIGluZm9ybWF0aW9uCiAgICAvLyBjYWxsZXI9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQzMgogICAgLy8gY2FsbGVyX3B1cmNoYXNlX2JveD1hcmM0LlVJbnQ2NChzZWxmLl9nZXRfYWNjb3VudF9idXlfdG90YWwoVHhuLnNlbmRlcikpLAogICAgZHVwCiAgICBjYWxsc3ViIF9nZXRfYWNjb3VudF9idXlfdG90YWwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTozODgtNDMzCiAgICAvLyByZXR1cm4gU3RhdGVXaXRoTWV0YSgKICAgIC8vICAgICBiZW5jaF9pZD1hcmM0LlVJbnQzMihzZWxmLmlkKSwKICAgIC8vICAgICBhcHBfaWQ9YXJjNC5VSW50NjQoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQpLAogICAgLy8gICAgICMgU3RhdGUgaW5mbwogICAgLy8gICAgIG93bmVyX2FkZHI9YXJjNC5BZGRyZXNzKHNlbGYub3duZXJfYWRkciksCiAgICAvLyAgICAgdGltZV9zdGFydD1hcmM0LlVJbnQ2NChzZWxmLnRpbWVfc3RhcnQpLAogICAgLy8gICAgIG9yaWdpbmFsX3RpbWVfc3RhcnQ9YXJjNC5VSW50NjQoc2VsZi5vcmlnaW5hbF90aW1lX3N0YXJ0KSwKICAgIC8vICAgICB0aW1lX2VuZD1hcmM0LlVJbnQ2NChzZWxmLnRpbWVfZW5kKSwKICAgIC8vICAgICBvcmlnaW5hbF90aW1lX2VuZD1hcmM0LlVJbnQ2NChzZWxmLm9yaWdpbmFsX3RpbWVfZW5kKSwKICAgIC8vICAgICBzZWxsaW5nX2Fzc2V0PWFyYzQuVUludDY0KHNlbGYuc2VsbGluZ19hc3NldC5pZCksCiAgICAvLyAgICAgc2VsbGluZ19hbW91bnQ9YXJjNC5VSW50NjQoc2VsZi5zZWxsaW5nX2Ftb3VudCksCiAgICAvLyAgICAgcmVtYWluaW5nX2Ftb3VudD1hcmM0LlVJbnQ2NChzZWxmLnJlbWFpbmluZ19hbW91bnQpLAogICAgLy8gICAgIHB1cmNoYXNlX2Fzc2V0PWFyYzQuVUludDY0KHNlbGYucHVyY2hhc2VfYXNzZXQuaWQpLAogICAgLy8gICAgIHB1cmNoYXNlX3ByaWNlX3Blcl8xMDBtPWFyYzQuVUludDY0KHNlbGYucHVyY2hhc2VfcHJpY2VfcGVyXzEwMG0pLAogICAgLy8gICAgIHB1cmNoYXNlX2xpbWl0PWFyYzQuVUludDY0KHNlbGYucHVyY2hhc2VfbGltaXQpLAogICAgLy8gICAgIGZlZV9icHM9YXJjNC5VSW50NjQoc2VsZi5mZWVfYnBzKSwKICAgIC8vICAgICBmZWVfYWRkcj1hcmM0LkFkZHJlc3Moc2VsZi5mZWVfYWRkciksCiAgICAvLyAgICAgZmVlc19hY2NydWVkPWFyYzQuVUludDY0KHNlbGYuZmVlc19hY2NydWVkKSwKICAgIC8vICAgICBjYW5jZWxsYWJsZT1hcmM0LlVJbnQ2NChzZWxmLmNhbmNlbGxhYmxlKSwKICAgIC8vICAgICAjIE1ldGEgZnJvbSByZWdpc3RyeSBjb250cmFjdAogICAgLy8gICAgIG1ldGE9bWV0YSwKICAgIC8vICAgICAjIEFzc2V0IGluZm9ybWF0aW9uCiAgICAvLyAgICAgc2VsbGluZ19hc3NldF9kZWNpbWFscz1hcmM0LlVJbnQ4KAogICAgLy8gICAgICAgICBzZWxmLnNlbGxpbmdfYXNzZXQuZGVjaW1hbHMKICAgIC8vICAgICAgICAgaWYgc2VsZi5zZWxsaW5nX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgLy8gICAgICAgICBlbHNlIFVJbnQ2NCg2KSAgIyBBTEdPCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWxsaW5nX2Fzc2V0X3VuaXRfbmFtZT1hcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICAgICAgc2VsZi5zZWxsaW5nX2Fzc2V0LnVuaXRfbmFtZQogICAgLy8gICAgICAgICBpZiBzZWxmLnNlbGxpbmdfYXNzZXQuaWQgIT0gVUludDY0KDApCiAgICAvLyAgICAgICAgIGVsc2UgQnl0ZXMoYiJBTEdPIikKICAgIC8vICAgICApLAogICAgLy8gICAgIHB1cmNoYXNlX2Fzc2V0X2RlY2ltYWxzPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYucHVyY2hhc2VfYXNzZXQuZGVjaW1hbHMKICAgIC8vICAgICAgICAgaWYgc2VsZi5wdXJjaGFzZV9hc3NldC5pZCAhPSBVSW50NjQoMCkKICAgIC8vICAgICAgICAgZWxzZSBVSW50NjQoNikgICMgQUxHTwogICAgLy8gICAgICksCiAgICAvLyAgICAgcHVyY2hhc2VfYXNzZXRfdW5pdF9uYW1lPWFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgICAgICBzZWxmLnB1cmNoYXNlX2Fzc2V0LnVuaXRfbmFtZQogICAgLy8gICAgICAgICBpZiBzZWxmLnB1cmNoYXNlX2Fzc2V0LmlkICE9IFVJbnQ2NCgwKQogICAgLy8gICAgICAgICBlbHNlIEJ5dGVzKGIiQUxHTyIpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICAjIENhbGxlciBzcGVjaWZpYyBpbmZvcm1hdGlvbgogICAgLy8gICAgIGNhbGxlcj1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgY2FsbGVyX3B1cmNoYXNlX2JveD1hcmM0LlVJbnQ2NChzZWxmLl9nZXRfYWNjb3VudF9idXlfdG90YWwoVHhuLnNlbmRlcikpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA3CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA5CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxMAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDE1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTcKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDE4CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMjAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDBlNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMjI4IC8vIDIyOAogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X3N0YXRlX3dpdGhfbWV0YV90ZXJuYXJ5X2ZhbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQyMwogICAgLy8gZWxzZSBVSW50NjQoNikgICMgQUxHTwogICAgaW50Y18yIC8vIDYKICAgIGIgZ2V0X3N0YXRlX3dpdGhfbWV0YV90ZXJuYXJ5X21lcmdlQDEyCgpnZXRfc3RhdGVfd2l0aF9tZXRhX3Rlcm5hcnlfZmFsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iZW5jaC9jb250cmFjdC5weTo0MjgKICAgIC8vIGVsc2UgQnl0ZXMoYiJBTEdPIikKICAgIGJ5dGVjIDE3IC8vIDB4NDE0YzQ3NGYKICAgIGIgZ2V0X3N0YXRlX3dpdGhfbWV0YV90ZXJuYXJ5X21lcmdlQDkKCmdldF9zdGF0ZV93aXRoX21ldGFfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQxMwogICAgLy8gZWxzZSBVSW50NjQoNikgICMgQUxHTwogICAgaW50Y18yIC8vIDYKICAgIGIgZ2V0X3N0YXRlX3dpdGhfbWV0YV90ZXJuYXJ5X21lcmdlQDYKCmdldF9zdGF0ZV93aXRoX21ldGFfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2JlbmNoL2NvbnRyYWN0LnB5OjQxOAogICAgLy8gZWxzZSBCeXRlcyhiIkFMR08iKQogICAgYnl0ZWMgMTcgLy8gMHg0MTRjNDc0ZgogICAgYiBnZXRfc3RhdGVfd2l0aF9tZXRhX3Rlcm5hcnlfbWVyZ2VAMwo=",
        "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
    },
    "state": {
        "global": {
            "num_byte_slices": 2,
            "num_uints": 15
        },
        "local": {
            "num_byte_slices": 0,
            "num_uints": 0
        }
    },
    "schema": {
        "global": {
            "declared": {
                "cancellable": {
                    "type": "uint64",
                    "key": "cancellable"
                },
                "fee_addr": {
                    "type": "bytes",
                    "key": "fee_addr"
                },
                "fee_bps": {
                    "type": "uint64",
                    "key": "fee_bps"
                },
                "fees_accrued": {
                    "type": "uint64",
                    "key": "fees_accrued"
                },
                "id": {
                    "type": "uint64",
                    "key": "id"
                },
                "original_time_end": {
                    "type": "uint64",
                    "key": "original_time_end"
                },
                "original_time_start": {
                    "type": "uint64",
                    "key": "original_time_start"
                },
                "owner_addr": {
                    "type": "bytes",
                    "key": "owner_addr"
                },
                "purchase_asset": {
                    "type": "uint64",
                    "key": "purchase_asset"
                },
                "purchase_limit": {
                    "type": "uint64",
                    "key": "purchase_limit"
                },
                "purchase_price_per_100m": {
                    "type": "uint64",
                    "key": "purchase_price_per_100m"
                },
                "remaining_amount": {
                    "type": "uint64",
                    "key": "remaining_amount"
                },
                "selling_amount": {
                    "type": "uint64",
                    "key": "selling_amount"
                },
                "selling_asset": {
                    "type": "uint64",
                    "key": "selling_asset"
                },
                "time_end": {
                    "type": "uint64",
                    "key": "time_end"
                },
                "time_start": {
                    "type": "uint64",
                    "key": "time_start"
                },
                "version": {
                    "type": "uint64",
                    "key": "version"
                }
            },
            "reserved": {}
        },
        "local": {
            "declared": {},
            "reserved": {}
        }
    },
    "contract": {
        "name": "Bench",
        "methods": [
            {
                "name": "optin",
                "args": [
                    {
                        "type": "asset",
                        "name": "asset"
                    }
                ],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "optin2",
                "args": [
                    {
                        "type": "asset",
                        "name": "asset"
                    },
                    {
                        "type": "asset",
                        "name": "asset2"
                    }
                ],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "setup",
                "args": [
                    {
                        "type": "uint64",
                        "name": "id"
                    },
                    {
                        "type": "address",
                        "name": "owner_addr"
                    },
                    {
                        "type": "address",
                        "name": "fee_addr"
                    },
                    {
                        "type": "uint64",
                        "name": "fee_bps"
                    },
                    {
                        "type": "uint64",
                        "name": "time_start"
                    },
                    {
                        "type": "uint64",
                        "name": "time_end"
                    },
                    {
                        "type": "asset",
                        "name": "selling_asset"
                    },
                    {
                        "type": "uint64",
                        "name": "selling_amount"
                    },
                    {
                        "type": "asset",
                        "name": "purchase_asset"
                    },
                    {
                        "type": "uint64",
                        "name": "purchase_price_per_100m"
                    },
                    {
                        "type": "uint64",
                        "name": "purchase_limit"
                    },
                    {
                        "type": "uint64",
                        "name": "cancellable"
                    }
                ],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "lower_fee",
                "args": [
                    {
                        "type": "uint64",
                        "name": "new_fee_bps"
                    }
                ],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "get_account_buy_total",
                "args": [
                    {
                        "type": "address",
                        "name": "account"
                    }
                ],
                "readonly": false,
                "returns": {
                    "type": "uint64"
                }
            },
            {
                "name": "buy",
                "args": [],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "withdraw",
                "args": [
                    {
                        "type": "uint64",
                        "name": "amount"
                    }
                ],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "withdraw_fees",
                "args": [
                    {
                        "type": "uint64",
                        "name": "amount"
                    }
                ],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "end",
                "args": [],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "close",
                "args": [],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "delete_boxes",
                "args": [
                    {
                        "type": "byte[][]",
                        "name": "box_names"
                    }
                ],
                "readonly": false,
                "returns": {
                    "type": "void"
                }
            },
            {
                "name": "get_meta",
                "args": [
                    {
                        "type": "application",
                        "name": "registry_app"
                    }
                ],
                "readonly": true,
                "returns": {
                    "type": "string"
                }
            },
            {
                "name": "get_state",
                "args": [],
                "readonly": true,
                "returns": {
                    "type": "(uint32,uint64,address,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,address,uint64,uint64,byte[],uint8,byte[],uint8)"
                }
            },
            {
                "name": "get_state_with_meta",
                "args": [
                    {
                        "type": "application",
                        "name": "registry_app"
                    }
                ],
                "readonly": true,
                "returns": {
                    "type": "(uint32,uint64,address,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,address,uint64,uint64,byte[],uint8,byte[],uint8,address,uint64,string)"
                }
            }
        ],
        "networks": {}
    },
    "bare_call_config": {
        "no_op": "CREATE"
    }
}