// File: demon386[P]git-store/./libs/program_options/src/options_description.cpp
// Function: boost::program_options::options_description::find_nothrow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool, bool) const
const option_description*
    options_description::find_nothrow(const std::string& name, 
                                      bool approx,
                                      bool long_ignore_case,
                                      bool short_ignore_case) const
    {
        shared_ptr<option_description> found;
        bool had_full_match = false;
        vector<string> approximate_matches;
        vector<string> full_matches;
        
        // We use linear search because matching specified option
        // name with the declared option name need to take care about
        // case sensitivity and trailing '*' and so we can't use simple map.
        for(unsigned i = 0; i < m_options.size(); ++i)
        {
            option_description::match_result r = 
                m_options[i]->match(name, approx, long_ignore_case, short_ignore_case);

            if (r == option_description::no_match)
                continue;

            if (r == option_description::full_match)
            {                
                full_matches.push_back(m_options[i]->key(name));
                found = m_options[i];
                had_full_match = true;
            } 
            else 
            {                        
                // FIXME: the use of 'key' here might not
                // be the best approach.
                approximate_matches.push_back(m_options[i]->key(name));
                if (!had_full_match)
                    found = m_options[i];
            }
        }
        if (full_matches.size() > 1) 
            boost::throw_exception(ambiguous_option(full_matches));
        
        // If we have a full match, and an approximate match,
        // ignore approximate match instead of reporting error.
        // Say, if we have options "all" and "all-chroots", then
        // "--all" on the command line should select the first one,
        // without ambiguity.
        if (full_matches.empty() && approximate_matches.size() > 1)
            boost::throw_exception(ambiguous_option(approximate_matches));

        return found.get();
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x250, %rsp            # imm = 0x250
movb %r8b, %al
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
andb $0x1, %dl
movb %dl, -0x11(%rbp)
andb $0x1, %cl
movb %cl, -0x12(%rbp)
andb $0x1, %al
movb %al, -0x13(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x220(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x26ef0
movb $0x0, -0x29(%rbp)
leaq -0x48(%rbp), %rdi
callq 0x11cf0
leaq -0x60(%rbp), %rdi
callq 0x11cf0
movl $0x0, -0x64(%rbp)
movq -0x220(%rbp), %rdi
movl -0x64(%rbp), %eax
movq %rax, -0x228(%rbp)
addq $0x28, %rdi
callq 0x26dd0
movq %rax, %rcx
movq -0x228(%rbp), %rax
cmpq %rcx, %rax
jae 0x254ed
movq -0x220(%rbp), %rdi
addq $0x28, %rdi
movl -0x64(%rbp), %eax
movl %eax, %esi
callq 0x26df0
movq %rax, %rdi
callq 0x26f20
movq %rax, -0x230(%rbp)
jmp 0x253ab
movq -0x230(%rbp), %rdi
movq -0x10(%rbp), %rsi
movzbl -0x13(%rbp), %r8d
movzbl -0x12(%rbp), %ecx
movzbl -0x11(%rbp), %edx
andl $0x1, %edx
andl $0x1, %ecx
andl $0x1, %r8d
callq 0x24260
movl %eax, -0x234(%rbp)
jmp 0x253da
movl -0x234(%rbp), %eax
movl %eax, -0x68(%rbp)
cmpl $0x0, -0x68(%rbp)
jne 0x253ff
jmp 0x254df
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x255cc
cmpl $0x1, -0x68(%rbp)
jne 0x25470
movq -0x220(%rbp), %rdi
addq $0x28, %rdi
movl -0x64(%rbp), %eax
movl %eax, %esi
callq 0x26df0
movq %rax, %rdi
callq 0x26f20
movq %rax, -0x240(%rbp)
jmp 0x2542b
movq -0x240(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x245e0
movq %rax, %rsi
leaq -0x60(%rbp), %rdi
callq 0x127b0
jmp 0x25449
movq -0x220(%rbp), %rdi
addq $0x28, %rdi
movl -0x64(%rbp), %eax
movl %eax, %esi
callq 0x26df0
movq %rax, %rsi
leaq -0x28(%rbp), %rdi
callq 0x26f70
movb $0x1, -0x29(%rbp)
jmp 0x254dd
movq -0x220(%rbp), %rdi
addq $0x28, %rdi
movl -0x64(%rbp), %eax
movl %eax, %esi
callq 0x26df0
movq %rax, %rdi
callq 0x26f20
movq %rax, -0x248(%rbp)
jmp 0x25496
movq -0x248(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x245e0
movq %rax, %rsi
leaq -0x48(%rbp), %rdi
callq 0x127b0
jmp 0x254b4
testb $0x1, -0x29(%rbp)
jne 0x254db
movq -0x220(%rbp), %rdi
addq $0x28, %rdi
movl -0x64(%rbp), %eax
movl %eax, %esi
callq 0x26df0
movq %rax, %rsi
leaq -0x28(%rbp), %rdi
callq 0x26f70
jmp 0x254dd
jmp 0x254df
movl -0x64(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x64(%rbp)
jmp 0x25358
leaq -0x60(%rbp), %rdi
callq 0x124d0
cmpq $0x1, %rax
jbe 0x25539
leaq -0x148(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x270a0
jmp 0x2550e
leaq -0x148(%rbp), %rdi
callq 0x26fc0
jmp 0x2551c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x148(%rbp), %rdi
callq 0x271e0
jmp 0x255cc
leaq -0x60(%rbp), %rdi
callq 0x12470
testb $0x1, %al
jne 0x25548
jmp 0x25591
leaq -0x48(%rbp), %rdi
callq 0x124d0
cmpq $0x1, %rax
jbe 0x25591
leaq -0x218(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0x270a0
jmp 0x25569
leaq -0x218(%rbp), %rdi
callq 0x26fc0
jmp 0x25577
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x218(%rbp), %rdi
callq 0x271e0
jmp 0x255cc
leaq -0x28(%rbp), %rdi
callq 0x27220
movq %rax, -0x250(%rbp)
leaq -0x60(%rbp), %rdi
callq 0x11db0
leaq -0x48(%rbp), %rdi
callq 0x11db0
leaq -0x28(%rbp), %rdi
callq 0x26a50
movq -0x250(%rbp), %rax
addq $0x250, %rsp            # imm = 0x250
popq %rbp
retq
leaq -0x60(%rbp), %rdi
callq 0x11db0
leaq -0x48(%rbp), %rdi
callq 0x11db0
leaq -0x28(%rbp), %rdi
callq 0x26a50
movq -0x70(%rbp), %rdi
callq 0xdb30