DYRPAV6TEJMS74SJZFIZGWBRKUHAUTZ5DZLUYYKVXY522JLSD5KQC 2THKW66MYPEDGPVSVX243DJIHE6RUXYSAANFPTEV5KLS3XHX4MEQC CCLGGFKRUNXBM6IOGEYJOFULCSVOL6C5PFAGCKEWNXOZIKPWLLWQC RRLRZTMR3RQMZCMPIW5DJYAH5A6GXJMJ6ACOM2DPRYXQMQAGMPVAC FV6BJ5K64QG63YI2PTII44ZEBAYNJBQZ5FSBHW65EPHGBKFGUW4AC OB3HA2MD7TDBGGURKXNQKLLLC5FAAD5OX5BENF3M2XNU7OTJ5HHAC OFLAP2G2GH52BDQ7LXXF7P3IMTNW6MS4RQPW3DX2HX4GAYVW6FLAC VS6AHRWIPIMQNQAFX7INQGSUB72OW2K6HM6NGOV76RBRF6COQFRQC 5GINRCKLDLAQ7J32MLENDUBXZTVSLGPJFARMHUPKSRXVBT75BG3QC JD62RVOJGALHC4WMSGU3SZK4I2FO4LCYPRM7UD5PPXN7PNOHXDYAC LL3D5CXKPWIGTQ7MFK4YXDGDZOKD6CU5WCIWV3FG6TPGQOGD75QAC FVVPKFTLD5VOGVDF7MOSSKQ3KPCT4HDGTNTTC6I6B4TWXOTPCJ7AC HKSQO7JZEW6GXKPDJD4VJSYCJJBUDLKVN7SGUU5ZEMIVGII455RAC X6L47BHQPIWFWO53QU6GMRYZC7VPFR4AFTJV7MZIJWIMZG5L65WQC use tokio_xmpp::{Client, Event, Packet};use tokio::prelude::future::{self, Either};use tokio::prelude::stream;use tokio::prelude::{Future, Stream};use std::collections::{HashMap, VecDeque};use super::XmppCommand;use super::stanzas;use super::element_processor;use crate::config;#[derive(Default)]struct XmppData {/// known roster dataroster: HashMap<xmpp_parsers::Jid,(xmpp_parsers::roster::Subscription,xmpp_parsers::roster::Ask,),>,/// ids countercounter: usize,/// map from id of adding item to roster and jid of itempending_add_roster_ids: HashMap<String, xmpp_parsers::Jid>,/// stanzas to sendsend_queue: VecDeque<minidom::Element>,/// outgoing mailboxoutgoing_mailbox: HashMap<xmpp_parsers::Jid, Vec<String>>,/// muc id to muc jidmucs: HashMap<String, xmpp_parsers::Jid>,}struct XmppState {client: Client,data: XmppData,}pub struct XmppConnection {account: std::rc::Rc<config::Account>,state: XmppState,}struct XmppElementProcessor {incoming: element_processor::Processor<XmppConnection, bool, xmpp_parsers::Element>,}impl XmppElementProcessor {fn new() -> XmppElementProcessor {let mut incoming = element_processor::Processor::new(&|_, e| {warn!("Unknown stanza {:#?}", e);true});incoming.register(&XmppConnection::incoming_iq_processing);XmppElementProcessor { incoming }}}pub struct MaybeXmppConnection {account: std::rc::Rc<config::Account>,state: Option<XmppState>,}impl From<XmppConnection> for MaybeXmppConnection {fn from(from: XmppConnection) -> MaybeXmppConnection {MaybeXmppConnection {account: from.account,state: Some(from.state),}}}impl From<config::Account> for MaybeXmppConnection {fn from(from: config::Account) -> MaybeXmppConnection {MaybeXmppConnection {account: std::rc::Rc::new(from),state: None,}}}impl From<std::rc::Rc<config::Account>> for MaybeXmppConnection {fn from(from: std::rc::Rc<config::Account>) -> MaybeXmppConnection {MaybeXmppConnection {account: from,state: None,}}}impl MaybeXmppConnection {/// connects if nothing connected/// don't connect only if stop_future resolvedpub fn connect<F>(self,stop_future: F,) -> impl Future<Item = XmppConnection, Error = failure::Error>whereF: future::Future + Clone + 'static,<F as hyper::rt::Future>::Error: Into<failure::Error> + Send,{info!("xmpp connection...");let MaybeXmppConnection { account, state } = self;if let Some(state) = state {Box::new(future::ok(XmppConnection { account, state }))as Box<dyn Future<Item = _, Error = _>>} else {Box::new(stop_future.clone().select2(future::loop_fn(account, move |account| {info!("xmpp initialization...");let client =Client::new_with_jid(account.jid.clone(), &account.password);info!("xmpp initialized");let stop_future2 = stop_future.clone();let stop_future3 = stop_future.clone();let stop_future4 = stop_future.clone();// future to wait for onlineBox::new(XmppConnection {state: XmppState {client,data: std::default::Default::default(),},account,}.processing(XmppConnection::online, stop_future.clone()).map_err(|(acc, _)| acc).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),}).and_then(|conn| conn.initial_roster(stop_future2)).and_then(|conn| conn.self_presence(stop_future3)).and_then(|conn| conn.enter_mucs(stop_future4)).then(|r| match r {Ok(conn) => future::ok(future::Loop::Break(conn)),Err(acc) => future::ok(future::Loop::Continue(acc)),}),)}).map_err(|_: ()| ()),).then(|r| match r {Ok(Either::A((_x, _b))) => future::err(format_err!("Stop XMMP connection")),Ok(Either::B((x, _a))) => future::ok(x),Err(Either::A((e, _b))) => future::err(e.into()),Err(Either::B((_, _a))) => {future::err(format_err!("Cann't initiate XMPP connection"))}}),)}}}impl XmppConnection {/// base XMPP processing/// Returns false on error to disconnectfn xmpp_processing(&mut self, event: &Event) -> bool {match event {Event::Stanza(stanza) => {let processors = XmppElementProcessor::new();processors.incoming.process(self, stanza.clone())}Event::Online => true,e => {warn!("Unexpected event {:?}", e);false}}}fn incoming_iq_processing(&mut self, iq: xmpp_parsers::iq::Iq) -> bool {use std::convert::TryInto;if let Some((_, jid)) = self.state.data.pending_add_roster_ids.remove_entry(&iq.id) {if let xmpp_parsers::iq::IqType::Result(None) = iq.payload {if self.state.data.roster.contains_key(&jid) {info!("Jid {} updated to roster", jid);} else {info!("Jid {} added in roster", jid);self.state.data.roster.insert(jid.clone(),(xmpp_parsers::roster::Subscription::None,xmpp_parsers::roster::Ask::None,),);}self.process_jid(&jid);} else {warn!("Wrong payload when adding {} to roster: {:?}",jid, iq.payload);}}match iq.payload {xmpp_parsers::iq::IqType::Set(element) => {if let Some(roster) =element.try_into().ok() as Option<xmpp_parsers::roster::Roster>{for i in roster.items {if let Some(ref mut rdata) = self.state.data.roster.get_mut(&i.jid) {info!("Update {} in roster", i.jid);rdata.0 = i.subscription;rdata.1 = i.ask;} else {info!("Add {} to roster", i.jid);self.state.data.roster.insert(i.jid.clone(), (i.subscription, i.ask));}self.process_jid(&i.jid);}}}xmpp_parsers::iq::IqType::Error(e) => {error!("iq error: {:?}", e);return false;}xmpp_parsers::iq::IqType::Get(element) => {if let Some(_ping) = element.try_into().ok() as Option<xmpp_parsers::ping::Ping> {let pong = stanzas::make_pong(&iq.id, self.state.client.jid.clone(), iq.from);self.state.data.send_queue.push_back(pong);}}_ => (), // ignore}true}/// process event from xmpp stream/// returns from future when condition met/// or stop future was resolved./// Return item if connection was preserved or error otherwise./// Second part is a state of stop_futurepub fn processing<S, F, T, E>(self,stop_condition: S,stop_future: F,) -> impl Future<Item = (Self, Result<Either<F, T>, E>),Error = (std::rc::Rc<config::Account>, Result<Either<F, T>, E>),>whereF: Future<Item = T, Error = E> + 'static,S: FnMut(&mut Self, Event) -> Result<bool, ()> + 'static,T: 'static,E: 'static,{future::loop_fn((self, stop_future, stop_condition),|(xmpp, stop_future, mut stop_condition)| {let XmppConnection {state: XmppState { client, mut data },account,} = xmpp;if let Some(send_element) = data.send_queue.pop_front() {use tokio::prelude::Sink;info!("Sending {:?}", send_element);Box::new(client.send(Packet::Stanza(send_element)).select2(stop_future).then(move |r| match r {Ok(Either::A((client, b))) => {Box::new(future::ok(future::Loop::Continue((XmppConnection {state: XmppState { client, data },account,},b,stop_condition,))))as Box<dyn Future<Item = _, Error = _>>}Ok(Either::B((t, a))) => Box::new(a.then(|r| match r {Ok(client) => future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Ok(Either::B(t)),))),Err(se) => {warn!("XMPP sending error: {}", se);future::err((account, Ok(Either::B(t))))}})),Err(Either::A((e, b))) => {warn!("XMPP sending error: {}", e);Box::new(future::err((account, Ok(Either::A(b)))))}Err(Either::B((e, a))) => Box::new(a.then(|r| match r {Ok(client) => future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),))),Err(se) => {warn!("XMPP sending error: {}", se);future::err((account, Err(e)))}})),}),) as Box<dyn Future<Item = _, Error = _>>} else {Box::new(client.into_future().select2(stop_future).then(move |r| match r {Ok(Either::A(((event, client), b))) => {if let Some(event) = event {let mut xmpp = XmppConnection {state: XmppState { client, data },account,};if xmpp.xmpp_processing(&event) {match stop_condition(&mut xmpp, event) {Ok(true) => future::ok(future::Loop::Break((xmpp,Ok(Either::A(b)),))),Ok(false) => future::ok(future::Loop::Continue((xmpp,b,stop_condition,))),Err(_e) => {future::err((xmpp.account, Ok(Either::A(b))))}}} else {future::err((xmpp.account, Ok(Either::A(b))))}} else {future::err((account, Ok(Either::A(b))))}}Ok(Either::B((t, a))) => {if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Ok(Either::B(t)),)))} else {future::err((account, Ok(Either::B(t))))}}Err(Either::A((e, b))) => {warn!("XMPP error: {}", e.0);future::err((account, Ok(Either::A(b))))}Err(Either::B((e, a))) => {if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),)))} else {future::err((account, Err(e)))}}}),)}},)}/// get connection and wait for online status and set presence/// returns error if something went wrong and xmpp connection is brokenfn online(&mut self, event: Event) -> Result<bool, ()> {match event {Event::Online => {info!("Online!");Ok(true)}Event::Stanza(s) => {warn!("Stanza before online: {:?}", s);Ok(false)}_ => {error!("Disconnected while online");Err(())}}}fn process_initial_roster(&mut self, event: Event, id_init_roster: &str) -> Result<bool, ()> {if let Event::Stanza(s) = event {use std::convert::TryInto;match s.try_into() as Result<xmpp_parsers::iq::Iq, _> {Ok(iq) => {if iq.id == id_init_roster {match iq.payload {xmpp_parsers::iq::IqType::Error(_e) => {error!("Get error instead of roster");Err(())}xmpp_parsers::iq::IqType::Result(Some(result)) => {match result.try_into() as Result<xmpp_parsers::roster::Roster, _> {Ok(roster) => {self.state.data.roster.clear();info!("Got first roster:");for i in roster.items {info!(" >>> {:?}", i);self.state.data.roster.insert(i.jid, (i.subscription, i.ask));}Ok(true)}Err(e) => {error!("Cann't parse roster: {}", e);Err(())}}}_ => {error!("Unknown result of roster");Err(())}}} else {Ok(false)}}Err(_e) => Ok(false),}} else {error!("Wrong event while waiting roster");Err(())}}fn initial_roster<F, E>(self,stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: 'static,{let XmppConnection {account,state: XmppState { client, mut data },} = self;use tokio::prelude::Sink;data.counter += 1;let id_init_roster = format!("id_init_roster{}", data.counter);let get_roster = stanzas::make_get_roster(&id_init_roster);let account2 = account.clone();info!("Quering roster... {:?}", get_roster);client.send(Packet::Stanza(get_roster)).map_err(move |e| {error!("Error on querying roster: {}", e);account2}).and_then(move |client| {XmppConnection {state: XmppState { client, data },account,}.processing(move |conn, event| conn.process_initial_roster(event, &id_init_roster),stop_future,).map_err(|(account, _)| account).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),})})}fn self_presence<F, E>(self,stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection {account,state: XmppState { client, data },} = self;use tokio::prelude::Sink;let presence = stanzas::make_presence(&account);let account2 = account.clone();info!("Sending presence... {:?}", presence);client.send(Packet::Stanza(presence)).map_err(|e| {error!("Error on send self-presence: {}", e);account2}).and_then(move |client| {XmppConnection {state: XmppState { client, data },account,}.processing(move |conn, event| {if let Event::Stanza(s) = event {use std::convert::TryInto;match s.try_into() as Result<xmpp_parsers::presence::Presence, _> {Ok(presence) => {Ok(presence.from.as_ref() == Some(&conn.state.client.jid))}Err(e) => {warn!("Not a self-presence: {}", e);Ok(false)}}} else {error!("Wrong event while waiting self-presence");Err(())}},stop_future,).map_err(|(account, _)| account).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),})})}fn process_jid(&mut self, xmpp_to: &xmpp_parsers::Jid) {if let Some(ref mut mailbox) = self.state.data.outgoing_mailbox.get_mut(xmpp_to) {if !mailbox.is_empty() {if let Some(ref mut rdata) = self.state.data.roster.get_mut(xmpp_to) {info!("Jid {} in roster", xmpp_to);let sub_to = match rdata.0 {xmpp_parsers::roster::Subscription::To => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if sub_to {info!("Subscribed to {}", xmpp_to);self.state.data.send_queue.extend(mailbox.drain(..).map(|message| {stanzas::make_chat_message(xmpp_to.clone(), message)}),);} else if rdata.1 == xmpp_parsers::roster::Ask::None {info!("Not subscribed to {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_ask_subscribe(xmpp_to.clone()));}let sub_from = match rdata.0 {xmpp_parsers::roster::Subscription::From => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if !sub_from {info!("Not subscription from {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_allow_subscribe(xmpp_to.clone()));}} else {info!("Jid {} not in roster", xmpp_to);self.state.data.counter += 1;let id_add_roster = format!("id_add_roster{}", self.state.data.counter);let add_roster = stanzas::make_add_roster(&id_add_roster, xmpp_to.clone());self.state.data.pending_add_roster_ids.insert(id_add_roster, xmpp_to.clone());info!("Adding jid to roster... {:?}", add_roster);self.state.data.send_queue.push_back(add_roster);}}}}pub fn process_command(&mut self, cmd: XmppCommand) {info!("Got command");match cmd {XmppCommand::Chat { xmpp_to, message } => {self.state.data.outgoing_mailbox.entry(xmpp_to.clone()).or_default().push(message);self.process_jid(&xmpp_to);}XmppCommand::Chatroom { muc_id, message } => {if let Some(muc) = self.state.data.mucs.get(&muc_id) {self.state.data.send_queue.push_back(stanzas::make_muc_message(muc.clone(), message));} else {error!("Not found MUC {}", muc_id);}}XmppCommand::Ping => {self.state.data.counter += 1;let id_ping = format!("id_ping{}", self.state.data.counter);let ping = stanzas::make_ping(&id_ping, self.state.client.jid.clone());self.state.data.send_queue.push_back(ping);}}}pub fn shutdown(self) -> impl Future<Item = (), Error = failure::Error> {info!("Shutdown connection");let XmppConnection { account, state } = self;stream::iter_ok(state.data.mucs.values().map(std::clone::Clone::clone).collect::<Vec<_>>(),).fold(state, move |XmppState { client, data }, muc_jid| {let muc_presence =stanzas::make_muc_presence_leave(account.jid.clone(), muc_jid.clone());info!("Sending muc leave presence... {:?}", muc_presence);use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);e}).and_then(|client| future::ok(XmppState { client, data }))}).map(|_| ())}fn enter_mucs<F, E>(self,_stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection { account, state } = self;let account2 = account.clone();let account3 = account.clone();stream::iter_ok(account.chatrooms.clone()).fold(state, move |XmppState { client, mut data }, muc_jid| {data.counter += 1;let id_muc_presence = format!("id_muc_presence{}", data.counter);let muc_presence = stanzas::make_muc_presence(&id_muc_presence,account2.jid.clone(),muc_jid.1.clone(),);info!("Sending muc presence... {:?}", muc_presence);let account4 = account2.clone();use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);account4}).and_then(|client| {data.mucs.insert(muc_jid.0, muc_jid.1);future::ok(XmppState { client, data })})}).map(|state| XmppConnection {account: account3,state,})}}
use tokio_xmpp::{Client, Event, Packet};use tokio::prelude::future::{self, Either};use tokio::prelude::stream;use tokio::prelude::{Future, Stream};use std::collections::{HashMap, VecDeque};use super::XmppCommand;use super::stanzas;use super::element_processor;use crate::config;#[derive(Default)]struct XmppData {/// known roster dataroster: HashMap<xmpp_parsers::Jid,(xmpp_parsers::roster::Subscription,xmpp_parsers::roster::Ask,),>,/// ids countercounter: usize,/// map from id of adding item to roster and jid of itempending_add_roster_ids: HashMap<String, xmpp_parsers::Jid>,/// stanzas to sendsend_queue: VecDeque<minidom::Element>,/// outgoing mailboxoutgoing_mailbox: HashMap<xmpp_parsers::Jid, Vec<String>>,/// muc id to muc jidmucs: HashMap<String, xmpp_parsers::Jid>,}struct XmppState {client: Client,data: XmppData,}pub struct XmppConnection {account: std::rc::Rc<config::Account>,state: XmppState,}struct XmppElementProcessor {incoming: element_processor::Processor<XmppConnection, bool, xmpp_parsers::Element>,}impl XmppElementProcessor {fn new() -> XmppElementProcessor {let mut incoming = element_processor::Processor::new(&|_, e| {warn!("Unknown stanza {:#?}", e);true});incoming.register(&XmppConnection::incoming_iq_processing);XmppElementProcessor { incoming }}}pub struct MaybeXmppConnection {account: std::rc::Rc<config::Account>,state: Option<XmppState>,}impl From<XmppConnection> for MaybeXmppConnection {fn from(from: XmppConnection) -> MaybeXmppConnection {MaybeXmppConnection {account: from.account,state: Some(from.state),}}}impl From<config::Account> for MaybeXmppConnection {fn from(from: config::Account) -> MaybeXmppConnection {MaybeXmppConnection {account: std::rc::Rc::new(from),state: None,}}}impl From<std::rc::Rc<config::Account>> for MaybeXmppConnection {fn from(from: std::rc::Rc<config::Account>) -> MaybeXmppConnection {MaybeXmppConnection {account: from,state: None,}}}impl MaybeXmppConnection {/// connects if nothing connected/// don't connect only if stop_future resolvedpub fn connect<F>(self,stop_future: F,) -> impl Future<Item = XmppConnection, Error = failure::Error>whereF: future::Future + Clone + 'static,<F as hyper::rt::Future>::Error: Into<failure::Error> + Send,{info!("xmpp connection...");let MaybeXmppConnection { account, state } = self;if let Some(state) = state {Box::new(future::ok(XmppConnection { account, state }))as Box<dyn Future<Item = _, Error = _>>} else {Box::new(stop_future.clone().select2(future::loop_fn(account, move |account| {info!("xmpp initialization...");let client =Client::new_with_jid(account.jid.clone(), &account.password);info!("xmpp initialized");let stop_future2 = stop_future.clone();let stop_future3 = stop_future.clone();let stop_future4 = stop_future.clone();// future to wait for onlineBox::new(XmppConnection {state: XmppState {client,data: std::default::Default::default(),},account,}.processing(XmppConnection::online, stop_future.clone()).map_err(|(acc, _)| acc).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),}).and_then(|conn| conn.initial_roster(stop_future2)).and_then(|conn| conn.self_presence(stop_future3)).and_then(|conn| conn.enter_mucs(stop_future4)).then(|r| match r {Ok(conn) => future::ok(future::Loop::Break(conn)),Err(acc) => future::ok(future::Loop::Continue(acc)),}),)}).map_err(|_: ()| ()),).then(|r| match r {Ok(Either::A((_x, _b))) => future::err(format_err!("Stop XMMP connection")),Ok(Either::B((x, _a))) => future::ok(x),Err(Either::A((e, _b))) => future::err(e.into()),Err(Either::B((_, _a))) => {future::err(format_err!("Cann't initiate XMPP connection"))}}),)}}}impl XmppConnection {/// base XMPP processing/// Returns false on error to disconnectfn xmpp_processing(&mut self, event: &Event) -> bool {match event {Event::Stanza(stanza) => {let processors = XmppElementProcessor::new();processors.incoming.process(self, stanza.clone())}Event::Online => true,e => {warn!("Unexpected event {:?}", e);false}}}fn incoming_iq_processing(&mut self, iq: xmpp_parsers::iq::Iq) -> bool {use std::convert::TryInto;if let Some((_, jid)) = self.state.data.pending_add_roster_ids.remove_entry(&iq.id) {if let xmpp_parsers::iq::IqType::Result(None) = iq.payload {if self.state.data.roster.contains_key(&jid) {info!("Jid {} updated to roster", jid);} else {info!("Jid {} added in roster", jid);self.state.data.roster.insert(jid.clone(),(xmpp_parsers::roster::Subscription::None,xmpp_parsers::roster::Ask::None,),);}self.process_jid(&jid);} else {warn!("Wrong payload when adding {} to roster: {:?}",jid, iq.payload);}}match iq.payload {xmpp_parsers::iq::IqType::Set(element) => {if let Some(roster) =element.try_into().ok() as Option<xmpp_parsers::roster::Roster>{for i in roster.items {if let Some(ref mut rdata) = self.state.data.roster.get_mut(&i.jid) {info!("Update {} in roster", i.jid);rdata.0 = i.subscription;rdata.1 = i.ask;} else {info!("Add {} to roster", i.jid);self.state.data.roster.insert(i.jid.clone(), (i.subscription, i.ask));}self.process_jid(&i.jid);}}}xmpp_parsers::iq::IqType::Error(e) => {error!("iq error: {:?}", e);return false;}xmpp_parsers::iq::IqType::Get(element) => {if let Some(_ping) = element.try_into().ok() as Option<xmpp_parsers::ping::Ping> {let pong = stanzas::make_pong(&iq.id, self.state.client.jid.clone(), iq.from);self.state.data.send_queue.push_back(pong);}}_ => (), // ignore}true}/// process event from xmpp stream/// returns from future when condition met/// or stop future was resolved./// Return item if connection was preserved or error otherwise./// Second part is a state of stop_futurepub fn processing<S, F, T, E>(self,stop_condition: S,stop_future: F,) -> impl Future<Item = (Self, Result<Either<F, T>, E>),Error = (std::rc::Rc<config::Account>, Result<Either<F, T>, E>),>whereF: Future<Item = T, Error = E> + 'static,S: FnMut(&mut Self, Event) -> Result<bool, ()> + 'static,T: 'static,E: 'static,{future::loop_fn((self, stop_future, stop_condition),|(xmpp, stop_future, mut stop_condition)| {let XmppConnection {state: XmppState { client, mut data },account,} = xmpp;if let Some(send_element) = data.send_queue.pop_front() {use tokio::prelude::Sink;info!("Sending {:?}", send_element);Box::new(client.send(Packet::Stanza(send_element)).select2(stop_future).then(move |r| match r {Ok(Either::A((client, b))) => {Box::new(future::ok(future::Loop::Continue((XmppConnection {state: XmppState { client, data },account,},b,stop_condition,))))as Box<dyn Future<Item = _, Error = _>>}Ok(Either::B((t, a))) => Box::new(a.then(|r| match r {Ok(client) => future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Ok(Either::B(t)),))),Err(se) => {warn!("XMPP sending error: {}", se);future::err((account, Ok(Either::B(t))))}})),Err(Either::A((e, b))) => {warn!("XMPP sending error: {}", e);Box::new(future::err((account, Ok(Either::A(b)))))}Err(Either::B((e, a))) => Box::new(a.then(|r| match r {Ok(client) => future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),))),Err(se) => {warn!("XMPP sending error: {}", se);future::err((account, Err(e)))}})),}),) as Box<dyn Future<Item = _, Error = _>>} else {Box::new(client.into_future().select2(stop_future).then(move |r| match r {Ok(Either::A(((event, client), b))) => {if let Some(event) = event {let mut xmpp = XmppConnection {state: XmppState { client, data },account,};if xmpp.xmpp_processing(&event) {match stop_condition(&mut xmpp, event) {Ok(true) => future::ok(future::Loop::Break((xmpp,Ok(Either::A(b)),))),Ok(false) => future::ok(future::Loop::Continue((xmpp,b,stop_condition,))),Err(_e) => {future::err((xmpp.account, Ok(Either::A(b))))}}} else {future::err((xmpp.account, Ok(Either::A(b))))}} else {future::err((account, Ok(Either::A(b))))}}Ok(Either::B((t, a))) => {if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Ok(Either::B(t)),)))} else {future::err((account, Ok(Either::B(t))))}}Err(Either::A((e, b))) => {warn!("XMPP error: {}", e.0);future::err((account, Ok(Either::A(b))))}Err(Either::B((e, a))) => {if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),)))} else {future::err((account, Err(e)))}}}),)}},)}/// get connection and wait for online status and set presence/// returns error if something went wrong and xmpp connection is brokenfn online(&mut self, event: Event) -> Result<bool, ()> {match event {Event::Online => {info!("Online!");Ok(true)}Event::Stanza(s) => {warn!("Stanza before online: {:?}", s);Ok(false)}_ => {error!("Disconnected while online");Err(())}}}fn process_initial_roster(&mut self, event: Event, id_init_roster: &str) -> Result<bool, ()> {if let Event::Stanza(s) = event {use std::convert::TryInto;match s.try_into() as Result<xmpp_parsers::iq::Iq, _> {Ok(iq) => {if iq.id == id_init_roster {match iq.payload {xmpp_parsers::iq::IqType::Error(_e) => {error!("Get error instead of roster");Err(())}xmpp_parsers::iq::IqType::Result(Some(result)) => {match result.try_into() as Result<xmpp_parsers::roster::Roster, _> {Ok(roster) => {self.state.data.roster.clear();info!("Got first roster:");for i in roster.items {info!(" >>> {:?}", i);self.state.data.roster.insert(i.jid, (i.subscription, i.ask));}Ok(true)}Err(e) => {error!("Cann't parse roster: {}", e);Err(())}}}_ => {error!("Unknown result of roster");Err(())}}} else {Ok(false)}}Err(_e) => Ok(false),}} else {error!("Wrong event while waiting roster");Err(())}}fn initial_roster<F, E>(self,stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: 'static,{let XmppConnection {account,state: XmppState { client, mut data },} = self;use tokio::prelude::Sink;data.counter += 1;let id_init_roster = format!("id_init_roster{}", data.counter);let get_roster = stanzas::make_get_roster(&id_init_roster);let account2 = account.clone();info!("Quering roster... {:?}", get_roster);client.send(Packet::Stanza(get_roster)).map_err(move |e| {error!("Error on querying roster: {}", e);account2}).and_then(move |client| {XmppConnection {state: XmppState { client, data },account,}.processing(move |conn, event| conn.process_initial_roster(event, &id_init_roster),stop_future,).map_err(|(account, _)| account).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),})})}fn self_presence<F, E>(self,stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection {account,state: XmppState { client, data },} = self;use tokio::prelude::Sink;let presence = stanzas::make_presence(&account);let account2 = account.clone();info!("Sending presence... {:?}", presence);client.send(Packet::Stanza(presence)).map_err(|e| {error!("Error on send self-presence: {}", e);account2}).and_then(move |client| {XmppConnection {state: XmppState { client, data },account,}.processing(move |conn, event| {if let Event::Stanza(s) = event {use std::convert::TryInto;match s.try_into() as Result<xmpp_parsers::presence::Presence, _> {Ok(presence) => {Ok(presence.from.as_ref() == Some(&conn.state.client.jid))}Err(e) => {warn!("Not a self-presence: {}", e);Ok(false)}}} else {error!("Wrong event while waiting self-presence");Err(())}},stop_future,).map_err(|(account, _)| account).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),})})}fn process_jid(&mut self, xmpp_to: &xmpp_parsers::Jid) {if let Some(ref mut mailbox) = self.state.data.outgoing_mailbox.get_mut(xmpp_to) {if !mailbox.is_empty() {if let Some(ref mut rdata) = self.state.data.roster.get_mut(xmpp_to) {info!("Jid {} in roster", xmpp_to);let sub_to = match rdata.0 {xmpp_parsers::roster::Subscription::To => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if sub_to {info!("Subscribed to {}", xmpp_to);self.state.data.send_queue.extend(mailbox.drain(..).map(|message| {stanzas::make_chat_message(xmpp_to.clone(), message)}),);} else if rdata.1 == xmpp_parsers::roster::Ask::None {info!("Not subscribed to {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_ask_subscribe(xmpp_to.clone()));}let sub_from = match rdata.0 {xmpp_parsers::roster::Subscription::From => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if !sub_from {info!("Not subscription from {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_allow_subscribe(xmpp_to.clone()));}} else {info!("Jid {} not in roster", xmpp_to);self.state.data.counter += 1;let id_add_roster = format!("id_add_roster{}", self.state.data.counter);let add_roster = stanzas::make_add_roster(&id_add_roster, xmpp_to.clone());self.state.data.pending_add_roster_ids.insert(id_add_roster, xmpp_to.clone());info!("Adding jid to roster... {:?}", add_roster);self.state.data.send_queue.push_back(add_roster);}}}}pub fn process_command(&mut self, cmd: XmppCommand) {info!("Got command");match cmd {XmppCommand::Chat { xmpp_to, message } => {self.state.data.outgoing_mailbox.entry(xmpp_to.clone()).or_default().push(message);self.process_jid(&xmpp_to);}XmppCommand::Chatroom { muc_id, message } => {if let Some(muc) = self.state.data.mucs.get(&muc_id) {self.state.data.send_queue.push_back(stanzas::make_muc_message(muc.clone(), message));} else {error!("Not found MUC {}", muc_id);}}XmppCommand::Ping => {self.state.data.counter += 1;let id_ping = format!("id_ping{}", self.state.data.counter);let ping = stanzas::make_ping(&id_ping, self.state.client.jid.clone());self.state.data.send_queue.push_back(ping);}}}pub fn shutdown(self) -> impl Future<Item = (), Error = failure::Error> {info!("Shutdown connection");let XmppConnection { account, state } = self;stream::iter_ok(state.data.mucs.values().map(std::clone::Clone::clone).collect::<Vec<_>>(),).fold(state, move |XmppState { client, data }, muc_jid| {let muc_presence =stanzas::make_muc_presence_leave(account.jid.clone(), muc_jid.clone());info!("Sending muc leave presence... {:?}", muc_presence);use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);e}).and_then(|client| future::ok(XmppState { client, data }))}).map(|_| ())}fn enter_mucs<F, E>(self,_stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection { account, state } = self;let account2 = account.clone();let account3 = account.clone();stream::iter_ok(account.chatrooms.clone()).fold(state, move |XmppState { client, mut data }, muc_jid| {data.counter += 1;let id_muc_presence = format!("id_muc_presence{}", data.counter);let muc_presence = stanzas::make_muc_presence(&id_muc_presence,account2.jid.clone(),muc_jid.1.clone(),);info!("Sending muc presence... {:?}", muc_presence);let account4 = account2.clone();use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);account4}).and_then(|client| {data.mucs.insert(muc_jid.0, muc_jid.1);future::ok(XmppState { client, data })})}).map(|state| XmppConnection {account: account3,state,})}}
let mut add_roster = Iq::from_set(Roster {items: vec![Item {jid,name: None,subscription: xmpp_parsers::roster::Subscription::None,ask: xmpp_parsers::roster::Ask::None,groups: vec![],}],ver: None,});add_roster.id = Some(id.to_string());add_roster.into()
Iq::from_set(id,Roster {items: vec![Item {jid,name: None,subscription: xmpp_parsers::roster::Subscription::None,ask: xmpp_parsers::roster::Ask::None,groups: vec![],}],ver: None,},).into()
pub fn make_muc_presence_leave(from: xmpp_parsers::Jid, to: xmpp_parsers::Jid) -> Element {let mut presence = Presence::new(PresenceType::Unavailable);presence.from = Some(from);presence.to = Some(to);presence.into()}pub fn make_ping(id: &str, from: xmpp_parsers::Jid) -> Element {let mut ping = Iq::from_get(id, Ping);ping.to = Some(from.clone().into_domain_jid());ping.from = Some(from);ping.into()}pub fn make_pong(id: &str, from: xmpp_parsers::Jid, to: Option<xmpp_parsers::Jid>) -> Element {let mut pong = Iq::from_result(id, None as Option<Roster>);pong.from = Some(from);pong.to = to;pong.into()}
use try_from::TryInto;if let Some(iq) = stanza.try_into().ok() as Option<xmpp_parsers::iq::Iq> {if let Some(id) = iq.id {if let Some((_, jid)) =self.state.data.pending_add_roster_ids.remove_entry(&id){if let xmpp_parsers::iq::IqType::Result(None) = iq.payload {if self.state.data.roster.contains_key(&jid) {info!("Jid {} updated to roster", jid);} else {info!("Jid {} added in roster", jid);self.state.data.roster.insert(jid.clone(),(xmpp_parsers::roster::Subscription::None,xmpp_parsers::roster::Ask::None,),);}self.process_jid(&jid);
use std::convert::TryInto;if let Some(iq) = stanza.clone().try_into().ok() as Option<xmpp_parsers::iq::Iq> {if let Some((_, jid)) =self.state.data.pending_add_roster_ids.remove_entry(&iq.id){if let xmpp_parsers::iq::IqType::Result(None) = iq.payload {if self.state.data.roster.contains_key(&jid) {info!("Jid {} updated to roster", jid);
if let xmpp_parsers::iq::IqType::Set(element) = iq.payload {if let Some(roster) =element.try_into().ok() as Option<xmpp_parsers::roster::Roster>{for i in roster.items {if let Some(ref mut rdata) = self.state.data.roster.get_mut(&i.jid){info!("Update {} in roster", i.jid);rdata.0 = i.subscription;rdata.1 = i.ask;} else {info!("Add {} to roster", i.jid);self.state.data.roster.insert(i.jid.clone(), (i.subscription, i.ask));
match iq.payload {xmpp_parsers::iq::IqType::Set(element) => {if let Some(roster) =element.try_into().ok() as Option<xmpp_parsers::roster::Roster>{for i in roster.items {if let Some(ref mut rdata) =self.state.data.roster.get_mut(&i.jid){info!("Update {} in roster", i.jid);rdata.0 = i.subscription;rdata.1 = i.ask;} else {info!("Add {} to roster", i.jid);self.state.data.roster.insert(i.jid.clone(), (i.subscription, i.ask));}self.process_jid(&i.jid);
self.process_jid(&i.jid);
}}xmpp_parsers::iq::IqType::Error(e) => {error!("iq error: {:?}", e);return false;}xmpp_parsers::iq::IqType::Get(element) => {if let Some(_ping) =element.try_into().ok() as Option<xmpp_parsers::ping::Ping>{let pong = stanzas::make_pong(&iq.id,self.state.client.jid.clone(),iq.from,);self.state.data.send_queue.push_back(pong);
Box::new(xmpp.xmpp_processing(&event).then(|r| match r {Ok(mut xmpp) => {match stop_condition(&mut xmpp, event) {Ok(true) => future::ok(future::Loop::Break((xmpp,Ok(Either::A(b)),))),Ok(false) => {future::ok(future::Loop::Continue((xmpp,b,stop_condition,)))}Err(_e) => future::err((xmpp.account,Ok(Either::A(b)),)),
if xmpp.xmpp_processing(&event) {match stop_condition(&mut xmpp, event) {Ok(true) => future::ok(future::Loop::Break((xmpp,Ok(Either::A(b)),))),Ok(false) => future::ok(future::Loop::Continue((xmpp,b,stop_condition,))),Err(_e) => {future::err((xmpp.account, Ok(Either::A(b))))
if let Some(id) = iq.id {if id == id_init_roster {match iq.payload {xmpp_parsers::iq::IqType::Error(_e) => {error!("Get error instead of roster");Err(())}xmpp_parsers::iq::IqType::Result(Some(result)) => {match result.try_into()as Result<xmpp_parsers::roster::Roster, _>{Ok(roster) => {self.state.data.roster.clear();info!("Got first roster:");for i in roster.items {info!(" >>> {:?}", i);self.state.data.roster.insert(i.jid, (i.subscription, i.ask));}Ok(true)
if iq.id == id_init_roster {match iq.payload {xmpp_parsers::iq::IqType::Error(_e) => {error!("Get error instead of roster");Err(())}xmpp_parsers::iq::IqType::Result(Some(result)) => {match result.try_into() as Result<xmpp_parsers::roster::Roster, _> {Ok(roster) => {self.state.data.roster.clear();info!("Got first roster:");for i in roster.items {info!(" >>> {:?}", i);self.state.data.roster.insert(i.jid, (i.subscription, i.ask));
if s.name() == "presence"&& s.attr("from").map_or(false, |f| f == conn.account.jid)&& s.attr("to").map_or(false, |f| f == conn.account.jid){Ok(true)} else {Ok(false)
use std::convert::TryInto;match s.try_into() as Result<xmpp_parsers::presence::Presence, _> {Ok(presence) => {Ok(presence.from.as_ref() == Some(&conn.state.client.jid))}Err(e) => {warn!("Not a self-presence: {}", e);Ok(false)}
fn shutdown(self) -> impl Future<Item = (), Error = failure::Error> {info!("Shutdown connection");let XmppConnection { account, state } = self;stream::iter_ok(state.data.mucs.values().map(std::clone::Clone::clone).collect::<Vec<_>>(),).fold(state, move |XmppState { client, data }, muc_jid| {let muc_presence =stanzas::make_muc_presence_leave(account.jid.clone(), muc_jid.clone());info!("Sending muc leave presence... {:?}", muc_presence);use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);e}).and_then(|client| future::ok(XmppState { client, data }))}).map(|_| ())}
type Func<S, T, E> = dyn Fn(&mut S, E) -> T;pub struct Processor<S: 'static, T: 'static, E: Clone + 'static> {processors: Vec<Box<Func<S, Option<T>, E>>>,default: &'static Func<S, T, E>,}impl<S: 'static, T: 'static, E: Clone + 'static> Processor<S, T, E> {pub fn new<F>(f: &'static F) -> Processor<S, T, E>whereF: Fn(&mut S, E) -> T + 'static,{Processor {processors: vec![],default: f,}}pub fn register<F, A>(&mut self, f: &'static F)whereF: Fn(&mut S, A) -> T + 'static,A: std::convert::TryFrom<E>,{self.processors.push(Box::new(move |s, e: E| {use std::convert::TryInto;(e.try_into().ok() as Option<A>).map(|a| f(s, a))}));}pub fn process(&self, s: &mut S, e: E) -> T {for processor in self.processors.iter() {match processor(s, e.clone()) {Some(t) => return t,None => continue,}}(*self.default)(s, e)}}
type Func<S, T, E> = dyn Fn(&mut S, E) -> T;pub struct Processor<S: 'static, T: 'static, E: Clone + 'static> {processors: Vec<Box<Func<S, Option<T>, E>>>,default: &'static Func<S, T, E>,}impl<S: 'static, T: 'static, E: Clone + 'static> Processor<S, T, E> {pub fn new<F>(f: &'static F) -> Processor<S, T, E>whereF: Fn(&mut S, E) -> T + 'static,{Processor {processors: vec![],default: f,}}pub fn register<F, A>(&mut self, f: &'static F)whereF: Fn(&mut S, A) -> T + 'static,A: std::convert::TryFrom<E>,{self.processors.push(Box::new(move |s, e: E| {use std::convert::TryInto;(e.try_into().ok() as Option<A>).map(|a| f(s, a))}));}pub fn process(&self, s: &mut S, e: E) -> T {for processor in self.processors.iter() {match processor(s, e.clone()) {Some(t) => return t,None => continue,}}(*self.default)(s, e)}}
#![deny(deprecated)]#![deny(missing_docs)]#![deny(bare_trait_objects)]//! XMPP client serviceextern crate clap;extern crate hyper;#[macro_use]extern crate log;extern crate env_logger;#[macro_use]extern crate serde_derive;extern crate tokio;extern crate tokio_channel;extern crate tokio_signal;extern crate tokio_xmpp;#[macro_use]extern crate failure;extern crate toml;extern crate xmpp_parsers;use hyper::{Body, Request, Response, Server};use tokio::runtime::current_thread;use tokio::runtime::Runtime;use tokio::prelude::{Future, Sink, Stream};mod config;use crate::config::Config;mod xmpp;use crate::xmpp::{xmpp_process, XmppCommand};mod stoppable_receiver;use crate::stoppable_receiver::stop_receiver;fn body_to_string(req: Request<Body>) -> impl Future<Item = String, Error = failure::Error> {req.into_body().map_err(std::convert::Into::into).fold(String::new(), |mut acc, ch| {std::str::from_utf8(&*ch).map(|s| {acc.push_str(s);acc})})}struct ServiceCmd {cmd_send: tokio_channel::mpsc::Sender<XmppCommand>,}impl hyper::service::Service for ServiceCmd {type ReqBody = Body;type ResBody = Body;type Error = failure::Error;type Future =Box<dyn Future<Item = Response<Self::ResBody>, Error = Self::Error> + Send + 'static>;fn call(&mut self, req: Request<Self::ReqBody>) -> Self::Future {let xmpp_to_opt = req.headers().get("X-XMPP-To");let xmpp_to_res: Result<xmpp_parsers::Jid, failure::Error> = xmpp_to_opt.map_or_else(|| Err(format_err!("No X-XMPP-To header")),|xmpp_to| {std::str::from_utf8(xmpp_to.as_bytes()).map_err(std::convert::Into::into).and_then(|s| std::str::FromStr::from_str(s).map_err(std::convert::Into::into))},);let xmpp_muc_opt = req.headers().get("X-XMPP-Muc").map(|h| h.to_str().map(std::string::ToString::to_string));match (xmpp_muc_opt, xmpp_to_res) {(None, Err(err)) => {warn!("Unknown destination: {}", err);Box::new(tokio::prelude::future::result(Response::builder().status(hyper::StatusCode::BAD_REQUEST).body(Body::from(format!("Unknown destination: {}", err))).map_err(std::convert::Into::into),)) as Box<dyn Future<Item = _, Error = _> + Send + 'static>}(None, Ok(xmpp_to)) => {info!("Got request. Reading body...");let cmd_send = self.cmd_send.clone();Box::new(body_to_string(req).and_then(move |message: String| {if !message.is_empty() {Box::new(cmd_send.clone().send(XmppCommand::Chat { xmpp_to, message }).then(|r| match r {Ok(_) => tokio::prelude::future::ok(Response::new(Body::from("Accepted",))),Err(e) => {error!("Command sent error: {}", e);tokio::prelude::future::result(Response::builder().status(hyper::StatusCode::BAD_REQUEST).body(Body::from(format!("Command sent error: {}",e))),)}}).map_err(std::convert::Into::into),)} else {warn!("Empty message");Box::new(tokio::prelude::future::result(Response::builder().status(hyper::StatusCode::BAD_REQUEST).body(Body::from("Empty message")).map_err(std::convert::Into::into),))as Box<dyn Future<Item = _, Error = _> + Send + 'static>}})) as Box<dyn Future<Item = _, Error = _> + Send + 'static>}(Some(Ok(muc_id)), _) => {info!("Got MUC request. Reading body...");let cmd_send = self.cmd_send.clone();Box::new(body_to_string(req).and_then(move |message: String| {if !message.is_empty() {Box::new(cmd_send.clone().send(XmppCommand::Chatroom { muc_id, message }).then(|r| match r {Ok(_) => tokio::prelude::future::ok(Response::new(Body::from("Accepted",))),Err(e) => {error!("Command sent error: {}", e);tokio::prelude::future::result(Response::builder().status(hyper::StatusCode::BAD_REQUEST).body(Body::from(format!("Command sent error: {}",e))),)}}).map_err(std::convert::Into::into),)} else {warn!("Empty message");Box::new(tokio::prelude::future::result(Response::builder().status(hyper::StatusCode::BAD_REQUEST).body(Body::from("Empty message")).map_err(std::convert::Into::into),))as Box<dyn Future<Item = _, Error = _> + Send + 'static>}})) as Box<dyn Future<Item = _, Error = _> + Send + 'static>}(Some(Err(err)), _) => {warn!("Unknown MUC destination: {}", err);Box::new(tokio::prelude::future::result(Response::builder().status(hyper::StatusCode::BAD_REQUEST).body(Body::from(format!("Unknown MUC destination: {}", err))).map_err(std::convert::Into::into),)) as Box<dyn Future<Item = _, Error = _> + Send + 'static>}}}}struct MakeServiceCmd {cmd_send: tokio_channel::mpsc::Sender<XmppCommand>,}impl<Ctx> hyper::service::MakeService<Ctx> for MakeServiceCmd {type ReqBody = Body;type ResBody = Body;type Error = failure::Error;type Service = ServiceCmd;type Future = tokio::prelude::future::FutureResult<ServiceCmd, Self::MakeError>;type MakeError = hyper::http::Error;fn make_service(&mut self, _ctx: Ctx) -> Self::Future {tokio::prelude::future::ok(ServiceCmd {cmd_send: self.cmd_send.clone(),})}}
println!("Hello, world!");
env_logger::init();let args = clap::App::new("SendXMPP").version("0.1.0").author("O01eg <o01eg@yandex.ru>").arg(clap::Arg::with_name("config").short("c").long("config").value_name("CONFIG").help("File with configuration").takes_value(true),).get_matches();let config = Config::read(args.value_of("config").expect("Mandatory option config")).expect("Cann't read config file");use hyper::rt::{Future, Stream};let ctrl_c = tokio_signal::ctrl_c().flatten_stream().into_future().map(|_| ()).map_err(|e| {error!("Cann't get CTRL+C signal: {}", e.0);e.0}).shared();let (cmd_send, cmd_recv) = tokio_channel::mpsc::channel(10);let http_server = Server::bind(&config.http).serve(MakeServiceCmd {cmd_send: cmd_send.clone(),}).with_graceful_shutdown(ctrl_c.clone().map(|_| ())).map_err(|e| error!("server error: {}", e));let mut rt = Runtime::new().expect("Cann't start tokio");if let Some(ping) = config.account.ping {let ping = tokio::timer::Interval::new_interval(std::time::Duration::from_secs(ping));rt.spawn(ping.map_err(|e| {error!("Ping error: {}", e);}).for_each(move |_| {cmd_send.clone().send(XmppCommand::Ping).map_err(|e| {error!("Ping command error: {}", e);}).map(|_| ())}).select(ctrl_c.clone().map(|_| ()).map_err(|e| error!("ping server error: {}", e)),).map(|_| ()).map_err(|_| ()),);}rt.spawn(http_server);let xmpp_join = std::thread::spawn(move || -> Result<(), failure::Error> {let recv = stop_receiver(cmd_recv, ctrl_c.clone().map(|_| ()));// Launch single-threaded runtimelet mut ctrt = current_thread::Runtime::new()?;let result = ctrt.block_on(xmpp_process(ctrl_c.clone(), recv, config.account));info!("Stopping xmpp thread");result});info!("Server started");rt.shutdown_on_idle().wait().expect("Shutdown error");info!("Server stopped");xmpp_join.join().expect("Join xmpp thread").expect("Result xmpp thread");
}fn deserialize_jid_map<'de, D>(deserializer: D,) -> Result<HashMap<String, xmpp_parsers::Jid>, D::Error>whereD: serde::Deserializer<'de>,{use serde::Deserialize;let s = HashMap::<String, String>::deserialize(deserializer)?;let size = s.len();s.into_iter().map(|(k, v)| (k, std::str::FromStr::from_str(&v))).take_while(|(_k, r)| r.is_ok()).fold(Ok(HashMap::with_capacity(size)), |res, (k, r)| match res {Ok(mut res) => match r {Ok(v) => {res.insert(k, v);Ok(res)}Err(e) => Err(e),},Err(e) => Err(e),}).map_err(serde::de::Error::custom)
### XMPP client daemon#### Sending messages```curl http://localhost:8083/ -H "X-XMPP-To: some@domain.org" -d "Test"```#### Sending messages to MUC```curl http://localhost:8083/ -H "X-XMPP-Muc: smac" -d "Test"```
tokio = "0.1"tokio-channel = "0.1"tokio-signal = "0.2"tokio-xmpp = "1.0.0"failure = "0.1.5"hyper = "0.12"toml = "0.5"serde = "1.0"serde_derive = "1.0"clap = "2.32"log = "0.4"env_logger = "0.6"xmpp-parsers = "0.13"minidom = "=0.10.0" # xmpp-parsers
# This file is automatically @generated by Cargo.# It is not intended for manual editing.[[package]]name = "MacTypes-sys"version = "2.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "aho-corasick"version = "0.7.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "ansi_term"version = "0.11.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "arc-swap"version = "0.3.11"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "arrayvec"version = "0.4.10"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "atty"version = "0.2.11"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "autocfg"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "backtrace"version = "0.3.15"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "backtrace-sys"version = "0.1.28"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "base64"version = "0.10.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "bitflags"version = "1.0.4"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "blake2"version = "0.8.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)","crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)","digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "block-buffer"version = "0.7.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)","byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)","generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "block-padding"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "byte-tools"version = "0.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "byteorder"version = "1.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "bytes"version = "0.4.12"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)","iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "case"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "cc"version = "1.0.35"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "cfg-if"version = "0.1.7"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "chrono"version = "0.4.6"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)","num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)","time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "clap"version = "2.33.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)","atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)","bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)","strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)","unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "cloudabi"version = "0.0.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "core-foundation"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "core-foundation-sys"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "crossbeam-deque"version = "0.7.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)","crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "crossbeam-epoch"version = "0.7.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)","lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)","scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "crossbeam-queue"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "crossbeam-utils"version = "0.6.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "crypto-mac"version = "0.7.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)","subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "derive-error"version = "0.0.4"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["case 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)","quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)","syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "digest"version = "0.8.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "encoding_rs"version = "0.8.17"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "env_logger"version = "0.6.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)","humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)","termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "error-chain"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "failure"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)","failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "failure_derive"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)","quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)","syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)","synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "fake-simd"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "fnv"version = "1.0.6"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "foreign-types"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "foreign-types-shared"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "fuchsia-cprng"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "fuchsia-zircon"version = "0.3.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)","fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "fuchsia-zircon-sys"version = "0.3.3"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "futf"version = "0.1.4"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","new_debug_unreachable 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "futures"version = "0.1.26"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "futures-cpupool"version = "0.1.8"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "generic-array"version = "0.12.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "h2"version = "0.1.18"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)","bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)","indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)","string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "hmac"version = "0.7.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)","digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "hostname"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "http"version = "0.1.17"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)","itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "httparse"version = "1.3.3"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "humantime"version = "1.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "hyper"version = "0.12.27"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)","h2 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)","http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)","httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)","iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)","rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)","time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)","tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)","tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)","want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "idna"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)","unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)","unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "indexmap"version = "1.0.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "iovec"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "ipconfig"version = "0.1.9"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)","socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)","widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)","winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "itoa"version = "0.4.3"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "jid"version = "0.5.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","minidom 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "keccak"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "kernel32-sys"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)","winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "lazy_static"version = "1.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "lazycell"version = "1.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "libc"version = "0.2.51"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "linked-hash-map"version = "0.5.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "lock_api"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)","scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "log"version = "0.4.6"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "lru-cache"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "mac"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "markup5ever"version = "0.7.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)","phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)","serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)","serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)","string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)","string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)","tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "matches"version = "0.1.8"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "memchr"version = "2.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "memoffset"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "minidom"version = "0.10.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","quick-xml 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "mio"version = "0.6.16"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)","fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)","iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)","lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)","net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)","slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "mio-uds"version = "0.6.7"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "miow"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)","net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)","ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "native-tls"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)","openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)","schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)","security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)","security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)","tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "net2"version = "0.2.33"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "new_debug_unreachable"version = "1.0.3"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "nodrop"version = "0.1.13"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "num-integer"version = "0.1.39"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "num-traits"version = "0.2.6"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "num_cpus"version = "1.10.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "opaque-debug"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "openssl"version = "0.10.20"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)","lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "openssl-probe"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "openssl-sys"version = "0.9.43"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)","rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)","vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "owning_ref"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "parking_lot"version = "0.7.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "parking_lot_core"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)","rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)","smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "pbkdf2"version = "0.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)","crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "percent-encoding"version = "1.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "phf"version = "0.7.24"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "phf_codegen"version = "0.7.24"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)","phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "phf_generator"version = "0.7.24"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)","rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "phf_shared"version = "0.7.24"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "pkg-config"version = "0.3.14"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "precomputed-hash"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "proc-macro2"version = "0.4.27"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "quick-error"version = "1.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "quick-xml"version = "0.13.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)","failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "quote"version = "0.3.15"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "quote"version = "0.6.12"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand"version = "0.5.6"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)","fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand"version = "0.6.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)","rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)","rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand_chacha"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand_core"version = "0.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand_core"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "rand_hc"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand_isaac"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand_jitter"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand_os"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)","fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)","rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand_pcg"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rand_xorshift"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rdrand"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "redox_syscall"version = "0.1.54"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "redox_termios"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "regex"version = "1.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)","memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)","regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)","thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)","utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "regex-syntax"version = "0.6.6"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "remove_dir_all"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "resolv-conf"version = "0.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "rustc-demangle"version = "0.1.14"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "rustc_version"version = "0.2.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "ryu"version = "0.2.7"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "sasl"version = "0.4.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)","hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)","pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)","rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)","sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "schannel"version = "0.1.15"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "scopeguard"version = "0.3.3"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "security-framework"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "security-framework-sys"version = "0.2.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)","core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "semver"version = "0.9.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",]
version = "0.1.0"dependencies = ["clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)","env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)","failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","minidom 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)","serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)","tokio-channel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)","tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)","tokio-xmpp 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)","toml 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)","xmpp-parsers 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "serde"version = "1.0.90"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "serde_derive"version = "1.0.90"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)","quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)","syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "serde_json"version = "1.0.39"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)","ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "sha-1"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)","digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "sha2"version = "0.8.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)","digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "sha3"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)","byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)","digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)","opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "signal-hook"version = "0.1.8"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "siphasher"version = "0.2.3"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "slab"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "smallvec"version = "0.6.9"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "socket2"version = "0.3.8"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "stable_deref_trait"version = "1.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "string"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "string_cache"version = "0.7.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","new_debug_unreachable 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)","phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)","precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)","string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)","string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "string_cache_codegen"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)","phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)","proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)","quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)","string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "string_cache_shared"version = "0.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "strsim"version = "0.8.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "subtle"version = "1.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "syn"version = "0.11.11"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)","synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)","unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "syn"version = "0.15.31"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)","quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)","unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "synom"version = "0.11.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "synstructure"version = "0.10.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)","quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)","syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)","unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tempfile"version = "3.0.7"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)","redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)","remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tendril"version = "0.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "termcolor"version = "1.0.4"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "termion"version = "1.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)","redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "textwrap"version = "0.11.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "thread_local"version = "0.3.6"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "time"version = "0.1.42"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio"version = "0.1.18"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)","tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)","tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)","tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)","tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)","tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-channel"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-codec"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-current-thread"version = "0.1.6"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-executor"version = "0.1.7"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-fs"version = "0.1.6"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-io"version = "0.1.12"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-reactor"version = "0.1.9"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)","parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)","slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)","tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-signal"version = "0.2.7"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)","mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)","signal-hook 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)","tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-sync"version = "0.1.4"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-tcp"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-threadpool"version = "0.1.13"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)","crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)","rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)","slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)","tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-timer"version = "0.2.10"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)","tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-tls"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-trace-core"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-udp"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)","tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-uds"version = "0.2.5"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)","mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)","tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "tokio-xmpp"version = "1.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","derive-error 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)","quick-xml 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)","sasl 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)","tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)","trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)","trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)","xml5ever 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)","xmpp-parsers 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "toml"version = "0.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "trust-dns-proto"version = "0.6.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)","failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)","smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)","socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)","tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)","tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)","tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)","url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "trust-dns-resolver"version = "0.10.3"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","ipconfig 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","resolv-conf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)","smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)","trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "try-lock"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "try_from"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "typenum"version = "1.10.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "ucd-util"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "unicode-bidi"version = "0.3.4"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "unicode-normalization"version = "0.1.8"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "unicode-width"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "unicode-xid"version = "0.0.4"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "unicode-xid"
source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "url"version = "1.7.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)","matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)","percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "utf-8"version = "0.7.5"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "utf8-ranges"version = "1.0.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "vcpkg"version = "0.2.6"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "vec_map"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "want"version = "0.0.6"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "widestring"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "winapi"version = "0.2.8"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "winapi"version = "0.3.7"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)","winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "winapi-build"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "winapi-i686-pc-windows-gnu"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "winapi-util"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "winapi-x86_64-pc-windows-gnu"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]name = "wincolor"version = "1.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)","winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "winreg"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "winutil"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "ws2_32-sys"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)","winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "xml5ever"version = "0.12.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","markup5ever 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)","time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "xmpp-parsers"version = "0.12.2"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)","blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","jid 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)","minidom 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)","sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)","sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)","try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",][[package]]name = "xmpp-parsers"version = "0.13.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)","blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)","digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","jid 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)","minidom 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)","sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)","sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)","sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",][metadata]"checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f""checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c""checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b""checksum arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841""checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71""checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652""checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799""checksum backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f106c02a3604afcdc0df5d36cc47b44b55917dbaf3d808f71c163a0ddba64637""checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6""checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e""checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12""checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e""checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d""checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591""checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7""checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb""checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c""checksum case 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e88b166b48e29667f5443df64df3c61dc07dc2b1a0b0d231800e07f09a33ecc1""checksum cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)" = "5e5f3fee5eeb60324c2781f1e41286bdee933850fff9b3c672587fed5ec58c83""checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4""checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878""checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9""checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f""checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980""checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa""checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71""checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4""checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b""checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c""checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5""checksum derive-error 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ec098440b29ea3b1ece3e641bac424c19cf996779b623c9e0f2171495425c2c8""checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c""checksum encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)" = "4155785c79f2f6701f185eb2e6b4caf0555ec03477cb4c70db67b465311620ed""checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a""checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46""checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2""checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1""checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed""checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3""checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1""checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b""checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba""checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82""checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7""checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b""checksum futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "62941eff9507c8177d448bd83a44d9b9760856e184081d8cd79ba9f03dd24981""checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4""checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592""checksum h2 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "85ab6286db06040ddefb71641b50017c06874614001a134b423783e2db2920bd""checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771""checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e""checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a""checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83""checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114""checksum hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4f2777434f26af6e4ce4fdcdccd3bed9d861d11e87bcbe72c0f51ddaca8ff848""checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e""checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d""checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08""checksum ipconfig 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "08f7eadeaf4b52700de180d147c4805f199854600b36faa963d91114827b2ffc""checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b""checksum jid 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "24e8a3f2ab860aa08074136e3144a2425e678d8823206e5adcc6145dc136503a""checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7""checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d""checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14""checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f""checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917""checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83""checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c""checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6""checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c""checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4""checksum markup5ever 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "897636f9850c3eef4905a5540683ed53dc9393860f0846cab2c2ddf9939862ff""checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08""checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39""checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3""checksum minidom 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "275024eea6c6ff4ace22f2750843831183785288eec1cff91a4e6b8898cf94f9""checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432""checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125""checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919""checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2""checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88""checksum new_debug_unreachable 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f40f005c60db6e03bae699e414c58bf9aa7ea02a2d0b9bfbcf19286cc4c82b30""checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945""checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea""checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1""checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba""checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409""checksum openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)" = "5a0d6b781aac4ac1bd6cafe2a2f0ad8c16ae8e1dd5184822a16c50139f8838d9""checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de""checksum openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)" = "33c86834957dd5b915623e94f2f4ab2c70dd8f6b70679824155d5ae21dbd495d""checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13""checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337""checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9""checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9""checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831""checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18""checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e""checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662""checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0""checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c""checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c""checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915""checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0""checksum quick-xml 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "22fcc48ecef4609b243e8c01ff4695d08ee0fc9d5bdbc54630e1a5fe8bb40953""checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a""checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db""checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9""checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca""checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef""checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b""checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0""checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4""checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08""checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832""checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071""checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44""checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c""checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2""checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252""checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76""checksum regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "559008764a17de49a3146b234641644ed37d118d1ef641a0bb573d146edc6ce0""checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96""checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5""checksum resolv-conf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b263b4aa1b5de9ffc0054a2386f96992058bb6870aab516f8cdeb8a667d56dcb""checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288""checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a""checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7""checksum sasl 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e457758c85b736bbad56dc099406cd2a9c19554cf81880dba7a51d092929e600""checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339""checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27""checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05""checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc""checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403""checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3""checksum serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "aa5f7c20820475babd2c077c3ab5f8c77a31c15e16ea38687b4c02d3e48680f4""checksum serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "58fc82bec244f168b23d1963b45c8bf5726e9a15a9d146a067f9081aeed2de79""checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d""checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68""checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d""checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a""checksum signal-hook 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "97a47ae722318beceb0294e6f3d601205a1e6abaa4437d9d33e3a212233e3021""checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac""checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8""checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be""checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7""checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8""checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b""checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423""checksum string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eea1eee654ef80933142157fdad9dd8bc43cf7c74e999e369263496f04ff4da""checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc""checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a""checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee""checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad""checksum syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b4cfac95805274c6afdb12d8f770fa2d27c045953e7b630a81801953699a9a""checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6""checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015""checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a""checksum tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "707feda9f2582d5d680d733e38755547a3e8fb471e7ba11452ecfd9ce93a5d3b""checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f""checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096""checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060""checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b""checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f""checksum tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "65641e515a437b308ab131a82ce3042ff9795bef5d6c5a9be4eb24195c417fd9""checksum tokio-channel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "530d0fb87416dd531600f7cccc438bb35c5b91883065c9e6dca7cdecee991cfa""checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f""checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443""checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e""checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af""checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926""checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce""checksum tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "dd6dc5276ea05ce379a16de90083ec80836440d5ef8a6a39545a3207373b8296""checksum tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fda385df506bf7546e70872767f71e81640f1f251bdf2fd8eb81a0eaec5fe022""checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119""checksum tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "ec5759cf26cf9659555f36c431b515e3d05f66831741c85b4b5d5dfb9cf1323c""checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6""checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c""checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3""checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92""checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445""checksum tokio-xmpp 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "952074d50e2a9907e714d28bb988232cc2f8c64542d3a97822e6d6afdd7a105f""checksum toml 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "87c5890a989fa47ecdc7bcb4c63a77a82c18f306714104b1decfd722db17b39e""checksum trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "09144f0992b0870fa8d2972cc069cbf1e3c0fda64d1f3d45c4d68d0e0b52ad4e""checksum trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8a9f877f7a1ad821ab350505e1f1b146a4960402991787191d6d8cab2ce2de2c""checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382""checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b""checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169""checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86""checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5""checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426""checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526""checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc""checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc""checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a""checksum utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7""checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737""checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d""checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a""checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3""checksum widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb""checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a""checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770""checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc""checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6""checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9""checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f""checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba""checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a""checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e""checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e""checksum xml5ever 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "32cd7ebf0203c620906230ce22caa5df0b603c32b6fef72a275a48f6a2ae64b9""checksum xmpp-parsers 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "58b4400e1ae0d246044db5fa7f2e693fdfe9cc6e8eaa72ef2a68c5dc1d3c96de""checksum xmpp-parsers 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5094cec449beca92f82ae4d7fe13cda058005849766d71b86c23e6217f61a357"