{
  "_format": "hh-sol-artifact-1",
  "contractName": "Verifier",
  "sourceName": "@matterlabs/zksync-contracts/l1/contracts/zksync/Verifier.sol",
  "abi": [
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "zero",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "alpha",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "gamma",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[9]",
              "name": "alpha_values",
              "type": "tuple[9]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "eta",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_lookup",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "gamma_lookup",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_plus_one",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_gamma",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "v",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "u",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z_minus_last_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "l_0_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "l_n_minus_one_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "t",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "tp",
              "type": "tuple"
            }
          ],
          "internalType": "struct Plonk4VerifierWithAccessToDNext.PartialVerifierState",
          "name": "state",
          "type": "tuple"
        }
      ],
      "name": "compute_powers_of_alpha",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "domain_size",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "num_inputs",
              "type": "uint256"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[2]",
              "name": "gate_selectors_commitments",
              "type": "tuple[2]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[7]",
              "name": "gate_setup_commitments",
              "type": "tuple[7]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[4]",
              "name": "permutation_commitments",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "lookup_selector_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[4]",
              "name": "lookup_tables_commitments",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "lookup_table_type_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[3]",
              "name": "non_residues",
              "type": "tuple[3]"
            },
            {
              "components": [
                {
                  "internalType": "uint256[2]",
                  "name": "X",
                  "type": "uint256[2]"
                },
                {
                  "internalType": "uint256[2]",
                  "name": "Y",
                  "type": "uint256[2]"
                }
              ],
              "internalType": "struct PairingsBn254.G2Point[2]",
              "name": "g2_elements",
              "type": "tuple[2]"
            }
          ],
          "internalType": "struct VerificationKey",
          "name": "vk",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256[]",
              "name": "input_values",
              "type": "uint256[]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[4]",
              "name": "state_polys_commitments",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "copy_permutation_grand_product_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[4]",
              "name": "quotient_poly_parts_commitments",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[4]",
              "name": "state_polys_openings_at_z",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[1]",
              "name": "state_polys_openings_at_z_omega",
              "type": "tuple[1]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[1]",
              "name": "gate_selectors_openings_at_z",
              "type": "tuple[1]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[3]",
              "name": "copy_permutation_polys_openings_at_z",
              "type": "tuple[3]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "copy_permutation_grand_product_opening_at_z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "quotient_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "linearization_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "lookup_s_poly_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "lookup_grand_product_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_s_poly_opening_at_z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_grand_product_opening_at_z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_t_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_t_poly_opening_at_z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_selector_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_table_type_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "opening_proof_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "opening_proof_at_z_omega",
              "type": "tuple"
            }
          ],
          "internalType": "struct Plonk4VerifierWithAccessToDNext.Proof",
          "name": "proof",
          "type": "tuple"
        },
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "zero",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "alpha",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "gamma",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[9]",
              "name": "alpha_values",
              "type": "tuple[9]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "eta",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_lookup",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "gamma_lookup",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_plus_one",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_gamma",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "v",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "u",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z_minus_last_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "l_0_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "l_n_minus_one_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "t",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "tp",
              "type": "tuple"
            }
          ],
          "internalType": "struct Plonk4VerifierWithAccessToDNext.PartialVerifierState",
          "name": "state",
          "type": "tuple"
        }
      ],
      "name": "prepare_queries",
      "outputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[13]",
              "name": "commitments_at_z",
              "type": "tuple[13]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[13]",
              "name": "values_at_z",
              "type": "tuple[13]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[6]",
              "name": "commitments_at_z_omega",
              "type": "tuple[6]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[6]",
              "name": "values_at_z_omega",
              "type": "tuple[6]"
            }
          ],
          "internalType": "struct Plonk4VerifierWithAccessToDNext.Queries",
          "name": "queries",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "domain_size",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "num_inputs",
              "type": "uint256"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[2]",
              "name": "gate_selectors_commitments",
              "type": "tuple[2]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[7]",
              "name": "gate_setup_commitments",
              "type": "tuple[7]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[4]",
              "name": "permutation_commitments",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "lookup_selector_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[4]",
              "name": "lookup_tables_commitments",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "lookup_table_type_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[3]",
              "name": "non_residues",
              "type": "tuple[3]"
            },
            {
              "components": [
                {
                  "internalType": "uint256[2]",
                  "name": "X",
                  "type": "uint256[2]"
                },
                {
                  "internalType": "uint256[2]",
                  "name": "Y",
                  "type": "uint256[2]"
                }
              ],
              "internalType": "struct PairingsBn254.G2Point[2]",
              "name": "g2_elements",
              "type": "tuple[2]"
            }
          ],
          "internalType": "struct VerificationKey",
          "name": "vk",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256[]",
              "name": "input_values",
              "type": "uint256[]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[4]",
              "name": "state_polys_commitments",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "copy_permutation_grand_product_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point[4]",
              "name": "quotient_poly_parts_commitments",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[4]",
              "name": "state_polys_openings_at_z",
              "type": "tuple[4]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[1]",
              "name": "state_polys_openings_at_z_omega",
              "type": "tuple[1]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[1]",
              "name": "gate_selectors_openings_at_z",
              "type": "tuple[1]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[3]",
              "name": "copy_permutation_polys_openings_at_z",
              "type": "tuple[3]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "copy_permutation_grand_product_opening_at_z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "quotient_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "linearization_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "lookup_s_poly_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "lookup_grand_product_commitment",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_s_poly_opening_at_z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_grand_product_opening_at_z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_t_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_t_poly_opening_at_z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_selector_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "lookup_table_type_poly_opening_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "opening_proof_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "opening_proof_at_z_omega",
              "type": "tuple"
            }
          ],
          "internalType": "struct Plonk4VerifierWithAccessToDNext.Proof",
          "name": "proof",
          "type": "tuple"
        },
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "zero",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "alpha",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "gamma",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr[9]",
              "name": "alpha_values",
              "type": "tuple[9]"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "eta",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_lookup",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "gamma_lookup",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_plus_one",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "beta_gamma",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "v",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "u",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "z_minus_last_omega",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "l_0_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "l_n_minus_one_at_z",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.Fr",
              "name": "t",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "X",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "Y",
                  "type": "uint256"
                }
              ],
              "internalType": "struct PairingsBn254.G1Point",
              "name": "tp",
              "type": "tuple"
            }
          ],
          "internalType": "struct Plonk4VerifierWithAccessToDNext.PartialVerifierState",
          "name": "state",
          "type": "tuple"
        }
      ],
      "name": "rescue_custom_gate_linearization_contribution",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "X",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "Y",
              "type": "uint256"
            }
          ],
          "internalType": "struct PairingsBn254.G1Point",
          "name": "result",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "public_inputs",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "serialized_proof",
          "type": "uint256[]"
        }
      ],
      "name": "verify_serialized_proof",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b506146bf806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063330deb9f1461005157806338fdad141461007957806397e2957d14610099578063fec4e96e146100b9575b600080fd5b61006461005f366004613a42565b6100ce565b60405190151581526020015b60405180910390f35b61008c61008736600461435b565b610111565b6040516100709190614485565b6100ac6100a736600461435b565b610266565b60405161007091906144fe565b6100cc6100c736600461459f565b6105ca565b005b6000806100d9610678565b602081015190915085146100ec57600080fd5b60006100fa87878787610e07565b90506101068183611252565b979650505050505050565b6040805180820190915260008082526020820152604080516020810190915260008152604080516020810190915260008152608085015161016a9060005b60200201516040805160208101909152600081529051815290565b91506101768280611537565b608085015161018e9060015b60200201518390611551565b60808401516101a69060015b60200201518390611537565b6101b08183611583565b60808501516101c090600161014f565b91506101cc8280611537565b60808501516101dc906002610182565b60808401516101ec90600261019a565b6101f68183611583565b608085015161020690600261014f565b608086015190925061021990600061019a565b6080850151610229906003610182565b608084015161023990600361019a565b6102438183611583565b606086015161025c90829060015b60200201519061159d565b9695505050505050565b61026e6132d4565b600260005b60048110156102f15784602001518160048110610292576102926145c3565b6020020151835183600d81106102aa576102aa6145c3565b6020020152608085015181600481106102c5576102c56145c3565b6020020151836020015183600d81106102e0576102e06145c3565b602002015260019182019101610273565b50606085015151825182600d811061030b5761030b6145c3565b602002015260c084015160006020020151826020015182600d8110610332576103326145c3565b602002015260010160005b610349600160046145ef565b8110156103c5578560a001518160048110610366576103666145c3565b6020020151835183600d811061037e5761037e6145c3565b602002015260e08501518160038110610399576103996145c3565b6020020151836020015183600d81106103b4576103b46145c3565b60200201526001918201910161033d565b50604084810151908301515260208401516103e2600160046145ef565b600481106103f2576103f26145c3565b6020908102919091015160408401518201526101008501516060840180519190915260a0808701515191519092015260e08601515190840151600090610448906040805160208101909152600081529051815290565b905060015b600481101561049b57610470828960e001518360048110610251576102516145c3565b61024087018190526104839084906115dc565b60a0860151610493908390611537565b60010161044d565b508351829084600d81106104b1576104b16145c3565b6020020181905250856101e00151846020015184600d81106104d5576104d56145c3565b602002015260c087015184516001949094019384600d81106104f9576104f96145c3565b6020020181905250856102200151846020015184600d811061051d5761051d6145c3565b602002015261010087015184516001949094019384600d8110610542576105426145c3565b6020020181905250856102400151846020015184600d8110610566576105666145c3565b602002015250610160850151604084810180518201929092526101a0870151606080870180519093019190915261018088015183518201526101c0880151825190910152905160809081019290925261020090950151945101939093529392505050565b6020810151516000036105dc57600080fd5b6105e660016115eb565b608082018051919091526020808301805160408051808501825260008082529251815294518401949094529051835192830190935281529051815260025b600981101561067357602083015161063d908390611537565b6040805160208101909152600081528251815283608001518260098110610666576106666145c3565b6020020152600101610624565b505050565b610680613313565b6001602082015261010081526106b57f1058a83d529be585820b96ff0a13f2dbd8675a9e5dd2336a6692cc1e5a526c816115eb565b60408201526107047f05f5cabc4eab14cfabee1334ef7f33a66259cc9fd07af862308d5c41765adb4b7f128a103fbe66c8ff697182c0963d963208b55a5a53ddeab9b4bc09dc2a68a9cc611626565b6080820151526107547f0d9980170c334c107e6ce4d66bbc4d23bbcdc97c020b1e1c3f6e04c6c663d2c27f0968205845091ceaf3f863b1613fbdf7ce9a87ccfd97f22011679e6350384419611626565b6080820151602001526107a77f0c84a19b149a1612cb042ad86382b9e94367c0add60d07e12399999e7db09efe7f1e02f70c44c9bfb7bf2164cee2ab4813bcb9be56eb432e2e9dfffffe196d846d611626565b6080820151604001526107fa7f1eb3599506a41a7d62e1f7438d6732fbb9d1eda7b9c7a0213eca63c9334ac5a97f23563d9f429908d8ea80bffa642840fb081936d45b388bafc504d9b1e5b1c410611626565b60808201516060015261080f60006001611626565b60808281015101526108617f063e8dac7ee3ee6a4569fd53b416fe17f8f10de8c435c336e5a1cf2e026432007f1d4c1781b78f926d55f89ef72abb96bee350ce60ddc684f5a02d87c5f4cdf943611626565b608082015160a0015261087660006001611626565b608082015160c001526108c97f0b487eb34c8480ea506f5c6c25857155d61d7f9824b60bc80e1a415a5bcf247f7f07ea0d0d0df9dbcc944e9341a5bb49ae796d9dc9d7ca1c032b53784715b946db611626565b6060820151526109197f0fa66faa0b9ea782eb400175ac9f0c05f0de64332eec54a87cd20db4540baec27f07dea33d314c690c4bd4b21deda1a44b9f8dd87e539024622768c2f8b8bdabe1611626565b60608201516020015261096c7f120482c52e31d2373f9b2dc80a47e68f035e278d220fa8a89d0c81f1333439537f02928a78ea2e1a943e9220b7e288fd48a561263f8e5f94518f21aaa43781ceac611626565b60a0820151526109bc7f1dfad2c4d60704bcf6af0abd9cce09151f063c4b52200c268e470c6a6c93cbca7f08b28dd6ca14d7c33e078fe0f332a9a4d95ac8df171355de9e69930aec02b5dc611626565b60a082015160200152610a0f7f0935a4fd6ab67925929661cf2d2e814f87f589ee6234cb9675ecc2d897f1b3387f1032ccc41c047413fce4a847ba7e51e4a2ea406d89a88d480c5f0efaf6c8c89a611626565b60a082015160400152610a627f0eafaea3af7d1fadb2138db1b991af5d2218f6892714fd019898c7e1a43ecfe87f28fb17eda285ed74cc9771d62fad22ab459bbb0a4968c489972aca8b7e618fcb611626565b60a082015160600152610ab57f155201a564e721b1f5c06315ad4e24eaad3cbdd6197b19cd903fe85613080f867f12fb201bc896572ac14357e2601f5118636f1eeb7b89c177ac940aac3b5253ec611626565b60c0820152610b047f1cb0e2ae4d52743898d94d7f1729bd0d3357ba035cdb6b3af7ebff9159f8f2977f15ee595227c9e0f7a487ddb8072d5ea3cfd058bc569211c3546bc0e80051553f611626565b60e082015152610b547f13e4ab94c03a5a29719930c1361d854e244cf918f1e29cb031303f4a13b719777f0f792ef4c6c8746c97be61ed9b20f31ba2dec3bd5c91a2d9a4a586f19af3a07c611626565b60e082015160200152610ba77f1c9e69bd2b04240ebe44fb23d67c596fce4a1336109fdce38c2f184a63cd8acc7f1cbd3e72bdbce827227e503690b10be9365ae760e9d2babde5ba81edf12f8206611626565b60e082015160400152610bfa7f2a0d46339fbf72104df6a241b53a957602b1a16f6e3b9f89bf3e4c4645df823c7f11a601d7b2eee4b7885f34c9873426ba1263f38eae2e0351d653b8b1ba9c67f6611626565b60e082015160600152610c4d7f1a70e43f18b18d686807c2b1c6471cd949dd251b48090bca443d86b97afae9517f0e6e23ad15a1bd851b228788ae4a03bf25bda39ede6d5a92d501a8402a0dfe43611626565b610100820152610c5d60056115eb565b61012082015152610c6e60076115eb565b61012082015160200152610c82600a6115eb565b61012082015160026020020181905250610d4460405180604001604052807f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81525060405180604001604052807f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa815250611651565b610140820151526040805180820182527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b060208281019190915282518084019093527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe483527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5590830152610dfa91611651565b6101408201516020015290565b610e0f6133d5565b836001600160401b03811115610e2757610e27613aad565b604051908082528060200260200182016040528015610e50578160200160208202803683370190505b50815260005b84811015610ea057858582818110610e7057610e706145c3565b9050602002013582600001518281518110610e8d57610e8d6145c3565b6020908102919091010152600101610e56565b506000805b6004811015610f1a57610ef1858584818110610ec357610ec36145c3565b905060200201358686610ed68660010190565b818110610ee557610ee56145c3565b90506020020135611659565b83602001518260048110610f0757610f076145c3565b6020020152600282019150600101610ea5565b50610f43848483818110610f3057610f306145c3565b905060200201358585610ed68560010190565b6040830152600201610f60848483818110610f3057610f306145c3565b610160830152600201610f7e848483818110610f3057610f306145c3565b61018083015260020160005b6004811015610fd157610fa8858584818110610ec357610ec36145c3565b83606001518260048110610fbe57610fbe6145c3565b6020020152600282019150600101610f8a565b5060005b600481101561102657610fff858584818110610ff357610ff36145c3565b905060200201356115eb565b83608001518260048110611015576110156145c3565b602002015260019182019101610fd5565b5060005b600181101561106f57611048858584818110610ff357610ff36145c3565b8360a00151826001811061105e5761105e6145c3565b60200201526001918201910161102a565b5060005b60018110156110b857611091858584818110610ff357610ff36145c3565b8360c0015182600181106110a7576110a76145c3565b602002015260019182019101611073565b5060005b6003811015611101576110da858584818110610ff357610ff36145c3565b8360e0015182600381106110f0576110f06145c3565b6020020152600191820191016110bc565b50611117848483818110610ff357610ff36145c3565b610100830152600101611135848483818110610ff357610ff36145c3565b6101a0830152600101611153848483818110610ff357610ff36145c3565b6101c0830152600101611171848483818110610ff357610ff36145c3565b6101e083015260010161118f848483818110610ff357610ff36145c3565b6102008301526001016111ad848483818110610ff357610ff36145c3565b6102208301526001016111cb848483818110610ff357610ff36145c3565b6102408301526001016111e9848483818110610ff357610ff36145c3565b610120830152600101611207848483818110610ff357610ff36145c3565b610140830152600101611225848483818110610f3057610f306145c3565b610260830152600201611243848483818110610f3057610f306145c3565b61028083015250949350505050565b60008061125f84846117f1565b905061126c838583611b2a565b151560000361127f576000915050611531565b60608401516000906112b890825b6020020151604080518082019091526000808252602080830191825283518352929092015190915290565b84516101808401519192506000916112cf91611e23565b604080516020808201835260008083528451835283518085019094528084529083015291925060015b60048110156113425761131a8960600151826004811061128d5761128d6145c3565b91506113268284611ea2565b61133085836115dc565b61133a8385611537565b6001016112f8565b505050506000611353858785610266565b80518390526101208701516020820151529050611371858785611ead565b8151602090810191909152610140870151818301805190920152815151905151600061139d60016115eb565b90506113bc604051806040016040528060008152602001600081525090565b60015b600d811015611445576101408801516113d9908490611537565b6113f383876000015183600d8110610251576102516145c3565b91506113ff85836115dc565b856020015181600d8110611415576114156145c3565b6020020151610220890181905261142c9084611537565b61022088015161143d908590611583565b6001016113bf565b50610140870151611457908390611537565b6000611474838760400151600060068110610251576102516145c3565b6060870151519091506114878185611537565b60015b6006811015611510576101408a01516114a4908690611537565b6114be8589604001518360068110610251576102516145c3565b93506114ca83856115dc565b876060015181600681106114e0576114e06145c3565b60200201516102208b018190526114f79086611537565b6102208a0151611508908390611583565b60010161148a565b506115258b61014001518d8b89868a876122be565b99505050505050505050505b92915050565b60008051602061466a833981519152815183510990915250565b60008051602061466a833981519152815161157a9060008051602061466a8339815191526145ef565b83510890915250565b60008051602061466a833981519152815183510890915250565b604080518082019091526000808252602082015282511580156115c4575082602001516001145b156115d157600060208401525b611531838383612466565b6115e78282846124a8565b5050565b60408051602081019091526000815260008051602061466a833981519152821061161457600080fd5b50604080516020810190915290815290565b60408051808201909152600080825260208201525b5060408051808201909152918252602082015290565b61163b6135e3565b604080518082019091526000808252602082015282158015611679575081155b1561169a576040518060400160405280848152602001838152509050611531565b60008051602061464a83398151915283106116f15760405162461bcd60e51b81526020600482015260126024820152711e08185e1a5cc81a5cdb89dd081d985b1a5960721b60448201526064015b60405180910390fd5b60008051602061464a83398151915282106117435760405162461bcd60e51b81526020600482015260126024820152711e48185e1a5cc81a5cdb89dd081d985b1a5960721b60448201526064016116e8565b600060008051602061464a8339815191528384099050600060008051602061464a833981519152858609905060008051602061464a833981519152858209905060008051602061464a8339815191526003820890508082146117d95760405162461bcd60e51b815260206004820152600f60248201526e6973206e6f74206f6e20637572766560881b60448201526064016116e8565b50506040805180820190915292835250602082015290565b6117f9613603565b60408051606081018252600080825260208201819052918101829052905b836020015181101561185b576118538560000151828151811061183c5761183c6145c3565b60200260200101518361253890919063ffffffff16565b600101611817565b5060005b60048110156118955761188d85602001518260048110611881576118816145c3565b602002015183906125c6565b60010161185f565b5061189f816125e2565b60a08301526101608401516118b59082906125c6565b6118be816125e2565b60408301526118cc816125e2565b606083015260408401516118e19082906125c6565b6118ea816125e2565b60c08301526118f8816125e2565b60e083015261018084015161190e9082906125c6565b611917816125e2565b602083015260005b60048110156119495761194185606001518260048110611881576118816145c3565b60010161191f565b50611953816125e2565b61018083015261012084015161196a908290612688565b60005b60048110156119a35761199b8560800151826004811061198f5761198f6145c3565b60200201518390612688565b60010161196d565b5060005b60018110156119d1576119c98560a00151826001811061198f5761198f6145c3565b6001016119a7565b5060005b60018110156119ff576119f78560c00151826001811061198f5761198f6145c3565b6001016119d5565b5060005b6003811015611a2d57611a258560e00151826003811061198f5761198f6145c3565b600101611a03565b506101808201516040805160208101825260008152915182526101a08401829052840151611a5b9190611537565b610100840151611a6c908290612688565b6101e0840151611a7d908290612688565b610220840151611a8e908290612688565b610240840151611a9f908290612688565b6101a0840151611ab0908290612688565b6101c0840151611ac1908290612688565b610200840151611ad2908290612688565b610140840151611ae3908290612688565b611aec816125e2565b610140830152610260840151611b039082906125c6565b610280840151611b149082906125c6565b611b1d816125e2565b6101608301525092915050565b60008084602001516001600160401b03811115611b4957611b49613aad565b604051908082528060200260200182016040528015611b72578160200160208202803683370190505b50905060005b8151811015611ba75780828281518110611b9457611b946145c3565b6020908102919091010152600101611b78565b506000611bb460006115eb565b905060005b8660200151811015611c3257611bde8188600001518960400151886101800151612696565b61022086015285518051611c1991611c0d9184908110611c0057611c006145c3565b60200260200101516115eb565b61022087015190611537565b610220850151611c2a908390611583565b600101611bb9565b5060c0850151611c4b9060005b60200201518290611537565b61014085015160408051602081019091526000815290518152611c6e8183611583565b611c77856105ca565b6080850151600090611c8a90600461014f565b9050611ca48761010001518261153790919063ffffffff16565b611cb0600160046145ef565b600314611cbc57600080fd5b60408051602081019091526000815260005b6003811015611d5057611cf08960e00151826003811061014f5761014f6145c3565b9150611d0988604001518361153790919063ffffffff16565b611d2e89608001518260048110611d2257611d226145c3565b60200201518390611583565b6060880151611d3e908390611583565b611d488383611537565b600101611cce565b506080880151611d6190600361014f565b9050611d7a87606001518261158390919063ffffffff16565b611d848282611537565b611d8e8383611551565b6000611da38a60000151896101800151612744565b6080890151909150611db6906005611c3f565b611dc08482611551565b6000611dcd8b8b8b6127ca565b9050611dd98582611583565b6101208a0151604080516020810190915260008152905181528b516101808b0151611e0e91611e0791612a1a565b8290611537565b945194519094149a9950505050505050505050565b604080516020808201835260008252825160c08101845281815280820182905292830152835160608301526080820183905260008051602061466a83398151915260a083015290611e726137b7565b600060208260c08560055afa905080611e8a57600080fd5b50604080516020810190915290518152949350505050565b6115e7828284612466565b6040805180820190915260008082526020820152611ecc600080611626565b90506000611efb8460800151600060048110611eea57611eea6145c3565b602002015160808701516000610251565b9050611f0782826115dc565b6080840151611f23906001602002015160808701516001610251565b9050611f2f82826115dc565b6080840151611f4b906002602002015160808701516002610251565b9050611f5782826115dc565b6080840151611f73906003602002015160808701516003610251565b9050611f7f82826115dc565b6080840151600090611f91908261014f565b6080860151909150611fa4906001611c3f565b6080860151611fb69082906004610251565b9150611fc283836115dc565b608086015160a00151611fd69084906115dc565b60a0850151516080870151611fed91906006610251565b9150611ff983836115dc565b60c08501515161200a908490611ea2565b6000612017878787610111565b905061202384826115dc565b61202f600160046145ef565b60031461203b57600080fd5b600061204760016115eb565b90506000612065876080015160046009811061014f5761014f6145c3565b905060005b600481101561212d57610180880151604080516020810190915260008152905181529450806000036120a5576120a08584611537565b6120d6565b6101208a01516120d6906120ba6001846145ef565b600381106120ca576120ca6145c3565b60200201518690611537565b60408801516120e6908690611537565b60608801516120f6908690611583565b61211b8960800151826004811061210f5761210f6145c3565b60200201518690611583565b6121258286611537565b60010161206a565b50604088015161213d908261159d565b945061214986866115dc565b608087015161215990600461014f565b905061217287604001518261153790919063ffffffff16565b610100880151612183908290611537565b60005b612192600160046145ef565b811015612206576121b28960e00151826003811061014f5761014f6145c3565b94506121cb88604001518661153790919063ffffffff16565b60608801516121db908690611583565b6121f48960800151826004811061210f5761210f6145c3565b6121fe8286611537565b600101612186565b5060a08901516122199082906003610251565b94506122258686612a49565b61223f60008a600001518b604001518a6101800151612696565b6101e088018190525160000361225457600080fd5b506101e086015160408051602081019091526000815290518152608087015161227e906005611c3f565b604088015161228d908261159d565b945061229986866115dc565b60006122a58989612a54565b90506122b187826115dc565b5050505050509392505050565b604080518082019091526000808252602080830182815287518452908701519052906122f887610160015186611ea290919063ffffffff16565b61230281866115dc565b60408051602081019091526000815283518152610160880151612326908290611537565b6123308186611583565b600061236882612362604080518082018252600080825260209182015281518083019092526001825260029082015290565b9061159d565b90506123748382612a49565b6101808901516102608b01516123899161159d565b905060006123ac8a6101a001516040805160208101909152600081529051815290565b90506123c68a61016001518261153790919063ffffffff16565b6102808b01516000906123d9908361159d565b90506123e583826115dc565b6123ef85846115dc565b600061240e8c61016001518e610280015161159d90919063ffffffff16565b90506124288d6102600151826115dc90919063ffffffff16565b61243181612d22565b8d5160208f01516000612442612d62565b905061245089848685612e22565b9950505050505050505050979650505050505050565b61246e6137d5565b835181526020840151816001602002015282518160026020020152600060408360608460075afa9050806124a157600080fd5b5050505050565b81511580156124b957506020820151155b156124d1578251815260209283015192019190915250565b82511580156124e257506020830151155b156124f7578151815260209182015191015250565b6124ff6137f3565b8351815260208085015181830152835160408301528301518160035b6020020152600060408360808460065afa9050806124a157600080fd5b81516020808401516040516000928101929092526024820183905260448201526064810183905260840160408051808303601f1901815291815281516020928301208552848201519051600160e01b928101929092526024820183905260448201526064810183905260840160408051601f1981840301815291905280516020918201209301929092525050565b6125d4828260000151612538565b6115e7828260200151612538565b60408051602081019091526000815281516020808401516040808601519051600160e11b938101939093526024830193909352604482015260e09190911b6001600160e01b03191660648201526000906068016040516020818303038152906040528051906020012090506001836040018181516126609190614602565b63ffffffff1690525060408051602081019091526001600160fd1b0391909116815292915050565b6115e7828260000151612538565b6040805160208101909152600081528385106126b157600080fd5b60006126bd60016115eb565b905060006126cb8588611e23565b90506126d78487611e23565b92506126e38383611551565b82516000036126f157600080fd5b6126fb8382611537565b604080516020810190915260008152845181526127188183611551565b612724611e07886115eb565b61272d81612f22565b90506127398482611537565b505050949350505050565b604080516020810190915260008152600061275f60016115eb565b9050600061276c856115eb565b6040805160208101909152600081528551815290915061278c8184611551565b6127968183611537565b61279f81612f22565b90506127ab8587611e23565b93506127b78484611551565b6127c18482611537565b50505092915050565b60408051602081019091526000815260408051602081019091526000815260006127f460016115eb565b90506128148460c001516040805160208101909152600081529051815290565b61010085018190526128269082611583565b61010084015160408051602081019091526000815290518152610120850181905260e08501516128569190611537565b6101a08501516040805160208101909152600081529051815291506128888460c001518361153790919063ffffffff16565b610120840151612899908390611583565b6101c08501516128aa908390611537565b60808401516128ba90600661019a565b60006128db600188600001516128d091906145ef565b604089015190611e23565b90506128fc8561018001516040805160208101909152600081529051815290565b6101c0860181905261290e9082611551565b6101c085015161291f908490611537565b6129298484611583565b612943600088600001518960400151886101800151612696565b6101e0860181905260408051602081019091526000815290518152608086015160e00151909350612975908490611537565b61297f8484611551565b60006129a16001896000015161299591906145ef565b61012088015190611e23565b90506129c9600189600001516129b791906145ef565b895160408b01516101808a0151612696565b61020087018190526040805160208101909152600081529051815293506129f08482611537565b60808601516101000151612a05908590611537565b612a0f8585611551565b505050509392505050565b604080516020810190915260008152612a338284611e23565b9050611531612a4260016115eb565b8290611551565b6115e7828284612f61565b60408051808201909152600080825260208201526000612a7460006115eb565b9050612a8c6040518060200160405280600081525090565b60408051602080820183526000918290526101c08801518351918201909352908152905181526080850151612ac2906006611c3f565b6101c0850151612ad3908290611537565b610160860151600090612ae6908361159d565b9050612af285826115dc565b610200870151604080516020810190915260008152905181529150612b248660c001518361153790919063ffffffff16565b6101e0870151612b35908390611583565b610120860151612b46908390611583565b6040805160208101909152600081526000612b6160016115eb565b9050612b796040518060200160405280600081525090565b60005b612b88600160046145ef565b811015612bd657612ba88b60800151826004811061014f5761014f6145c3565b9150612bb48284611537565b612bbe8483611583565b60a08a0151612bce908490611537565b600101612b7c565b506102408a0151604080516020810190915260008152905181529550612bfc8683611537565b612c068387611583565b6102208a0151612c17908490611537565b60e0890151612c27908490611583565b612c318584611537565b610100890151612c42908690611537565b604080516020810190915260008152875181529550612c618686611551565b6080890151869550612c749060066120ca565b6101c0890151612c85908690611537565b6101e08901516040805160208101909152600081529051815260808a0151909650612cb99060075b60200201518790611537565b612cc38587611583565b6102008901516040805160208101909152600081529051815260808a0151909650612cef906008612cad565b612cf98587611583565b6101808a0151612d09908661159d565b9350612d1588856115dc565b5050505050505092915050565b8060200151600003612d3d57805115612d3a57600080fd5b50565b6020810151612d5a9060008051602061464a8339815191526145ef565b602090910152565b612d6a6135e3565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b82527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60208381019190915281019190915290565b60408051600280825260608201909252600091829190816020015b6040805180820190915260008082526020820152815260200190600190039081612e3d5750506040805160028082526060820190925291925060009190602082015b612e876135e3565b815260200190600190039081612e7f5790505090508682600081518110612eb057612eb06145c3565b60200260200101819052508482600181518110612ecf57612ecf6145c3565b60200260200101819052508581600081518110612eee57612eee6145c3565b60200260200101819052508381600181518110612f0d57612f0d6145c3565b6020026020010181905250610106828261300b565b6040805160208101909152600081528151600003612f3f57600080fd5b61153182612f5c600260008051602061466a8339815191526145ef565b611e23565b8151158015612f7257506020820151155b15612f8a578251815260209283015192019190915250565b8251158015612f9b57506020830151155b15612fcb57815181526020820151612fc19060008051602061464a8339815191526145ef565b6020909101525050565b612fd36137f3565b8351815260208085015181830152835160408301528301516130039060008051602061464a8339815191526145ef565b81600361251b565b6000815183511461301b57600080fd5b8251600061302a82600661461f565b90506000816001600160401b0381111561304657613046613aad565b60405190808252806020026020018201604052801561306f578160200160208202803683370190505b50905060005b838110156132a05786818151811061308f5761308f6145c3565b602002602001015160000151828260066130a9919061461f565b6130b4906000614636565b815181106130c4576130c46145c3565b6020026020010181815250508681815181106130e2576130e26145c3565b602002602001015160200151828260066130fc919061461f565b613107906001614636565b81518110613117576131176145c3565b602002602001018181525050858181518110613135576131356145c3565b602090810291909101015151518261314e83600661461f565b613159906002614636565b81518110613169576131696145c3565b602002602001018181525050858181518110613187576131876145c3565b602090810291909101810151510151826131a283600661461f565b6131ad906003614636565b815181106131bd576131bd6145c3565b6020026020010181815250508581815181106131db576131db6145c3565b6020026020010151602001516000600281106131f9576131f96145c3565b60200201518261320a83600661461f565b613215906004614636565b81518110613225576132256145c3565b602002602001018181525050858181518110613243576132436145c3565b602002602001015160200151600160028110613261576132616145c3565b60200201518261327283600661461f565b61327d906005614636565b8151811061328d5761328d6145c3565b6020908102919091010152600101613075565b506132a96137b7565b6000602082602086026020860160085afa9050806132c657600080fd5b505115159695505050505050565b60405180608001604052806132e7613811565b81526020016132f461384b565b8152602001613301613880565b815260200161330e6138aa565b905290565b60405180610160016040528060008152602001600081526020016133436040518060200160405280600081525090565b81526020016133506138cb565b815260200161335d6138f3565b815260200161336a61391e565b815260200161338c604051806040016040528060008152602001600081525090565b815260200161339961391e565b81526020016133bb604051806040016040528060008152602001600081525090565b81526020016133c8613947565b815260200161330e613968565b604051806102a00160405280606081526020016133f061391e565b8152602001613412604051806040016040528060008152602001600081525090565b815260200161341f61391e565b815260200161342c613995565b81526040805180820182526000602080830182815283528085019290925282518084018452918201908152815290820152606001613468613947565b81526020016134836040518060200160405280600081525090565b815260200161349e6040518060200160405280600081525090565b81526020016134b96040518060200160405280600081525090565b81526020016134db604051806040016040528060008152602001600081525090565b81526020016134fd604051806040016040528060008152602001600081525090565b81526020016135186040518060200160405280600081525090565b81526020016135336040518060200160405280600081525090565b815260200161354e6040518060200160405280600081525090565b81526020016135696040518060200160405280600081525090565b81526020016135846040518060200160405280600081525090565b815260200161359f6040518060200160405280600081525090565b81526020016135c1604051806040016040528060008152602001600081525090565b815260200161330e604051806040016040528060008152602001600081525090565b60405180604001604052806135f66139b6565b815260200161330e6139b6565b60408051610280810182526000610260820181815282528251602080820185528282528084019190915283518082018552828152838501528351908101909352825290606082019081526020016136586139d4565b81526020016136736040518060200160405280600081525090565b815260200161368e6040518060200160405280600081525090565b81526020016136a96040518060200160405280600081525090565b81526020016136c46040518060200160405280600081525090565b81526020016136df6040518060200160405280600081525090565b81526020016136fa6040518060200160405280600081525090565b81526020016137156040518060200160405280600081525090565b81526020016137306040518060200160405280600081525090565b815260200161374b6040518060200160405280600081525090565b81526020016137666040518060200160405280600081525090565b81526020016137816040518060200160405280600081525090565b815260200161379c6040518060200160405280600081525090565b81526020016135c16040518060200160405280600081525090565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101a00160405280600d905b60408051808201909152600080825260208201528152602001906001900390816138215790505090565b604051806101a00160405280600d905b60408051602081019091526000815281526020019060019003908161385b5790505090565b604080516101008101909152600060c0820181815260e08301919091528152600560208201613821565b6040805160e08101909152600060c08201908152815260056020820161385b565b6040805160808101825260009181018281526060820192909252908152600160208201613821565b604080516101208101909152600060e082018181526101008301919091528152600660208201613821565b6040805160c0810190915260006080820181815260a08301919091528152600360208201613821565b6040805160808101909152600060608201908152815260026020820161385b565b60405180604001604052806002905b61397f6135e3565b8152602001906001900390816139775790505090565b6040805160a08101909152600060808201908152815260036020820161385b565b60405180604001604052806002906020820280368337509192915050565b60408051610140810190915260006101208201908152815260086020820161385b565b60008083601f840112613a0957600080fd5b5081356001600160401b03811115613a2057600080fd5b6020830191508360208260051b8501011115613a3b57600080fd5b9250929050565b60008060008060408587031215613a5857600080fd5b84356001600160401b0380821115613a6f57600080fd5b613a7b888389016139f7565b90965094506020870135915080821115613a9457600080fd5b50613aa1878288016139f7565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613ae557613ae5613aad565b60405290565b6040516102a081016001600160401b0381118282101715613ae557613ae5613aad565b60405161026081016001600160401b0381118282101715613ae557613ae5613aad565b60405161016081016001600160401b0381118282101715613ae557613ae5613aad565b604051608081016001600160401b0381118282101715613ae557613ae5613aad565b600060208284031215613b8857600080fd5b604051602081018181106001600160401b0382111715613baa57613baa613aad565b6040529135825250919050565b600060408284031215613bc957600080fd5b613bd1613ac3565b9050813581526020820135602082015292915050565b600082601f830112613bf857600080fd5b613c00613ac3565b806080840185811115613c1257600080fd5b845b81811015613c3657613c268782613bb7565b8452602090930192604001613c14565b509095945050505050565b600082601f830112613c5257600080fd5b6040805160e081018181106001600160401b0382111715613c7557613c75613aad565b8252806101c0850186811115613c8a57600080fd5b855b81811015613cad57613c9e8882613bb7565b83526020909201918401613c8c565b50919695505050505050565b600082601f830112613cca57600080fd5b613cd2613b54565b80610100840185811115613ce557600080fd5b845b81811015613c3657613cf98782613bb7565b8452602090930192604001613ce7565b600082601f830112613d1a57600080fd5b604051606081018181106001600160401b0382111715613d3c57613d3c613aad565b604052806060840185811115613d5157600080fd5b845b81811015613d7357613d658782613b76565b835260209283019201613d53565b509195945050505050565b600082601f830112613d8f57600080fd5b613d97613ac3565b806040840185811115613da957600080fd5b845b81811015613c36578035845260209384019301613dab565b600082601f830112613dd457600080fd5b613ddc613ac3565b80610100840185811115613def57600080fd5b845b81811015613c365760808188031215613e0a5760008081fd5b613e12613ac3565b613e1c8883613d7e565b8152613e2b8860408401613d7e565b6020828101919091529085529390930192608001613df1565b600082601f830112613e5557600080fd5b813560206001600160401b0380831115613e7157613e71613aad565b8260051b604051601f19603f83011681018181108482111715613e9657613e96613aad565b604052938452858101830193838101925087851115613eb457600080fd5b83870191505b8482101561010657813583529183019190830190613eba565b600082601f830112613ee457600080fd5b613eec613b54565b806080840185811115613efe57600080fd5b845b81811015613c3657613f128782613b76565b845260209384019301613f00565b600082601f830112613f3157600080fd5b60405160208082018281106001600160401b0382111715613f5457613f54613aad565b6040528184820186811115613f6857600080fd5b855b81811015613f8957613f7c8882613b76565b8352918301918301613f6a565b50929695505050505050565b60006105a08284031215613fa857600080fd5b613fb0613aeb565b905081356001600160401b03811115613fc857600080fd5b613fd484828501613e44565b825250613fe48360208401613cb9565b6020820152610120613ff884828501613bb7565b604083015261016061400c85828601613cb9565b606084015261026061402086828701613ed3565b6080850152614033866102e08701613f20565b60a0850152614046866103008701613f20565b60c0850152614059866103208701613d09565b60e085015261406c866103808701613b76565b610100850152614080866103a08701613b76565b83850152614092866103c08701613b76565b6101408501526140a6866103e08701613bb7565b828501526140b8866104208701613bb7565b6101808501526140cc866104608701613b76565b6101a08501526140e0866104808701613b76565b6101c08501526140f4866104a08701613b76565b6101e0850152614108866104c08701613b76565b61020085015261411c866104e08701613b76565b610220850152614130866105008701613b76565b610240850152614144866105208701613bb7565b81850152505050614159836105608401613bb7565b61028082015292915050565b600082601f83011261417657600080fd5b6040516101208082018281106001600160401b038211171561419a5761419a613aad565b604052830181858211156141ad57600080fd5b845b82811015613d73576141c18782613b76565b8252602091820191016141af565b600061038082840312156141e257600080fd5b6141ea613b0e565b90506141f68383613b76565b81526142058360208401613b76565b60208201526142178360408401613b76565b60408201526142298360608401613b76565b606082015261423b8360808401614165565b60808201526101a061424f84828501613b76565b60a08301526101c061426385828601613b76565b60c08401526101e061427786828701613b76565b60e085015261020061428b87828801613b76565b6101008601526102206142a088828901613b76565b6101208701526102406142b589828a01613b76565b6101408801526142c9896102608a01613b76565b6101608801526142dd896102808a01613b76565b6101808801526142f1896102a08a01613b76565b86880152614303896102c08a01613b76565b85880152614315896102e08a01613b76565b84880152614327896103008a01613b76565b83880152614339896103208a01613b76565b8288015261434b896103408a01613bb7565b8188015250505050505092915050565b6000806000838503610a2081121561437257600080fd5b6106808082121561438257600080fd5b61438a613b31565b915085358252602086013560208301526143a78760408801613b76565b60408301526143b98760608801613be7565b60608301526143cb8760e08801613c41565b60808301526143de876102a08801613cb9565b60a08301526143f1876103a08801613bb7565b60c0830152614404876103e08801613cb9565b60e0830152614417876104e08801613bb7565b61010083015261442b876105208801613d09565b61012083015261443f876105808801613dc3565b6101408301529093508401356001600160401b0381111561445f57600080fd5b61446b86828701613f95565b92505061447c856106a086016141cf565b90509250925092565b815181526020808301519082015260408101611531565b8060005b60068110156144d4576144be84835180518252602090810151910152565b60409390930192602091909101906001016144a0565b50505050565b8060005b60068110156144d4578151518452602093840193909101906001016144de565b81516107208201908260005b600d81101561453e5761452882845180518252602090810151910152565b602092909201916040919091019060010161450a565b505050602080840151610340840160005b600d81101561456d578251518252918301919083019060010161454f565b5050505060408301516145846104e084018261449c565b5060608301516145986106608401826144da565b5092915050565b600061038082840312156145b257600080fd5b6145bc83836141cf565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115611531576115316145d9565b63ffffffff818116838216019080821115614598576145986145d9565b8082028115828204841417611531576115316145d9565b80820180821115611531576115316145d956fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220525eba758bf7c42a7d1cf6a05eb2cf3dd25b2caf7bb388aee220ed13d5aa7c8f64736f6c63430008110033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063330deb9f1461005157806338fdad141461007957806397e2957d14610099578063fec4e96e146100b9575b600080fd5b61006461005f366004613a42565b6100ce565b60405190151581526020015b60405180910390f35b61008c61008736600461435b565b610111565b6040516100709190614485565b6100ac6100a736600461435b565b610266565b60405161007091906144fe565b6100cc6100c736600461459f565b6105ca565b005b6000806100d9610678565b602081015190915085146100ec57600080fd5b60006100fa87878787610e07565b90506101068183611252565b979650505050505050565b6040805180820190915260008082526020820152604080516020810190915260008152604080516020810190915260008152608085015161016a9060005b60200201516040805160208101909152600081529051815290565b91506101768280611537565b608085015161018e9060015b60200201518390611551565b60808401516101a69060015b60200201518390611537565b6101b08183611583565b60808501516101c090600161014f565b91506101cc8280611537565b60808501516101dc906002610182565b60808401516101ec90600261019a565b6101f68183611583565b608085015161020690600261014f565b608086015190925061021990600061019a565b6080850151610229906003610182565b608084015161023990600361019a565b6102438183611583565b606086015161025c90829060015b60200201519061159d565b9695505050505050565b61026e6132d4565b600260005b60048110156102f15784602001518160048110610292576102926145c3565b6020020151835183600d81106102aa576102aa6145c3565b6020020152608085015181600481106102c5576102c56145c3565b6020020151836020015183600d81106102e0576102e06145c3565b602002015260019182019101610273565b50606085015151825182600d811061030b5761030b6145c3565b602002015260c084015160006020020151826020015182600d8110610332576103326145c3565b602002015260010160005b610349600160046145ef565b8110156103c5578560a001518160048110610366576103666145c3565b6020020151835183600d811061037e5761037e6145c3565b602002015260e08501518160038110610399576103996145c3565b6020020151836020015183600d81106103b4576103b46145c3565b60200201526001918201910161033d565b50604084810151908301515260208401516103e2600160046145ef565b600481106103f2576103f26145c3565b6020908102919091015160408401518201526101008501516060840180519190915260a0808701515191519092015260e08601515190840151600090610448906040805160208101909152600081529051815290565b905060015b600481101561049b57610470828960e001518360048110610251576102516145c3565b61024087018190526104839084906115dc565b60a0860151610493908390611537565b60010161044d565b508351829084600d81106104b1576104b16145c3565b6020020181905250856101e00151846020015184600d81106104d5576104d56145c3565b602002015260c087015184516001949094019384600d81106104f9576104f96145c3565b6020020181905250856102200151846020015184600d811061051d5761051d6145c3565b602002015261010087015184516001949094019384600d8110610542576105426145c3565b6020020181905250856102400151846020015184600d8110610566576105666145c3565b602002015250610160850151604084810180518201929092526101a0870151606080870180519093019190915261018088015183518201526101c0880151825190910152905160809081019290925261020090950151945101939093529392505050565b6020810151516000036105dc57600080fd5b6105e660016115eb565b608082018051919091526020808301805160408051808501825260008082529251815294518401949094529051835192830190935281529051815260025b600981101561067357602083015161063d908390611537565b6040805160208101909152600081528251815283608001518260098110610666576106666145c3565b6020020152600101610624565b505050565b610680613313565b6001602082015261010081526106b57f1058a83d529be585820b96ff0a13f2dbd8675a9e5dd2336a6692cc1e5a526c816115eb565b60408201526107047f05f5cabc4eab14cfabee1334ef7f33a66259cc9fd07af862308d5c41765adb4b7f128a103fbe66c8ff697182c0963d963208b55a5a53ddeab9b4bc09dc2a68a9cc611626565b6080820151526107547f0d9980170c334c107e6ce4d66bbc4d23bbcdc97c020b1e1c3f6e04c6c663d2c27f0968205845091ceaf3f863b1613fbdf7ce9a87ccfd97f22011679e6350384419611626565b6080820151602001526107a77f0c84a19b149a1612cb042ad86382b9e94367c0add60d07e12399999e7db09efe7f1e02f70c44c9bfb7bf2164cee2ab4813bcb9be56eb432e2e9dfffffe196d846d611626565b6080820151604001526107fa7f1eb3599506a41a7d62e1f7438d6732fbb9d1eda7b9c7a0213eca63c9334ac5a97f23563d9f429908d8ea80bffa642840fb081936d45b388bafc504d9b1e5b1c410611626565b60808201516060015261080f60006001611626565b60808281015101526108617f063e8dac7ee3ee6a4569fd53b416fe17f8f10de8c435c336e5a1cf2e026432007f1d4c1781b78f926d55f89ef72abb96bee350ce60ddc684f5a02d87c5f4cdf943611626565b608082015160a0015261087660006001611626565b608082015160c001526108c97f0b487eb34c8480ea506f5c6c25857155d61d7f9824b60bc80e1a415a5bcf247f7f07ea0d0d0df9dbcc944e9341a5bb49ae796d9dc9d7ca1c032b53784715b946db611626565b6060820151526109197f0fa66faa0b9ea782eb400175ac9f0c05f0de64332eec54a87cd20db4540baec27f07dea33d314c690c4bd4b21deda1a44b9f8dd87e539024622768c2f8b8bdabe1611626565b60608201516020015261096c7f120482c52e31d2373f9b2dc80a47e68f035e278d220fa8a89d0c81f1333439537f02928a78ea2e1a943e9220b7e288fd48a561263f8e5f94518f21aaa43781ceac611626565b60a0820151526109bc7f1dfad2c4d60704bcf6af0abd9cce09151f063c4b52200c268e470c6a6c93cbca7f08b28dd6ca14d7c33e078fe0f332a9a4d95ac8df171355de9e69930aec02b5dc611626565b60a082015160200152610a0f7f0935a4fd6ab67925929661cf2d2e814f87f589ee6234cb9675ecc2d897f1b3387f1032ccc41c047413fce4a847ba7e51e4a2ea406d89a88d480c5f0efaf6c8c89a611626565b60a082015160400152610a627f0eafaea3af7d1fadb2138db1b991af5d2218f6892714fd019898c7e1a43ecfe87f28fb17eda285ed74cc9771d62fad22ab459bbb0a4968c489972aca8b7e618fcb611626565b60a082015160600152610ab57f155201a564e721b1f5c06315ad4e24eaad3cbdd6197b19cd903fe85613080f867f12fb201bc896572ac14357e2601f5118636f1eeb7b89c177ac940aac3b5253ec611626565b60c0820152610b047f1cb0e2ae4d52743898d94d7f1729bd0d3357ba035cdb6b3af7ebff9159f8f2977f15ee595227c9e0f7a487ddb8072d5ea3cfd058bc569211c3546bc0e80051553f611626565b60e082015152610b547f13e4ab94c03a5a29719930c1361d854e244cf918f1e29cb031303f4a13b719777f0f792ef4c6c8746c97be61ed9b20f31ba2dec3bd5c91a2d9a4a586f19af3a07c611626565b60e082015160200152610ba77f1c9e69bd2b04240ebe44fb23d67c596fce4a1336109fdce38c2f184a63cd8acc7f1cbd3e72bdbce827227e503690b10be9365ae760e9d2babde5ba81edf12f8206611626565b60e082015160400152610bfa7f2a0d46339fbf72104df6a241b53a957602b1a16f6e3b9f89bf3e4c4645df823c7f11a601d7b2eee4b7885f34c9873426ba1263f38eae2e0351d653b8b1ba9c67f6611626565b60e082015160600152610c4d7f1a70e43f18b18d686807c2b1c6471cd949dd251b48090bca443d86b97afae9517f0e6e23ad15a1bd851b228788ae4a03bf25bda39ede6d5a92d501a8402a0dfe43611626565b610100820152610c5d60056115eb565b61012082015152610c6e60076115eb565b61012082015160200152610c82600a6115eb565b61012082015160026020020181905250610d4460405180604001604052807f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81525060405180604001604052807f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa815250611651565b610140820151526040805180820182527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b060208281019190915282518084019093527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe483527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5590830152610dfa91611651565b6101408201516020015290565b610e0f6133d5565b836001600160401b03811115610e2757610e27613aad565b604051908082528060200260200182016040528015610e50578160200160208202803683370190505b50815260005b84811015610ea057858582818110610e7057610e706145c3565b9050602002013582600001518281518110610e8d57610e8d6145c3565b6020908102919091010152600101610e56565b506000805b6004811015610f1a57610ef1858584818110610ec357610ec36145c3565b905060200201358686610ed68660010190565b818110610ee557610ee56145c3565b90506020020135611659565b83602001518260048110610f0757610f076145c3565b6020020152600282019150600101610ea5565b50610f43848483818110610f3057610f306145c3565b905060200201358585610ed68560010190565b6040830152600201610f60848483818110610f3057610f306145c3565b610160830152600201610f7e848483818110610f3057610f306145c3565b61018083015260020160005b6004811015610fd157610fa8858584818110610ec357610ec36145c3565b83606001518260048110610fbe57610fbe6145c3565b6020020152600282019150600101610f8a565b5060005b600481101561102657610fff858584818110610ff357610ff36145c3565b905060200201356115eb565b83608001518260048110611015576110156145c3565b602002015260019182019101610fd5565b5060005b600181101561106f57611048858584818110610ff357610ff36145c3565b8360a00151826001811061105e5761105e6145c3565b60200201526001918201910161102a565b5060005b60018110156110b857611091858584818110610ff357610ff36145c3565b8360c0015182600181106110a7576110a76145c3565b602002015260019182019101611073565b5060005b6003811015611101576110da858584818110610ff357610ff36145c3565b8360e0015182600381106110f0576110f06145c3565b6020020152600191820191016110bc565b50611117848483818110610ff357610ff36145c3565b610100830152600101611135848483818110610ff357610ff36145c3565b6101a0830152600101611153848483818110610ff357610ff36145c3565b6101c0830152600101611171848483818110610ff357610ff36145c3565b6101e083015260010161118f848483818110610ff357610ff36145c3565b6102008301526001016111ad848483818110610ff357610ff36145c3565b6102208301526001016111cb848483818110610ff357610ff36145c3565b6102408301526001016111e9848483818110610ff357610ff36145c3565b610120830152600101611207848483818110610ff357610ff36145c3565b610140830152600101611225848483818110610f3057610f306145c3565b610260830152600201611243848483818110610f3057610f306145c3565b61028083015250949350505050565b60008061125f84846117f1565b905061126c838583611b2a565b151560000361127f576000915050611531565b60608401516000906112b890825b6020020151604080518082019091526000808252602080830191825283518352929092015190915290565b84516101808401519192506000916112cf91611e23565b604080516020808201835260008083528451835283518085019094528084529083015291925060015b60048110156113425761131a8960600151826004811061128d5761128d6145c3565b91506113268284611ea2565b61133085836115dc565b61133a8385611537565b6001016112f8565b505050506000611353858785610266565b80518390526101208701516020820151529050611371858785611ead565b8151602090810191909152610140870151818301805190920152815151905151600061139d60016115eb565b90506113bc604051806040016040528060008152602001600081525090565b60015b600d811015611445576101408801516113d9908490611537565b6113f383876000015183600d8110610251576102516145c3565b91506113ff85836115dc565b856020015181600d8110611415576114156145c3565b6020020151610220890181905261142c9084611537565b61022088015161143d908590611583565b6001016113bf565b50610140870151611457908390611537565b6000611474838760400151600060068110610251576102516145c3565b6060870151519091506114878185611537565b60015b6006811015611510576101408a01516114a4908690611537565b6114be8589604001518360068110610251576102516145c3565b93506114ca83856115dc565b876060015181600681106114e0576114e06145c3565b60200201516102208b018190526114f79086611537565b6102208a0151611508908390611583565b60010161148a565b506115258b61014001518d8b89868a876122be565b99505050505050505050505b92915050565b60008051602061466a833981519152815183510990915250565b60008051602061466a833981519152815161157a9060008051602061466a8339815191526145ef565b83510890915250565b60008051602061466a833981519152815183510890915250565b604080518082019091526000808252602082015282511580156115c4575082602001516001145b156115d157600060208401525b611531838383612466565b6115e78282846124a8565b5050565b60408051602081019091526000815260008051602061466a833981519152821061161457600080fd5b50604080516020810190915290815290565b60408051808201909152600080825260208201525b5060408051808201909152918252602082015290565b61163b6135e3565b604080518082019091526000808252602082015282158015611679575081155b1561169a576040518060400160405280848152602001838152509050611531565b60008051602061464a83398151915283106116f15760405162461bcd60e51b81526020600482015260126024820152711e08185e1a5cc81a5cdb89dd081d985b1a5960721b60448201526064015b60405180910390fd5b60008051602061464a83398151915282106117435760405162461bcd60e51b81526020600482015260126024820152711e48185e1a5cc81a5cdb89dd081d985b1a5960721b60448201526064016116e8565b600060008051602061464a8339815191528384099050600060008051602061464a833981519152858609905060008051602061464a833981519152858209905060008051602061464a8339815191526003820890508082146117d95760405162461bcd60e51b815260206004820152600f60248201526e6973206e6f74206f6e20637572766560881b60448201526064016116e8565b50506040805180820190915292835250602082015290565b6117f9613603565b60408051606081018252600080825260208201819052918101829052905b836020015181101561185b576118538560000151828151811061183c5761183c6145c3565b60200260200101518361253890919063ffffffff16565b600101611817565b5060005b60048110156118955761188d85602001518260048110611881576118816145c3565b602002015183906125c6565b60010161185f565b5061189f816125e2565b60a08301526101608401516118b59082906125c6565b6118be816125e2565b60408301526118cc816125e2565b606083015260408401516118e19082906125c6565b6118ea816125e2565b60c08301526118f8816125e2565b60e083015261018084015161190e9082906125c6565b611917816125e2565b602083015260005b60048110156119495761194185606001518260048110611881576118816145c3565b60010161191f565b50611953816125e2565b61018083015261012084015161196a908290612688565b60005b60048110156119a35761199b8560800151826004811061198f5761198f6145c3565b60200201518390612688565b60010161196d565b5060005b60018110156119d1576119c98560a00151826001811061198f5761198f6145c3565b6001016119a7565b5060005b60018110156119ff576119f78560c00151826001811061198f5761198f6145c3565b6001016119d5565b5060005b6003811015611a2d57611a258560e00151826003811061198f5761198f6145c3565b600101611a03565b506101808201516040805160208101825260008152915182526101a08401829052840151611a5b9190611537565b610100840151611a6c908290612688565b6101e0840151611a7d908290612688565b610220840151611a8e908290612688565b610240840151611a9f908290612688565b6101a0840151611ab0908290612688565b6101c0840151611ac1908290612688565b610200840151611ad2908290612688565b610140840151611ae3908290612688565b611aec816125e2565b610140830152610260840151611b039082906125c6565b610280840151611b149082906125c6565b611b1d816125e2565b6101608301525092915050565b60008084602001516001600160401b03811115611b4957611b49613aad565b604051908082528060200260200182016040528015611b72578160200160208202803683370190505b50905060005b8151811015611ba75780828281518110611b9457611b946145c3565b6020908102919091010152600101611b78565b506000611bb460006115eb565b905060005b8660200151811015611c3257611bde8188600001518960400151886101800151612696565b61022086015285518051611c1991611c0d9184908110611c0057611c006145c3565b60200260200101516115eb565b61022087015190611537565b610220850151611c2a908390611583565b600101611bb9565b5060c0850151611c4b9060005b60200201518290611537565b61014085015160408051602081019091526000815290518152611c6e8183611583565b611c77856105ca565b6080850151600090611c8a90600461014f565b9050611ca48761010001518261153790919063ffffffff16565b611cb0600160046145ef565b600314611cbc57600080fd5b60408051602081019091526000815260005b6003811015611d5057611cf08960e00151826003811061014f5761014f6145c3565b9150611d0988604001518361153790919063ffffffff16565b611d2e89608001518260048110611d2257611d226145c3565b60200201518390611583565b6060880151611d3e908390611583565b611d488383611537565b600101611cce565b506080880151611d6190600361014f565b9050611d7a87606001518261158390919063ffffffff16565b611d848282611537565b611d8e8383611551565b6000611da38a60000151896101800151612744565b6080890151909150611db6906005611c3f565b611dc08482611551565b6000611dcd8b8b8b6127ca565b9050611dd98582611583565b6101208a0151604080516020810190915260008152905181528b516101808b0151611e0e91611e0791612a1a565b8290611537565b945194519094149a9950505050505050505050565b604080516020808201835260008252825160c08101845281815280820182905292830152835160608301526080820183905260008051602061466a83398151915260a083015290611e726137b7565b600060208260c08560055afa905080611e8a57600080fd5b50604080516020810190915290518152949350505050565b6115e7828284612466565b6040805180820190915260008082526020820152611ecc600080611626565b90506000611efb8460800151600060048110611eea57611eea6145c3565b602002015160808701516000610251565b9050611f0782826115dc565b6080840151611f23906001602002015160808701516001610251565b9050611f2f82826115dc565b6080840151611f4b906002602002015160808701516002610251565b9050611f5782826115dc565b6080840151611f73906003602002015160808701516003610251565b9050611f7f82826115dc565b6080840151600090611f91908261014f565b6080860151909150611fa4906001611c3f565b6080860151611fb69082906004610251565b9150611fc283836115dc565b608086015160a00151611fd69084906115dc565b60a0850151516080870151611fed91906006610251565b9150611ff983836115dc565b60c08501515161200a908490611ea2565b6000612017878787610111565b905061202384826115dc565b61202f600160046145ef565b60031461203b57600080fd5b600061204760016115eb565b90506000612065876080015160046009811061014f5761014f6145c3565b905060005b600481101561212d57610180880151604080516020810190915260008152905181529450806000036120a5576120a08584611537565b6120d6565b6101208a01516120d6906120ba6001846145ef565b600381106120ca576120ca6145c3565b60200201518690611537565b60408801516120e6908690611537565b60608801516120f6908690611583565b61211b8960800151826004811061210f5761210f6145c3565b60200201518690611583565b6121258286611537565b60010161206a565b50604088015161213d908261159d565b945061214986866115dc565b608087015161215990600461014f565b905061217287604001518261153790919063ffffffff16565b610100880151612183908290611537565b60005b612192600160046145ef565b811015612206576121b28960e00151826003811061014f5761014f6145c3565b94506121cb88604001518661153790919063ffffffff16565b60608801516121db908690611583565b6121f48960800151826004811061210f5761210f6145c3565b6121fe8286611537565b600101612186565b5060a08901516122199082906003610251565b94506122258686612a49565b61223f60008a600001518b604001518a6101800151612696565b6101e088018190525160000361225457600080fd5b506101e086015160408051602081019091526000815290518152608087015161227e906005611c3f565b604088015161228d908261159d565b945061229986866115dc565b60006122a58989612a54565b90506122b187826115dc565b5050505050509392505050565b604080518082019091526000808252602080830182815287518452908701519052906122f887610160015186611ea290919063ffffffff16565b61230281866115dc565b60408051602081019091526000815283518152610160880151612326908290611537565b6123308186611583565b600061236882612362604080518082018252600080825260209182015281518083019092526001825260029082015290565b9061159d565b90506123748382612a49565b6101808901516102608b01516123899161159d565b905060006123ac8a6101a001516040805160208101909152600081529051815290565b90506123c68a61016001518261153790919063ffffffff16565b6102808b01516000906123d9908361159d565b90506123e583826115dc565b6123ef85846115dc565b600061240e8c61016001518e610280015161159d90919063ffffffff16565b90506124288d6102600151826115dc90919063ffffffff16565b61243181612d22565b8d5160208f01516000612442612d62565b905061245089848685612e22565b9950505050505050505050979650505050505050565b61246e6137d5565b835181526020840151816001602002015282518160026020020152600060408360608460075afa9050806124a157600080fd5b5050505050565b81511580156124b957506020820151155b156124d1578251815260209283015192019190915250565b82511580156124e257506020830151155b156124f7578151815260209182015191015250565b6124ff6137f3565b8351815260208085015181830152835160408301528301518160035b6020020152600060408360808460065afa9050806124a157600080fd5b81516020808401516040516000928101929092526024820183905260448201526064810183905260840160408051808303601f1901815291815281516020928301208552848201519051600160e01b928101929092526024820183905260448201526064810183905260840160408051601f1981840301815291905280516020918201209301929092525050565b6125d4828260000151612538565b6115e7828260200151612538565b60408051602081019091526000815281516020808401516040808601519051600160e11b938101939093526024830193909352604482015260e09190911b6001600160e01b03191660648201526000906068016040516020818303038152906040528051906020012090506001836040018181516126609190614602565b63ffffffff1690525060408051602081019091526001600160fd1b0391909116815292915050565b6115e7828260000151612538565b6040805160208101909152600081528385106126b157600080fd5b60006126bd60016115eb565b905060006126cb8588611e23565b90506126d78487611e23565b92506126e38383611551565b82516000036126f157600080fd5b6126fb8382611537565b604080516020810190915260008152845181526127188183611551565b612724611e07886115eb565b61272d81612f22565b90506127398482611537565b505050949350505050565b604080516020810190915260008152600061275f60016115eb565b9050600061276c856115eb565b6040805160208101909152600081528551815290915061278c8184611551565b6127968183611537565b61279f81612f22565b90506127ab8587611e23565b93506127b78484611551565b6127c18482611537565b50505092915050565b60408051602081019091526000815260408051602081019091526000815260006127f460016115eb565b90506128148460c001516040805160208101909152600081529051815290565b61010085018190526128269082611583565b61010084015160408051602081019091526000815290518152610120850181905260e08501516128569190611537565b6101a08501516040805160208101909152600081529051815291506128888460c001518361153790919063ffffffff16565b610120840151612899908390611583565b6101c08501516128aa908390611537565b60808401516128ba90600661019a565b60006128db600188600001516128d091906145ef565b604089015190611e23565b90506128fc8561018001516040805160208101909152600081529051815290565b6101c0860181905261290e9082611551565b6101c085015161291f908490611537565b6129298484611583565b612943600088600001518960400151886101800151612696565b6101e0860181905260408051602081019091526000815290518152608086015160e00151909350612975908490611537565b61297f8484611551565b60006129a16001896000015161299591906145ef565b61012088015190611e23565b90506129c9600189600001516129b791906145ef565b895160408b01516101808a0151612696565b61020087018190526040805160208101909152600081529051815293506129f08482611537565b60808601516101000151612a05908590611537565b612a0f8585611551565b505050509392505050565b604080516020810190915260008152612a338284611e23565b9050611531612a4260016115eb565b8290611551565b6115e7828284612f61565b60408051808201909152600080825260208201526000612a7460006115eb565b9050612a8c6040518060200160405280600081525090565b60408051602080820183526000918290526101c08801518351918201909352908152905181526080850151612ac2906006611c3f565b6101c0850151612ad3908290611537565b610160860151600090612ae6908361159d565b9050612af285826115dc565b610200870151604080516020810190915260008152905181529150612b248660c001518361153790919063ffffffff16565b6101e0870151612b35908390611583565b610120860151612b46908390611583565b6040805160208101909152600081526000612b6160016115eb565b9050612b796040518060200160405280600081525090565b60005b612b88600160046145ef565b811015612bd657612ba88b60800151826004811061014f5761014f6145c3565b9150612bb48284611537565b612bbe8483611583565b60a08a0151612bce908490611537565b600101612b7c565b506102408a0151604080516020810190915260008152905181529550612bfc8683611537565b612c068387611583565b6102208a0151612c17908490611537565b60e0890151612c27908490611583565b612c318584611537565b610100890151612c42908690611537565b604080516020810190915260008152875181529550612c618686611551565b6080890151869550612c749060066120ca565b6101c0890151612c85908690611537565b6101e08901516040805160208101909152600081529051815260808a0151909650612cb99060075b60200201518790611537565b612cc38587611583565b6102008901516040805160208101909152600081529051815260808a0151909650612cef906008612cad565b612cf98587611583565b6101808a0151612d09908661159d565b9350612d1588856115dc565b5050505050505092915050565b8060200151600003612d3d57805115612d3a57600080fd5b50565b6020810151612d5a9060008051602061464a8339815191526145ef565b602090910152565b612d6a6135e3565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b82527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60208381019190915281019190915290565b60408051600280825260608201909252600091829190816020015b6040805180820190915260008082526020820152815260200190600190039081612e3d5750506040805160028082526060820190925291925060009190602082015b612e876135e3565b815260200190600190039081612e7f5790505090508682600081518110612eb057612eb06145c3565b60200260200101819052508482600181518110612ecf57612ecf6145c3565b60200260200101819052508581600081518110612eee57612eee6145c3565b60200260200101819052508381600181518110612f0d57612f0d6145c3565b6020026020010181905250610106828261300b565b6040805160208101909152600081528151600003612f3f57600080fd5b61153182612f5c600260008051602061466a8339815191526145ef565b611e23565b8151158015612f7257506020820151155b15612f8a578251815260209283015192019190915250565b8251158015612f9b57506020830151155b15612fcb57815181526020820151612fc19060008051602061464a8339815191526145ef565b6020909101525050565b612fd36137f3565b8351815260208085015181830152835160408301528301516130039060008051602061464a8339815191526145ef565b81600361251b565b6000815183511461301b57600080fd5b8251600061302a82600661461f565b90506000816001600160401b0381111561304657613046613aad565b60405190808252806020026020018201604052801561306f578160200160208202803683370190505b50905060005b838110156132a05786818151811061308f5761308f6145c3565b602002602001015160000151828260066130a9919061461f565b6130b4906000614636565b815181106130c4576130c46145c3565b6020026020010181815250508681815181106130e2576130e26145c3565b602002602001015160200151828260066130fc919061461f565b613107906001614636565b81518110613117576131176145c3565b602002602001018181525050858181518110613135576131356145c3565b602090810291909101015151518261314e83600661461f565b613159906002614636565b81518110613169576131696145c3565b602002602001018181525050858181518110613187576131876145c3565b602090810291909101810151510151826131a283600661461f565b6131ad906003614636565b815181106131bd576131bd6145c3565b6020026020010181815250508581815181106131db576131db6145c3565b6020026020010151602001516000600281106131f9576131f96145c3565b60200201518261320a83600661461f565b613215906004614636565b81518110613225576132256145c3565b602002602001018181525050858181518110613243576132436145c3565b602002602001015160200151600160028110613261576132616145c3565b60200201518261327283600661461f565b61327d906005614636565b8151811061328d5761328d6145c3565b6020908102919091010152600101613075565b506132a96137b7565b6000602082602086026020860160085afa9050806132c657600080fd5b505115159695505050505050565b60405180608001604052806132e7613811565b81526020016132f461384b565b8152602001613301613880565b815260200161330e6138aa565b905290565b60405180610160016040528060008152602001600081526020016133436040518060200160405280600081525090565b81526020016133506138cb565b815260200161335d6138f3565b815260200161336a61391e565b815260200161338c604051806040016040528060008152602001600081525090565b815260200161339961391e565b81526020016133bb604051806040016040528060008152602001600081525090565b81526020016133c8613947565b815260200161330e613968565b604051806102a00160405280606081526020016133f061391e565b8152602001613412604051806040016040528060008152602001600081525090565b815260200161341f61391e565b815260200161342c613995565b81526040805180820182526000602080830182815283528085019290925282518084018452918201908152815290820152606001613468613947565b81526020016134836040518060200160405280600081525090565b815260200161349e6040518060200160405280600081525090565b81526020016134b96040518060200160405280600081525090565b81526020016134db604051806040016040528060008152602001600081525090565b81526020016134fd604051806040016040528060008152602001600081525090565b81526020016135186040518060200160405280600081525090565b81526020016135336040518060200160405280600081525090565b815260200161354e6040518060200160405280600081525090565b81526020016135696040518060200160405280600081525090565b81526020016135846040518060200160405280600081525090565b815260200161359f6040518060200160405280600081525090565b81526020016135c1604051806040016040528060008152602001600081525090565b815260200161330e604051806040016040528060008152602001600081525090565b60405180604001604052806135f66139b6565b815260200161330e6139b6565b60408051610280810182526000610260820181815282528251602080820185528282528084019190915283518082018552828152838501528351908101909352825290606082019081526020016136586139d4565b81526020016136736040518060200160405280600081525090565b815260200161368e6040518060200160405280600081525090565b81526020016136a96040518060200160405280600081525090565b81526020016136c46040518060200160405280600081525090565b81526020016136df6040518060200160405280600081525090565b81526020016136fa6040518060200160405280600081525090565b81526020016137156040518060200160405280600081525090565b81526020016137306040518060200160405280600081525090565b815260200161374b6040518060200160405280600081525090565b81526020016137666040518060200160405280600081525090565b81526020016137816040518060200160405280600081525090565b815260200161379c6040518060200160405280600081525090565b81526020016135c16040518060200160405280600081525090565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101a00160405280600d905b60408051808201909152600080825260208201528152602001906001900390816138215790505090565b604051806101a00160405280600d905b60408051602081019091526000815281526020019060019003908161385b5790505090565b604080516101008101909152600060c0820181815260e08301919091528152600560208201613821565b6040805160e08101909152600060c08201908152815260056020820161385b565b6040805160808101825260009181018281526060820192909252908152600160208201613821565b604080516101208101909152600060e082018181526101008301919091528152600660208201613821565b6040805160c0810190915260006080820181815260a08301919091528152600360208201613821565b6040805160808101909152600060608201908152815260026020820161385b565b60405180604001604052806002905b61397f6135e3565b8152602001906001900390816139775790505090565b6040805160a08101909152600060808201908152815260036020820161385b565b60405180604001604052806002906020820280368337509192915050565b60408051610140810190915260006101208201908152815260086020820161385b565b60008083601f840112613a0957600080fd5b5081356001600160401b03811115613a2057600080fd5b6020830191508360208260051b8501011115613a3b57600080fd5b9250929050565b60008060008060408587031215613a5857600080fd5b84356001600160401b0380821115613a6f57600080fd5b613a7b888389016139f7565b90965094506020870135915080821115613a9457600080fd5b50613aa1878288016139f7565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613ae557613ae5613aad565b60405290565b6040516102a081016001600160401b0381118282101715613ae557613ae5613aad565b60405161026081016001600160401b0381118282101715613ae557613ae5613aad565b60405161016081016001600160401b0381118282101715613ae557613ae5613aad565b604051608081016001600160401b0381118282101715613ae557613ae5613aad565b600060208284031215613b8857600080fd5b604051602081018181106001600160401b0382111715613baa57613baa613aad565b6040529135825250919050565b600060408284031215613bc957600080fd5b613bd1613ac3565b9050813581526020820135602082015292915050565b600082601f830112613bf857600080fd5b613c00613ac3565b806080840185811115613c1257600080fd5b845b81811015613c3657613c268782613bb7565b8452602090930192604001613c14565b509095945050505050565b600082601f830112613c5257600080fd5b6040805160e081018181106001600160401b0382111715613c7557613c75613aad565b8252806101c0850186811115613c8a57600080fd5b855b81811015613cad57613c9e8882613bb7565b83526020909201918401613c8c565b50919695505050505050565b600082601f830112613cca57600080fd5b613cd2613b54565b80610100840185811115613ce557600080fd5b845b81811015613c3657613cf98782613bb7565b8452602090930192604001613ce7565b600082601f830112613d1a57600080fd5b604051606081018181106001600160401b0382111715613d3c57613d3c613aad565b604052806060840185811115613d5157600080fd5b845b81811015613d7357613d658782613b76565b835260209283019201613d53565b509195945050505050565b600082601f830112613d8f57600080fd5b613d97613ac3565b806040840185811115613da957600080fd5b845b81811015613c36578035845260209384019301613dab565b600082601f830112613dd457600080fd5b613ddc613ac3565b80610100840185811115613def57600080fd5b845b81811015613c365760808188031215613e0a5760008081fd5b613e12613ac3565b613e1c8883613d7e565b8152613e2b8860408401613d7e565b6020828101919091529085529390930192608001613df1565b600082601f830112613e5557600080fd5b813560206001600160401b0380831115613e7157613e71613aad565b8260051b604051601f19603f83011681018181108482111715613e9657613e96613aad565b604052938452858101830193838101925087851115613eb457600080fd5b83870191505b8482101561010657813583529183019190830190613eba565b600082601f830112613ee457600080fd5b613eec613b54565b806080840185811115613efe57600080fd5b845b81811015613c3657613f128782613b76565b845260209384019301613f00565b600082601f830112613f3157600080fd5b60405160208082018281106001600160401b0382111715613f5457613f54613aad565b6040528184820186811115613f6857600080fd5b855b81811015613f8957613f7c8882613b76565b8352918301918301613f6a565b50929695505050505050565b60006105a08284031215613fa857600080fd5b613fb0613aeb565b905081356001600160401b03811115613fc857600080fd5b613fd484828501613e44565b825250613fe48360208401613cb9565b6020820152610120613ff884828501613bb7565b604083015261016061400c85828601613cb9565b606084015261026061402086828701613ed3565b6080850152614033866102e08701613f20565b60a0850152614046866103008701613f20565b60c0850152614059866103208701613d09565b60e085015261406c866103808701613b76565b610100850152614080866103a08701613b76565b83850152614092866103c08701613b76565b6101408501526140a6866103e08701613bb7565b828501526140b8866104208701613bb7565b6101808501526140cc866104608701613b76565b6101a08501526140e0866104808701613b76565b6101c08501526140f4866104a08701613b76565b6101e0850152614108866104c08701613b76565b61020085015261411c866104e08701613b76565b610220850152614130866105008701613b76565b610240850152614144866105208701613bb7565b81850152505050614159836105608401613bb7565b61028082015292915050565b600082601f83011261417657600080fd5b6040516101208082018281106001600160401b038211171561419a5761419a613aad565b604052830181858211156141ad57600080fd5b845b82811015613d73576141c18782613b76565b8252602091820191016141af565b600061038082840312156141e257600080fd5b6141ea613b0e565b90506141f68383613b76565b81526142058360208401613b76565b60208201526142178360408401613b76565b60408201526142298360608401613b76565b606082015261423b8360808401614165565b60808201526101a061424f84828501613b76565b60a08301526101c061426385828601613b76565b60c08401526101e061427786828701613b76565b60e085015261020061428b87828801613b76565b6101008601526102206142a088828901613b76565b6101208701526102406142b589828a01613b76565b6101408801526142c9896102608a01613b76565b6101608801526142dd896102808a01613b76565b6101808801526142f1896102a08a01613b76565b86880152614303896102c08a01613b76565b85880152614315896102e08a01613b76565b84880152614327896103008a01613b76565b83880152614339896103208a01613b76565b8288015261434b896103408a01613bb7565b8188015250505050505092915050565b6000806000838503610a2081121561437257600080fd5b6106808082121561438257600080fd5b61438a613b31565b915085358252602086013560208301526143a78760408801613b76565b60408301526143b98760608801613be7565b60608301526143cb8760e08801613c41565b60808301526143de876102a08801613cb9565b60a08301526143f1876103a08801613bb7565b60c0830152614404876103e08801613cb9565b60e0830152614417876104e08801613bb7565b61010083015261442b876105208801613d09565b61012083015261443f876105808801613dc3565b6101408301529093508401356001600160401b0381111561445f57600080fd5b61446b86828701613f95565b92505061447c856106a086016141cf565b90509250925092565b815181526020808301519082015260408101611531565b8060005b60068110156144d4576144be84835180518252602090810151910152565b60409390930192602091909101906001016144a0565b50505050565b8060005b60068110156144d4578151518452602093840193909101906001016144de565b81516107208201908260005b600d81101561453e5761452882845180518252602090810151910152565b602092909201916040919091019060010161450a565b505050602080840151610340840160005b600d81101561456d578251518252918301919083019060010161454f565b5050505060408301516145846104e084018261449c565b5060608301516145986106608401826144da565b5092915050565b600061038082840312156145b257600080fd5b6145bc83836141cf565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115611531576115316145d9565b63ffffffff818116838216019080821115614598576145986145d9565b8082028115828204841417611531576115316145d9565b80820180821115611531576115316145d956fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220525eba758bf7c42a7d1cf6a05eb2cf3dd25b2caf7bb388aee220ed13d5aa7c8f64736f6c63430008110033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
