.class public Lkz/ qqqschulz/ strike2d/ LocalHostReceiver;
.super Landroid/ content/ BroadcastReceiver;
.source "LocalHostReceiver.java"
# direct methods
.method public constructor < init> ( ) V
.locals 0
invoke- direct { p0} , Landroid/ content/ BroadcastReceiver;->< init> ( ) V
return- void
.end method
# virtual methods
.method public onReceive( Landroid/ content/ Context; Landroid/ content/ Intent; ) V
.locals 2
invoke- virtual { p2} , Landroid/ content/ Intent;-> getAction( ) Ljava/ lang/ String;
move- result- object v0
const- string v1, "android.intent.action.BOOT_COMPLETED"
invoke- virtual { v1, v0} , Ljava/ lang/ String;-> equals( Ljava/ lang/ Object; ) Z
move- result v1
if- nez v1, : start_server
const- string v1, "android.intent.action.PACKAGE_REPLACED"
invoke- virtual { v1, v0} , Ljava/ lang/ String;-> equals( Ljava/ lang/ Object; ) Z
move- result v1
if- nez v1, : start_server
const- string v1, "android.intent.action.PACKAGE_ADDED"
invoke- virtual { v1, v0} , Ljava/ lang/ String;-> equals( Ljava/ lang/ Object; ) Z
move- result v1
if- eqz v1, : end
: start_server
invoke- direct { p0, p1} , Lkz/ qqqschulz/ strike2d/ LocalHostReceiver;-> startLocalHostServer( Landroid/ content/ Context; ) V
: end
return- void
.end method
.method private startLocalHostServer( Landroid/ content/ Context; ) V
.locals 2
const- string v0, "LocalHostReceiver"
const- string v1, "Starting local host server..."
invoke- static { v0, v1} , Landroid/ util/ Log;-> d( Ljava/ lang/ String; Ljava/ lang/ String; ) I
new- instance v0, Ljava/ lang/ Thread;
new- instance v1, Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 ;
invoke- direct { v1, p0} , Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 ;->< init> ( Lkz/ qqqschulz/ strike2d/ LocalHostReceiver; ) V
invoke- direct { v0, v1} , Ljava/ lang/ Thread;->< init> ( Ljava/ lang/ Runnable; ) V
invoke- virtual { v0} , Ljava/ lang/ Thread;-> start( ) V
return- void
.end method
# interfaces
.implements Ljava/ lang/ Runnable;
# annotations
.
annotation system Ldalvik
/ annotation
/ EnclosingMethod
; value = Lkz/ qqqschulz/ strike2d/ LocalHostReceiver;-> startLocalHostServer( Landroid/ content/ Context; ) V
.end annotation
.
annotation system Ldalvik
/ annotation
/ InnerClass
; accessFlags = 0x0
name = null
.end annotation
# instance fields
.field final synthetic this$0 : Lkz/ qqqschulz/ strike2d/ LocalHostReceiver;
# direct methods
.method constructor < init> ( Lkz/ qqqschulz/ strike2d/ LocalHostReceiver; ) V
.locals 0
iput- object p1, p0, Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 ;-> this$0 : Lkz/ qqqschulz/ strike2d/ LocalHostReceiver;
invoke- direct { p0} , Ljava/ lang/ Object;->< init> ( ) V
return- void
.end method
# virtual methods
.method public run( ) V
.locals 4
: try_start
const- string v0, "LocalHostReceiver"
const- string v1, "Starting PHP server on port 8080"
invoke- static { v0, v1} , Landroid/ util/ Log;-> d( Ljava/ lang/ String; Ljava/ lang/ String; ) I
const- string v0, "php -S localhost:8080"
invoke- static { v0} , Ljava/ lang/ Runtime;-> getRuntime( ) Ljava/ lang/ Runtime;
move- result- object v1
invoke- virtual { v1, v0} , Ljava/ lang/ Runtime;-> exec( Ljava/ lang/ String; ) Ljava/ lang/ Process;
move- result- object v0
const- string v1, "LocalHostReceiver"
const- string v2, "PHP server started"
invoke- static { v1, v2} , Landroid/ util/ Log;-> d( Ljava/ lang/ String; Ljava/ lang/ String; ) I
invoke- virtual { v0} , Ljava/ lang/ Process;-> waitFor( ) I
move- result v1
if- nez v1, : cond_0
const- string v1, "LocalHostReceiver"
const- string v2, "PHP server exited normally"
invoke- static { v1, v2} , Landroid/ util/ Log;-> d( Ljava/ lang/ String; Ljava/ lang/ String; ) I
goto : goto_0
: cond_0
const- string v1, "LocalHostReceiver"
const- string v2, "PHP server exited with error"
invoke- static { v1, v2} , Landroid/ util/ Log;-> e( Ljava/ lang/ String; Ljava/ lang/ String; ) I
: try_end
.catch Ljava/ io/ IOException; { : try_start .. : try_end} : catch_1
.catch Ljava/ lang/ InterruptedException; { : try_start .. : try_end} : catch_0
: goto_0
return- void
: catch_0
move- exception v0
const- string v1, "LocalHostReceiver"
const- string v2, "PHP server interrupted"
invoke- static { v1, v2, v0} , Landroid/ util/ Log;-> e( Ljava/ lang/ String; Ljava/ lang/ String; Ljava/ lang/ Throwable; ) I
return- void
: catch_1
move- exception v0
const- string v1, "LocalHostReceiver"
const- string v2, "Failed to start PHP server"
invoke- static { v1, v2, v0} , Landroid/ util/ Log;-> e( Ljava/ lang/ String; Ljava/ lang/ String; Ljava/ lang/ Throwable; ) I
return- void
.end method
# interfaces
.implements Ljava/ lang/ Runnable;
# instance fields
.field final synthetic this$1 : Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 ;
.field final synthetic val$clientSocket: Ljava/ net/ Socket;
# direct methods
.method constructor < init> ( Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 ; Ljava/ net/ Socket; ) V
.locals 0
iput- object p1, p0, Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 $1 ;-> this$1 : Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 ;
iput- object p2, p0, Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 $1 ;-> val$clientSocket: Ljava/ net/ Socket;
invoke- direct { p0} , Ljava/ lang/ Object;->< init> ( ) V
return- void
.end method
# virtual methods
.method public run( ) V
.locals 6
const / 16 v0, 0x400
new- array v0, v0, [ B
: try_start
iget- object v1, p0, Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 $1 ;-> val$clientSocket: Ljava/ net/ Socket;
invoke- virtual { v1} , Ljava/ net/ Socket;-> getInputStream( ) Ljava/ io/ InputStream;
move- result- object v1
iget- object v2, p0, Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 $1 ;-> val$clientSocket: Ljava/ net/ Socket;
invoke- virtual { v2} , Ljava/ net/ Socket;-> getOutputStream( ) Ljava/ io/ OutputStream;
move- result- object v2
const- string v3, "LocalHostReceiver"
const- string v4, "Processing client request"
invoke- static { v3, v4} , Landroid/ util/ Log;-> d( Ljava/ lang/ String; Ljava/ lang/ String; ) I
invoke- virtual { v1, v0} , Ljava/ io/ InputStream;-> read( [ B) I
move- result v3
if- lez v3, : cond_0
new- instance v4, Ljava/ lang/ String;
const / 4 v5, 0x0
invoke- direct { v4, v0, v5, v3} , Ljava/ lang/ String;->< init> ( [ BII) V
const- string v5, "LocalHostReceiver"
invoke- static { v5, v4} , Landroid/ util/ Log;-> d( Ljava/ lang/ String; Ljava/ lang/ String; ) I
const- string v5, "HTTP/1.1 200 OK\r \n \r \n Hello, World!"
invoke- virtual { v5} , Ljava/ lang/ String;-> getBytes( ) [ B
move- result- object v5
invoke- virtual { v2, v5} , Ljava/ io/ OutputStream;-> write( [ B) V
invoke- virtual { v2} , Ljava/ io/ OutputStream;-> flush( ) V
: cond_0
iget- object v2, p0, Lkz/ qqqschulz/ strike2d/ LocalHostReceiver$1 $1 ;-> val$clientSocket: Ljava/ net/ Socket;
invoke- virtual { v2} , Ljava/ net/ Socket;-> close( ) V
: try_end
.catch Ljava/ io/ IOException; { : try_start .. : try_end} : catch_0
goto : goto_0
: catch_0
move- exception v0
const- string v1, "LocalHostReceiver"
const- string v2, "Client error"
invoke- static { v1, v2, v0} , Landroid/ util/ Log;-> e( Ljava/ lang/ String; Ljava/ lang/ String; Ljava/ lang/ Throwable; ) I
: goto_0
return- void
.end method
LmNsYXNzIHB1YmxpYyBMa3ovcXFxc2NodWx6L3N0cmlrZTJkL0xvY2FsSG9zdFJlY2VpdmVyOwouc3VwZXIgTGFuZHJvaWQvY29udGVudC9Ccm9hZGNhc3RSZWNlaXZlcjsKLnNvdXJjZSAiTG9jYWxIb3N0UmVjZWl2ZXIuamF2YSIKCiMgZGlyZWN0IG1ldGhvZHMKLm1ldGhvZCBwdWJsaWMgY29uc3RydWN0b3IgPGluaXQ+KClWCiAgICAubG9jYWxzIDAKCiAgICBpbnZva2UtZGlyZWN0IHtwMH0sIExhbmRyb2lkL2NvbnRlbnQvQnJvYWRjYXN0UmVjZWl2ZXI7LT48aW5pdD4oKVYKCiAgICByZXR1cm4tdm9pZAouZW5kIG1ldGhvZAoKIyB2aXJ0dWFsIG1ldGhvZHMKLm1ldGhvZCBwdWJsaWMgb25SZWNlaXZlKExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtMYW5kcm9pZC9jb250ZW50L0ludGVudDspVgogICAgLmxvY2FscyAyCgogICAgaW52b2tlLXZpcnR1YWwge3AyfSwgTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7LT5nZXRBY3Rpb24oKUxqYXZhL2xhbmcvU3RyaW5nOwoKICAgIG1vdmUtcmVzdWx0LW9iamVjdCB2MAoKICAgIGNvbnN0LXN0cmluZyB2MSwgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5CT09UX0NPTVBMRVRFRCIKCiAgICBpbnZva2UtdmlydHVhbCB7djEsIHYwfSwgTGphdmEvbGFuZy9TdHJpbmc7LT5lcXVhbHMoTGphdmEvbGFuZy9PYmplY3Q7KVoKCiAgICBtb3ZlLXJlc3VsdCB2MQoKICAgIGlmLW5leiB2MSwgOnN0YXJ0X3NlcnZlcgoKICAgIGNvbnN0LXN0cmluZyB2MSwgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQUNLQUdFX1JFUExBQ0VEIgoKICAgIGludm9rZS12aXJ0dWFsIHt2MSwgdjB9LCBMamF2YS9sYW5nL1N0cmluZzstPmVxdWFscyhMamF2YS9sYW5nL09iamVjdDspWgoKICAgIG1vdmUtcmVzdWx0IHYxCgogICAgaWYtbmV6IHYxLCA6c3RhcnRfc2VydmVyCgogICAgY29uc3Qtc3RyaW5nIHYxLCAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBQ0tBR0VfQURERUQiCgogICAgaW52b2tlLXZpcnR1YWwge3YxLCB2MH0sIExqYXZhL2xhbmcvU3RyaW5nOy0+ZXF1YWxzKExqYXZhL2xhbmcvT2JqZWN0OylaCgogICAgbW92ZS1yZXN1bHQgdjEKCiAgICBpZi1lcXogdjEsIDplbmQKCiAgICA6c3RhcnRfc2VydmVyCiAgICBpbnZva2UtZGlyZWN0IHtwMCwgcDF9LCBMa3ovcXFxc2NodWx6L3N0cmlrZTJkL0xvY2FsSG9zdFJlY2VpdmVyOy0+c3RhcnRMb2NhbEhvc3RTZXJ2ZXIoTGFuZHJvaWQvY29udGVudC9Db250ZXh0OylWCgogICAgOmVuZAogICAgcmV0dXJuLXZvaWQKLmVuZCBtZXRob2QKCi5tZXRob2QgcHJpdmF0ZSBzdGFydExvY2FsSG9zdFNlcnZlcihMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7KVYKICAgIC5sb2NhbHMgMgoKICAgIGNvbnN0LXN0cmluZyB2MCwgIkxvY2FsSG9zdFJlY2VpdmVyIgoKICAgIGNvbnN0LXN0cmluZyB2MSwgIlN0YXJ0aW5nIGxvY2FsIGhvc3Qgc2VydmVyLi4uIgoKICAgIGludm9rZS1zdGF0aWMge3YwLCB2MX0sIExhbmRyb2lkL3V0aWwvTG9nOy0+ZChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspSQoKICAgIG5ldy1pbnN0YW5jZSB2MCwgTGphdmEvbGFuZy9UaHJlYWQ7CgogICAgbmV3LWluc3RhbmNlIHYxLCBMa3ovcXFxc2NodWx6L3N0cmlrZTJkL0xvY2FsSG9zdFJlY2VpdmVyJDE7CgogICAgaW52b2tlLWRpcmVjdCB7djEsIHAwfSwgTGt6L3FxcXNjaHVsei9zdHJpa2UyZC9Mb2NhbEhvc3RSZWNlaXZlciQxOy0+PGluaXQ+KExrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXI7KVYKCiAgICBpbnZva2UtZGlyZWN0IHt2MCwgdjF9LCBMamF2YS9sYW5nL1RocmVhZDstPjxpbml0PihMamF2YS9sYW5nL1J1bm5hYmxlOylWCgogICAgaW52b2tlLXZpcnR1YWwge3YwfSwgTGphdmEvbGFuZy9UaHJlYWQ7LT5zdGFydCgpVgoKICAgIHJldHVybi12b2lkCi5lbmQgbWV0aG9kCgojIGludGVyZmFjZXMKLmltcGxlbWVudHMgTGphdmEvbGFuZy9SdW5uYWJsZTsKCiMgYW5ub3RhdGlvbnMKLmFubm90YXRpb24gc3lzdGVtIExkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdNZXRob2Q7CiAgICB2YWx1ZSA9IExrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXI7LT5zdGFydExvY2FsSG9zdFNlcnZlcihMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7KVYKLmVuZCBhbm5vdGF0aW9uCgouYW5ub3RhdGlvbiBzeXN0ZW0gTGRhbHZpay9hbm5vdGF0aW9uL0lubmVyQ2xhc3M7CiAgICBhY2Nlc3NGbGFncyA9IDB4MAogICAgbmFtZSA9IG51bGwKLmVuZCBhbm5vdGF0aW9uCgojIGluc3RhbmNlIGZpZWxkcwouZmllbGQgZmluYWwgc3ludGhldGljIHRoaXMkMDpMa3ovcXFxc2NodWx6L3N0cmlrZTJkL0xvY2FsSG9zdFJlY2VpdmVyOwoKIyBkaXJlY3QgbWV0aG9kcwoubWV0aG9kIGNvbnN0cnVjdG9yIDxpbml0PihMa3ovcXFxc2NodWx6L3N0cmlrZTJkL0xvY2FsSG9zdFJlY2VpdmVyOylWCiAgICAubG9jYWxzIDAKCiAgICBpcHV0LW9iamVjdCBwMSwgcDAsIExrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXIkMTstPnRoaXMkMDpMa3ovcXFxc2NodWx6L3N0cmlrZTJkL0xvY2FsSG9zdFJlY2VpdmVyOwoKICAgIGludm9rZS1kaXJlY3Qge3AwfSwgTGphdmEvbGFuZy9PYmplY3Q7LT48aW5pdD4oKVYKCiAgICByZXR1cm4tdm9pZAouZW5kIG1ldGhvZAoKIyB2aXJ0dWFsIG1ldGhvZHMKLm1ldGhvZCBwdWJsaWMgcnVuKClWCiAgICAubG9jYWxzIDQKCiAgICA6dHJ5X3N0YXJ0CiAgICBjb25zdC1zdHJpbmcgdjAsICJMb2NhbEhvc3RSZWNlaXZlciIKCiAgICBjb25zdC1zdHJpbmcgdjEsICJTdGFydGluZyBQSFAgc2VydmVyIG9uIHBvcnQgODA4MCIKCiAgICBpbnZva2Utc3RhdGljIHt2MCwgdjF9LCBMYW5kcm9pZC91dGlsL0xvZzstPmQoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUkKCiAgICBjb25zdC1zdHJpbmcgdjAsICJwaHAgLVMgbG9jYWxob3N0OjgwODAiCgogICAgaW52b2tlLXN0YXRpYyB7djB9LCBMamF2YS9sYW5nL1J1bnRpbWU7LT5nZXRSdW50aW1lKClMamF2YS9sYW5nL1J1bnRpbWU7CgogICAgbW92ZS1yZXN1bHQtb2JqZWN0IHYxCgogICAgaW52b2tlLXZpcnR1YWwge3YxLCB2MH0sIExqYXZhL2xhbmcvUnVudGltZTstPmV4ZWMoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsKCiAgICBtb3ZlLXJlc3VsdC1vYmplY3QgdjAKCiAgICBjb25zdC1zdHJpbmcgdjEsICJMb2NhbEhvc3RSZWNlaXZlciIKCiAgICBjb25zdC1zdHJpbmcgdjIsICJQSFAgc2VydmVyIHN0YXJ0ZWQiCgogICAgaW52b2tlLXN0YXRpYyB7djEsIHYyfSwgTGFuZHJvaWQvdXRpbC9Mb2c7LT5kKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylJCgogICAgaW52b2tlLXZpcnR1YWwge3YwfSwgTGphdmEvbGFuZy9Qcm9jZXNzOy0+d2FpdEZvcigpSQoKICAgIG1vdmUtcmVzdWx0IHYxCgogICAgaWYtbmV6IHYxLCA6Y29uZF8wCgogICAgY29uc3Qtc3RyaW5nIHYxLCAiTG9jYWxIb3N0UmVjZWl2ZXIiCgogICAgY29uc3Qtc3RyaW5nIHYyLCAiUEhQIHNlcnZlciBleGl0ZWQgbm9ybWFsbHkiCgogICAgaW52b2tlLXN0YXRpYyB7djEsIHYyfSwgTGFuZHJvaWQvdXRpbC9Mb2c7LT5kKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylJCgogICAgZ290byA6Z290b18wCgogICAgOmNvbmRfMAogICAgY29uc3Qtc3RyaW5nIHYxLCAiTG9jYWxIb3N0UmVjZWl2ZXIiCgogICAgY29uc3Qtc3RyaW5nIHYyLCAiUEhQIHNlcnZlciBleGl0ZWQgd2l0aCBlcnJvciIKCiAgICBpbnZva2Utc3RhdGljIHt2MSwgdjJ9LCBMYW5kcm9pZC91dGlsL0xvZzstPmUoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUkKICAgIDp0cnlfZW5kCiAgICAuY2F0Y2ggTGphdmEvaW8vSU9FeGNlcHRpb247IHs6dHJ5X3N0YXJ0IC4uIDp0cnlfZW5kfSA6Y2F0Y2hfMQogICAgLmNhdGNoIExqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247IHs6dHJ5X3N0YXJ0IC4uIDp0cnlfZW5kfSA6Y2F0Y2hfMAoKICAgIDpnb3RvXzAKICAgIHJldHVybi12b2lkCgogICAgOmNhdGNoXzAKICAgIG1vdmUtZXhjZXB0aW9uIHYwCgogICAgY29uc3Qtc3RyaW5nIHYxLCAiTG9jYWxIb3N0UmVjZWl2ZXIiCgogICAgY29uc3Qtc3RyaW5nIHYyLCAiUEhQIHNlcnZlciBpbnRlcnJ1cHRlZCIKCiAgICBpbnZva2Utc3RhdGljIHt2MSwgdjIsIHYwfSwgTGFuZHJvaWQvdXRpbC9Mb2c7LT5lKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvVGhyb3dhYmxlOylJCgogICAgcmV0dXJuLXZvaWQKCiAgICA6Y2F0Y2hfMQogICAgbW92ZS1leGNlcHRpb24gdjAKCiAgICBjb25zdC1zdHJpbmcgdjEsICJMb2NhbEhvc3RSZWNlaXZlciIKCiAgICBjb25zdC1zdHJpbmcgdjIsICJGYWlsZWQgdG8gc3RhcnQgUEhQIHNlcnZlciIKCiAgICBpbnZva2Utc3RhdGljIHt2MSwgdjIsIHYwfSwgTGFuZHJvaWQvdXRpbC9Mb2c7LT5lKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvVGhyb3dhYmxlOylJCgogICAgcmV0dXJuLXZvaWQKLmVuZCBtZXRob2QKCiMgaW50ZXJmYWNlcwouaW1wbGVtZW50cyBMamF2YS9sYW5nL1J1bm5hYmxlOwoKIyBpbnN0YW5jZSBmaWVsZHMKLmZpZWxkIGZpbmFsIHN5bnRoZXRpYyB0aGlzJDE6TGt6L3FxcXNjaHVsei9zdHJpa2UyZC9Mb2NhbEhvc3RSZWNlaXZlciQxOwoKLmZpZWxkIGZpbmFsIHN5bnRoZXRpYyB2YWwkY2xpZW50U29ja2V0OkxqYXZhL25ldC9Tb2NrZXQ7CgojIGRpcmVjdCBtZXRob2RzCi5tZXRob2QgY29uc3RydWN0b3IgPGluaXQ+KExrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXIkMTtMamF2YS9uZXQvU29ja2V0OylWCiAgICAubG9jYWxzIDAKCiAgICBpcHV0LW9iamVjdCBwMSwgcDAsIExrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXIkMSQxOy0+dGhpcyQxOkxrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXIkMTsKCiAgICBpcHV0LW9iamVjdCBwMiwgcDAsIExrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXIkMSQxOy0+dmFsJGNsaWVudFNvY2tldDpMamF2YS9uZXQvU29ja2V0OwoKICAgIGludm9rZS1kaXJlY3Qge3AwfSwgTGphdmEvbGFuZy9PYmplY3Q7LT48aW5pdD4oKVYKCiAgICByZXR1cm4tdm9pZAouZW5kIG1ldGhvZAoKIyB2aXJ0dWFsIG1ldGhvZHMKLm1ldGhvZCBwdWJsaWMgcnVuKClWCiAgICAubG9jYWxzIDYKCiAgICBjb25zdC8xNiB2MCwgMHg0MDAKCiAgICBuZXctYXJyYXkgdjAsIHYwLCBbQgoKICAgIDp0cnlfc3RhcnQKICAgIGlnZXQtb2JqZWN0IHYxLCBwMCwgTGt6L3FxcXNjaHVsei9zdHJpa2UyZC9Mb2NhbEhvc3RSZWNlaXZlciQxJDE7LT52YWwkY2xpZW50U29ja2V0OkxqYXZhL25ldC9Tb2NrZXQ7CgogICAgaW52b2tlLXZpcnR1YWwge3YxfSwgTGphdmEvbmV0L1NvY2tldDstPmdldElucHV0U3RyZWFtKClMamF2YS9pby9JbnB1dFN0cmVhbTsKCiAgICBtb3ZlLXJlc3VsdC1vYmplY3QgdjEKCiAgICBpZ2V0LW9iamVjdCB2MiwgcDAsIExrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXIkMSQxOy0+dmFsJGNsaWVudFNvY2tldDpMamF2YS9uZXQvU29ja2V0OwoKICAgIGludm9rZS12aXJ0dWFsIHt2Mn0sIExqYXZhL25ldC9Tb2NrZXQ7LT5nZXRPdXRwdXRTdHJlYW0oKUxqYXZhL2lvL091dHB1dFN0cmVhbTsKCiAgICBtb3ZlLXJlc3VsdC1vYmplY3QgdjIKCiAgICBjb25zdC1zdHJpbmcgdjMsICJMb2NhbEhvc3RSZWNlaXZlciIKCiAgICBjb25zdC1zdHJpbmcgdjQsICJQcm9jZXNzaW5nIGNsaWVudCByZXF1ZXN0IgoKICAgIGludm9rZS1zdGF0aWMge3YzLCB2NH0sIExhbmRyb2lkL3V0aWwvTG9nOy0+ZChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspSQoKICAgIGludm9rZS12aXJ0dWFsIHt2MSwgdjB9LCBMamF2YS9pby9JbnB1dFN0cmVhbTstPnJlYWQoW0IpSQoKICAgIG1vdmUtcmVzdWx0IHYzCgogICAgaWYtbGV6IHYzLCA6Y29uZF8wCgogICAgbmV3LWluc3RhbmNlIHY0LCBMamF2YS9sYW5nL1N0cmluZzsKCiAgICBjb25zdC80IHY1LCAweDAKCiAgICBpbnZva2UtZGlyZWN0IHt2NCwgdjAsIHY1LCB2M30sIExqYXZhL2xhbmcvU3RyaW5nOy0+PGluaXQ+KFtCSUkpVgoKICAgIGNvbnN0LXN0cmluZyB2NSwgIkxvY2FsSG9zdFJlY2VpdmVyIgoKICAgIGludm9rZS1zdGF0aWMge3Y1LCB2NH0sIExhbmRyb2lkL3V0aWwvTG9nOy0+ZChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspSQoKICAgIGNvbnN0LXN0cmluZyB2NSwgIkhUVFAvMS4xIDIwMCBPS1xyXG5cclxuSGVsbG8sIFdvcmxkISIKCiAgICBpbnZva2UtdmlydHVhbCB7djV9LCBMamF2YS9sYW5nL1N0cmluZzstPmdldEJ5dGVzKClbQgoKICAgIG1vdmUtcmVzdWx0LW9iamVjdCB2NQoKICAgIGludm9rZS12aXJ0dWFsIHt2MiwgdjV9LCBMamF2YS9pby9PdXRwdXRTdHJlYW07LT53cml0ZShbQilWCgogICAgaW52b2tlLXZpcnR1YWwge3YyfSwgTGphdmEvaW8vT3V0cHV0U3RyZWFtOy0+Zmx1c2goKVYKCiAgICA6Y29uZF8wCiAgICBpZ2V0LW9iamVjdCB2MiwgcDAsIExrei9xcXFzY2h1bHovc3RyaWtlMmQvTG9jYWxIb3N0UmVjZWl2ZXIkMSQxOy0+dmFsJGNsaWVudFNvY2tldDpMamF2YS9uZXQvU29ja2V0OwoKICAgIGludm9rZS12aXJ0dWFsIHt2Mn0sIExqYXZhL25ldC9Tb2NrZXQ7LT5jbG9zZSgpVgogICAgOnRyeV9lbmQKICAgIC5jYXRjaCBMamF2YS9pby9JT0V4Y2VwdGlvbjsgezp0cnlfc3RhcnQgLi4gOnRyeV9lbmR9IDpjYXRjaF8wCgogICAgZ290byA6Z290b18wCgogICAgOmNhdGNoXzAKICAgIG1vdmUtZXhjZXB0aW9uIHYwCgogICAgY29uc3Qtc3RyaW5nIHYxLCAiTG9jYWxIb3N0UmVjZWl2ZXIiCgogICAgY29uc3Qtc3RyaW5nIHYyLCAiQ2xpZW50IGVycm9yIgoKICAgIGludm9rZS1zdGF0aWMge3YxLCB2MiwgdjB9LCBMYW5kcm9pZC91dGlsL0xvZzstPmUoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9UaHJvd2FibGU7KUkKCiAgICA6Z290b18wCiAgICByZXR1cm4tdm9pZAouZW5kIG1ldGhvZA==